如何在转换要素后使用交叉验证

人气:69 发布:2023-01-03 标签: python scikit-learn machine-learning cross-validation

问题描述

我有包含类别值和非类别值的数据集。 我对类别值应用了OneHotEncode,对连续值应用了StandardScaler。

transformerVectoriser = ColumnTransformer(transformers=[('Vector Cat', OneHotEncoder(handle_unknown = "ignore"), ['A', 'B', 'C']),
                                                        ('StandardScaler', StandardScaler(), ['D', 'E'])],
                                          remainder='passthrough') # Default is to drop untransformed columns
现在我想要对我的模型进行交叉验证,但问题是,我应该转换我的功能吗?我如何做到这一点? 我的意思是,我需要转换我的数据,因为这是处理绝对值的唯一方法。 我知道我应该fit_transform我的训练数据,并且只transform我的测试数据,但我如何在交叉验证中管理它?

目前,我是这样做的:

features = transformerVectoriser.fit_transform(features)

clf = RandomForestClassifier()
cv_score = cross_val_score(clf, features, results, cv=5)
print(cv_score)
但我认为这是不正确的,因为fit_transform将应用于测试文件夹和训练文件夹,而它应该是fit_transform在训练集中,transform在测试集中。 我应该只适合数据,还是只转换数据,或者第三种方式?

推荐答案

ashtnaut已经在他的评论中调侃了答案。我将只解释和完成:

当您想要与估计器一起交叉验证多个数据处理步骤时,最好的方法是使用Pipeline对象。根据user guide,Pipeline具有多用途,其中安全:

管道通过确保使用相同的样本训练变压器和预测器,帮助避免在交叉验证中将测试数据中的统计数据泄漏到训练的模型中。

使用上述定义,您将以以下方式包装转换和分类器:Pipeline

from sklearn.pipeline import Pipeline


pipeline = Pipeline([
    ('transformer', transformerVectoriser),
    ('classifier', clf)
])

管道中的步骤现在可以一起交叉验证:

cv_score = cross_val_score(pipeline, features, results, cv=5)
print(cv_score)

这将确保管道中的所有转换器和最终估计器都只根据训练数据进行拟合和转换,并且只在每次迭代中对测试数据调用Transform和Forecast方法。

如果您想阅读有关Pipeline用法的更多信息,请查看documentation。

15