Scikit-Learn中的特征工程:KDnuggets速查表
内容提要
早期scikit-learn常见错误是预处理在交叉验证前泄露验证集数据。将特征工程纳入Pipeline,各步骤仅用训练数据拟合,可避免泄露。常用组件有ColumnTransformer、make_column_selector、SimpleImputer、OneHotEncoder和TargetEncoder;set_output与get_feature_names_out便于查看结果,GridSearchCV可一并调优预处理参数。
延伸解读
为什么特征工程必须放进Pipeline
文章指出,早期常见错误是在交叉验证前单独进行预处理,导致验证集数据泄露,使交叉验证分数虚高。将特征工程纳入Pipeline后,每个步骤仅用训练数据拟合,模型评估更真实。这强调了Pipeline不仅是代码组织工具,更是避免数据泄露的关键实践。
常用组件及其实际作用
ColumnTransformer和make_column_selector能按数据类型自动选择列,避免手动拆分;SimpleImputer配合add_indicator=True可保留缺失模式信息;OneHotEncoder的handle_unknown="ignore"能防止预测时因未知类别崩溃;TargetEncoder适用于高基数类别特征。这些组件是构建稳健预处理流程的基础。
调试与调参的实用技巧
set_output(transform="pandas")和get_feature_names_out()能快速查看Pipeline生成的特征,尤其当ColumnTransformer和PolynomialFeatures将列数大幅扩展时。GridSearchCV可将预处理参数(如插补策略)与模型超参数一起调优,实现端到端优化。这些方法提升了工作流的透明度和效率。
Q&A
在scikit-learn中,为什么特征工程必须放在Pipeline里?
因为如果预处理在交叉验证之前进行,验证集的数据会泄露给模型,导致交叉验证分数虚高,无法反映模型在新数据上的真实表现。将特征工程放入Pipeline后,每个步骤仅用训练数据拟合,从而避免数据泄露。
ColumnTransformer和make_column_selector在特征工程中有什么作用?
ColumnTransformer用于对数值列和类别列分别进行不同的预处理,而无需手动拆分数据框。make_column_selector允许按数据类型自动选择列,这样新增列时无需修改Pipeline。
处理缺失值时,SimpleImputer的add_indicator参数有什么好处?
设置add_indicator=True可以添加指示变量来标记缺失值,因为缺失模式本身可能包含有用信息,有助于模型学习。
OneHotEncoder的handle_unknown='ignore'参数解决了什么问题?
它避免了在预测时遇到训练集中未出现的类别而导致程序崩溃,通过忽略未知类别使模型能继续运行。
什么时候应该使用TargetEncoder而不是OneHotEncoder?
当类别特征的基数很高,以至于独热编码变得不合理时,TargetEncoder是更好的选择。
如何查看Pipeline构建后的特征名称和输出?
可以使用set_output(transform='pandas')和get_feature_names_out()来快速查看Pipeline实际构建的特征,这在ColumnTransformer和PolynomialFeatures等步骤将列数大幅扩展时尤其有用。
GridSearchCV如何与预处理步骤结合进行超参数调优?
一旦预处理步骤被包含在估计器中,就可以像其他超参数一样调优预处理参数,例如插补策略,并与正则化强度等一起在GridSearchCV中搜索。