【问题标题】:How to use Cross-Validation after transforming features转换特征后如何使用交叉验证
【发布时间】:2021-08-27 19:18:24
【问题描述】:

我有分类值和非分类值的数据集。 我将 OneHotEncoder 应用于分类值,将 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。 我应该只拟合数据,还是只转换数据,还是第三种?

【问题讨论】:

  • 你应该将你的特征转换和模型包装在一个pipeline(首选方式)中;或者像我显示 here 那样手动执行(请记住,cross_val_score 不会随机播放数据,这可能是个问题)。

标签: python machine-learning scikit-learn cross-validation


【解决方案1】:

desertnaut 已经在他的评论中取笑了答案。我将只是解释和完成:

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

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

使用上述定义,您可以将转换和分类器包装在 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)

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

如果您想详细了解Pipeline 的用法,请查看documentation

【讨论】:

  • 所以归根结底,CV 中的训练数据会被拟合和转换,而 CV 中的测试数据只会被转换,对吧?因为,我在文档中找不到相关信息
  • @taga 是的,正确的。在本节here 中,您可以在标题为使用保留数据的数据转换 的段落中找到使用Pipeline 模仿行为的示例。
  • 干得好(没有时间自己写答案)。补充说明:之前打乱数据总是一个好习惯,因为矛盾的是cross_val_score(与 scikit-learn 中的其他 CV 功能相反)不会这样做(甚至不包含选项);有关这如何损害或扭曲性能的示例,请参阅自己的答案 hereherehere cc @taga
猜你喜欢
  • 2013-11-08
  • 2016-02-11
  • 2023-03-26
  • 2013-05-29
  • 2015-11-13
  • 2020-07-10
  • 2020-03-28
  • 1970-01-01
  • 2019-10-26
相关资源
最近更新 更多