特征工程与 Pipeline
把原始字段转换为更能表达任务规律、且预测时确实可获得的特征。
前置知识
通俗直觉
模型只能利用被输入表示出来的信息。把原始表改成有意义的比率、时间窗口、交互项或类别表示,可能比直接更换模型更有帮助,但也可能带入错误假设。
特征工程需要同时回答“信息是否有用”与“预测时能否获得”,不能只追求训练分数提高。
特征工程包括构造、变换、编码、组合与必要的选择,使原始信息更适合任务和模型。它不同于无条件添加列,也不是把标签的另一种写法放进输入。
ColumnTransformer 可以按列分流处理,Pipeline 可以组织拟合边界;这些工具帮助实现规则,但特征是否合理仍需要领域解释与验证。
同样是消费 100 元,来自一次订单还是十次订单,可能对应不同模式。把总量与次数结合能形成更直接的问题描述;但“下个月总消费”在今天预测时并不可见,不能当成合法新特征。
一条新特征需要同时通过两项检查
用“过去 30 天消费额÷过去 30 天有效订单数”描述客单价,先要处理零订单的未定义情况,再确认全部记录在预测时已入库。只满足公式合法,并不表示时间边界合法。
若加入该列后,固定验证折的表现没有稳定改善,或它与原列几乎完全冗余,就没有充分证据仅凭名称直观而保留。下方列变换器只是组装工具,真正 fit 仍应限于训练数据。
核心原理
每个特征要写清原始来源、单位、时间窗口、缺失与异常处理。名称相同但计算口径不同,也会造成训练与推理不一致。
对数、周期、比率与交互变换表达不同结构。数值编码需要与模型假设匹配,不能把无序城市编号当成自然距离,或把零分母强制当成正常均值。
任何从数据学习的变换和特征选择,都要在训练或当前训练折内部拟合。反复看测试集决定保留哪一列,也属于模型选择泄漏。
评价应比较完整流程在相同协议下的收益、稳定性与采集成本。一个复杂聚合即使略微提高分数,也可能因为延迟、缺失或线上不可复现而不适合交付。
数学公式
特征必须在真实预测时可获得,不能含未来信息。
工作流程
- 明确输入、输出与评价方式
- 建立简单基线
- 实现并检查关键中间量
- 在验证数据上诊断和迭代
代码示例
Python
example.pyfrom sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
prep = ColumnTransformer([
("num", StandardScaler(), ["age", "income"]),
("cat", OneHotEncoder(handle_unknown="ignore"), ["city"]),
])- 先检查数据和张量形状
- 把会学习参数的步骤限制在训练数据内
不同列使用适合自己的变换,并由统一预处理器保持训练和预测一致。
应用场景
- 建立可靠训练流程
- 诊断模型行为
常见误区
- 只记接口而不检查数据边界
- 只看单次分数而忽略泛化
推荐学习资料
scikit-learn Examples
按算法和应用组织可运行示例,展示预处理、训练、评估与可视化流程。
scikit-learn Contributors · scikit-learn
资料笔记
Rules of Machine Learning
从指标、特征、管线和迭代方式总结构建真实机器学习系统的实践原则。
Martin Zinkevich · Google for Developers