我使用Scikit学习管道对象,因为我有一系列要执行的任务(上采样,特征选择,分类)。我的上采样方法是自定义方法,这意味着我必须为管道实现自定义转换器。
变压器必须具有变换和拟合方法。当然我只想对训练数据进行上采样,而不是测试数据。这是否意味着我只需要实现fit方法而不是变换方法(对传递给fit方法的数据集进行上采样)?据我了解,转换方法适用于训练和测试集......
答案 0 :(得分:3)
scikit-learn变换器不能更改样本数量,这在API中不受支持 - 请参阅http://scikit-learn.org/stable/modules/generated/sklearn.base.TransformerMixin.html#sklearn.base.TransformerMixin.fit_transform - 注意X,y和X_new的维度。另外,请注意它们只返回X而不是y - 这意味着如果您更改X维度,它将不再匹配y维度。
实现这一目标的一种方法是在管道外运行 - 生成用于培训的新样本并将其放入管道,并且不生成用于测试的新样本。但它不会起作用,例如交叉变换。
为了使其适用于交叉验证和模型选择,您需要一个自定义Pipeline类,它支持更改n_samples的变换器。例如,可以在imbalanced-learn包中找到实现:请参阅here。检查此包 - 如果您需要进行上采样,那么您的上采样方法可能已在不平衡学习中实现。