我正在寻找避免数据泄漏的最佳实践。我有 1 个需要模式插补的特征。模型是 XGBoost Classifier。
这些是我计划的步骤:
现在,我的疑问是:可以对整个训练集进行模式插补,然后进行RandomSearchCV吗?我认为数据泄漏仅适用于使用看不见的测试集进行评估时。 或者我应该在 RandomSearchCV 的每个折叠中执行插补以避免数据泄漏?如果是这样,我该怎么做?我看到了 Sklearn pipelines,但我不知道如何将模式插补仅应用于我需要的特定功能
提前谢谢您!
P.s.如果有任何错误,也欢迎对所有步骤进行反馈!
独立对训练集和测试集应用模式插补
一般来说,在进行预测时(包括在测试集上),您可以只使用一个样本。在这种情况下,这对于测试集来说是完全允许的(与训练集不同),模型将无法估算缺失值,因为没有什么可继续的。因此,我认为更稳健的方法是在训练集上拟合一个输入器,并使用该拟合的输入器来处理测试集中的 NaN。
sklearn
管道可以自然地处理这个问题,因为一旦您将管道拟合到训练数据上,拟合的估计器就可以无缝应用于任何其他集合。
可以对整个训练集进行模式插补,然后进行RandomSearchCV吗? [...] 或者我应该在 RandomSearchCV 的每个折叠中执行插补以避免数据泄漏?
在分割之后学习插补意味着训练数据无法考虑验证样本。这使得验证集“不可见”,因此您可以更实际地衡量泛化性能。
我不知道如何将模式插补仅应用于我需要的特定功能和
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)
最终的管道:内部框是列转换器,它有一个用于指定列的左分支和一个传递其他列的右分支。回归器位于列变换器之后,对估算数据进行操作。