Feature Engineering
特征工程利用领域知识将原始数据转换为模型更容易学习的输入。涵盖核心技术、数据泄漏陷阱、用途和代码。
特征工程是利用领域知识和数据,创建、转换并选择输入变量(即特征)的过程,让机器学习模型以这些变量为依据进行学习。原始时间戳可以转换为小时和星期几;一组银行卡交易可以转换为客户过去 30 天的消费情况;一次出行的距离和时长可以转换为速度。选择合适的特征能让简单模型捕捉到原本可能遗漏的模式,这在表格数据和时间序列数据中尤为重要,因为模型只能使用提供给它的列。深度学习模型可以从原始图像、音频和文本中自行学习特征,因此在这些领域,特征工程逐渐转向数据准备和基于模型输出构建特征。
常见技术#
- 缩放和归一化:将特征标准化为均值为零、方差为一,可避免单位较大的特征在基于距离的模型和基于梯度的训练中占据主导;对收入或价格等偏态数值进行对数变换则可以压缩数值范围。
- 类别编码:独热编码会将颜色等类别转换为二进制列;目标编码则会将每个类别替换为该类别对应的目标均值,并在独立的数据折上计算,避免编码泄露每一行自身的标签。
- 比率和交互项:债务收入比、每平方英尺价格和身体质量指数,会将两个原始数值组合成真正影响结果的量。
- 日期和时间特征:小时、星期几、月份和节假日标记可以揭示周期性;对小时使用正弦和余弦编码,则能让 23:00 与 00:00 相邻。
- 滞后值和滚动窗口:此前的数值、滚动均值和近期窗口中的计数,可以为模型提供传感器、账户或产品的近期历史记录。
- 分箱:将连续数值划分到不同区间(例如年龄段)中,可以捕捉阶跃效应,并限制极端值的影响。
- 使用 PCA 降维:主成分分析会将许多彼此相关的特征压缩为少数几个互不相关的特征。
- 特征选择:过滤法会根据特征与目标之间的相关性或互信息对特征排序;包装法会使用模型测试特征子集;L1 正则化等嵌入法则会在训练过程中移除特征。
比例特征说明了这种方法为何有效。深度受限的决策树一次只能按一个特征进行划分,因此仅凭距离和持续时间,很难准确近似“平均速度高于 90 km/h”这一规则;而计算出速度后,就能一次准确划分:
import numpy as np
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
# 1,000 trips: raw distance (km) and duration (h); label = average speed above 90 km/h
rng = np.random.default_rng(0)
distance = rng.uniform(10, 300, 1000)
hours = rng.uniform(0.5, 4.0, 1000)
y = (distance / hours > 90).astype(int)
raw = np.column_stack([distance, hours])
engineered = (distance / hours).reshape(-1, 1) # domain knowledge: speed = distance / time
tree = DecisionTreeClassifier(max_depth=2, random_state=0)
for name, X in [("Raw distance and duration", raw), ("Engineered speed", engineered)]:
print(f"{name}: accuracy {cross_val_score(tree, X, y, cv=5).mean():.3f}")使用相同的深度为 2 的树,交叉验证准确率从原始距离和持续时间特征的 0.861 提升到工程化速度特征的 1.000,因为距离—持续时间空间中的对角线边界变成了速度上的单一阈值。
无数据泄漏地验证特征#
只有在预测时已知某个特征的值,这个特征才有效。使用“取消后的那个月内的支持电话数量”或在整个数据集上计算的目标编码的客户流失模型,在测试中得分很高,却会在生产环境中失效;这是一种数据泄漏。因此,所有带有学习所得参数的变换(例如缩放器均值或类别编码)都只在训练折上拟合,正如 scikit-learn 管道会自动执行的那样;每个新特征只有在能提高交叉验证得分时才会保留。生产系统还必须按照训练时完全相同的方式计算每个特征,特征存储会通过向两者提供相同的特征定义来处理这一点。
计算机视觉中的特征工程#
传统计算机视觉依赖人工设计的特征,例如边缘图、SIFT关键点描述符和方向梯度直方图,然后由支持向量机等分类器进行分类。自 AlexNet 于 2012 年赢得 ImageNet 挑战赛以来,卷积神经网络已能从像素中学习自己的特征图,工程工作也转向了训练数据(通过数据增强)以及视觉模型的输出。Ultralytics SpeedEstimator根据YOLO26目标跟踪输出构建速度特征:轨迹达到五个位置后,它使用 meter_per_pixel 比例将首末位置之间的像素位移转换为米,再除以经过的时间,报告 km/h。
应用场景#
- 信用风险:贷款机构从原始账户记录中计算债务收入比、信用额度使用率以及距上次逾期还款的月数;这些特征比原始余额更能预测违约。
- 预测性维护:根据振动和温度数据流计算的滚动平均值、变化率和频带能量,能在任何原始读数达到警报阈值之前揭示正在发展的磨损。
- 欺诈检测:交易速度特征(例如过去一小时的刷卡交易次数)以及购买地点与持卡人常见位置之间的距离,可以区分欺诈和正常消费。
- 需求预测:零售模型会为每家门店和每种商品结合销售滞后值、滚动平均值、价格变化、促销标记和节假日指标。










