本节摘要:预处理让特征"可用",特征工程让特征"更有信息"。本节讲解特征构造、选择与降维三条主线,辅以一张决策示意图,帮你在数据给足信息的前提下,把对建模有帮助的信号喂得更准。
阅读完本节,你应当能够:
机器学习的深层逻辑是"你给的特征决定了模型的天花板"。预处理只是把已有字段修整齐,而特征工程是要造出原本不存在的字段,把对任务有用的信号翻译成模型更容易消化的形式。两个模型、同样的超参,一个把"用户注册距今天数"直接用,另一个拆出"是否新客""活跃周期"等维度,结果往往差一个档次——不是超参的功劳,是特征给得聪明。
这也是为什么很多竞赛项目里,冠军往往不是把模型推到最复杂,而是在特征上比其他人多想了一层。一个朴素贝叶斯配上精心构造的特征,常能赢过盲目堆深度的神经网络——信号的质量压过了模型的容量。
最朴素的构造是交互特征与多项式特征:model 大小 = 长 × 宽,这类相乘能表达"面积"这种组合语义;年龄 × 收入能描出"有能力又有意愿"。但多项式要克制——维数会指数膨胀,稀疏又交叉,容易过拟合。
一个更符合现实的做法,是从业务里找不变量。比如风控里,"负债收入比"比"负债""收入"两个原始列都更能刻画信用;推荐里,"距上次点击的时长"比"上次点击时刻"更本质。构造特征的判据一句话:它是否暗示了一个与目标直接相关的机制,而不是数值上碰巧相关。
举一个电商流失预警的具体例子。原始特征里有一栏"上次登录日期",模型也能用它,但它不是好特征——因为"日期"这个绝对量跟用户流失的因果方向无关。更科学的做法是把它换算成距今天数(距上次登录已 3 天还是 30 天),再进一步离散化成"是否超过一周未登录""是否季度性高活跃后突然失联"。这样两三个新特征,往往比给模型加深一层更能抓回流失用户。类似地,"注册时长 × 月均下单"这种组合特征,比单独看任何一列更能描出高价值用户的轮廓。构造时守住"每个新特征都能讲清背后的业务机制"这条纪律,你就不会掉进纯堆数字的坑。
特征多到一定程度,风险反而上浮:维度诅咒、算力浪费、以及大量无关特征稀释模型判断。选择有三类:
三者性价比差异明显,可以用一张表快速对照着选:
| 策略 | 计算开销 | 是否考虑特征组合 | 适合场景 |
|---|---|---|---|
| 过滤式 | 极低 | 否,单变量独立看 | 开头粗筛几千个特征 |
| 包裹式 | 高 | 是,反复评估子集 | 特征少、算力够、求极致 |
| 嵌入式 | 中 | 部分(在目标里顺带学) | 绝大多数生产任务的默认 |
当特征里有大量强相关或近似线性结构,降维能压缩:PCA 找方差最大的正交投影,能把几百维压到几十维,常用于后续距离型模型或可视化诊断。代价是可解释性——压缩后的主成分不再对应原始含义。
降维不是万能药。我在生产里更常见的是:先做嵌入式选择砍到可控规模,必要时再上轻量 PCA 诊断。一上来就 PCA,往往会把可解释的业务特征打散,后期上线解释性要求一高就抓瞎。
# 示意:嵌入式选择 + PCA 诊断的组合用法 from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA X_scaled = StandardScaler().fit_transform(X_train) pca = PCA(n_components=0.95, svd_solver="full") # 保留95%方差 X_low = pca.fit_transform(X_scaled) print(X_low.shape[1], "个主成分保留了原始", X_scaled.shape[1], "维中95%方差")
一个小提醒:跑 PCA 前一定要先标准化。PCA 找的是方差最大的方向,如果某个字段的量级比其他字段大一千倍,它就会把那个方向误当成"最有信息"的方向,结果你这个投影就被一个量纲主导了。很多初学者在这里翻车——不标准化直接 PCA,出来的主成分第一维几乎就是"数值最大的那个字段",毫无洞察可言。
特征工程段头乐观,落回现实却常被忽视:你构造的特征,在未来真实预测那一刻是否可得。比如"本单退单率"在预测时根本还没发生——如果在训练时用它,是经典的时序泄漏,模型看起来神准、上线即废。构造完每造一个特征,都问一句"预测时能不能拿到真值"。
⚠️ 常见坑:为了提分造了一堆"上帝视角"特征(用了未来信息或标签逆推),验证集分数一路飙高,上线全垮。特征的可得出性审查要当作必要条件而非加分项。
特征备好后,如何把这份数据切成可做实验的三份,是下一节的主题。