RandomSearchCV 和数据泄露

问题描述 投票:0回答:1

我正在寻找避免数据泄漏的最佳实践。我有 1 个需要模式插补的特征。模型是 XGBoost Classifier。

这些是我计划的步骤:

  1. 将数据随机分割为 80% 训练集 - 20% 测试集
  2. 独立对训练集和测试集应用模式插补
  3. 在训练集上执行RandomSearchCV进行超参数调整
  4. 使用找到的最佳参数集在整个训练集上训练模型
  5. 在未见过的测试集上评估模型

现在,我的疑问是:可以对整个训练集进行模式插补,然后进行RandomSearchCV吗?我认为数据泄漏仅适用于使用看不见的测试集进行评估时。 或者我应该在 RandomSearchCV 的每个折叠中执行插补以避免数据泄漏?如果是这样,我该怎么做?我看到了 Sklearn pipelines,但我不知道如何将模式插补仅应用于我需要的特定功能

提前谢谢您!

P.s.如果有任何错误,也欢迎对所有步骤进行反馈!

performance ml
1个回答
0
投票

独立对训练集和测试集应用模式插补

一般来说,在进行预测时(包括在测试集上),您可以只使用一个样本。在这种情况下,这对于测试集来说是完全允许的(与训练集不同),模型将无法估算缺失值,因为没有什么可继续的。因此,我认为更稳健的方法是在训练集上拟合一个输入器,并使用该拟合的输入器来处理测试集中的 NaN。

sklearn
管道可以自然地处理这个问题,因为一旦您将管道拟合到训练数据上,拟合的估计器就可以无缝应用于任何其他集合。

可以对整个训练集进行模式插补,然后进行RandomSearchCV吗? [...] 或者我应该在 RandomSearchCV 的每个折叠中执行插补以避免数据泄漏?

在分割之后学习插补意味着训练数据无法考虑验证样本。这使得验证集“不可见”,因此您可以更实际地衡量泛化性能。

我不知道如何将模式插补仅应用于我需要的特定功能

ColumnTransformer

make_column_transformer
 用于选择性地将转换应用于不同的列。假设您想要估算名为 
feature_12
 的列,而其余列保持不变:

from sklearn.compose import make_column_transformer from sklearn.impute import SimpleImputer preprocessor = make_column_transformer( (SimpleImputer(strategy='mode'), ['feature_12']), remainder='passthrough', )
您可以链接估计器,并将生成的管道提供给 

sklearn

 兼容的 CV 方法。

from sklearn.pipeline import make_pipeline from sklearn.ensemble import HistGradientBoostingRegressor pipeline = make_pipeline(preprocessor, HistGradientBoostingRegressor()) search_results = RandomizedSearchCV( pipeline, ... ).fit(X, y)
最终的管道:

enter image description here

内部框是列转换器,它有一个用于指定列的左分支和一个传递其他列的右分支。回归器位于列变换器之后,对估算数据进行操作。

© www.soinside.com 2019 - 2024. All rights reserved.