在线工具集

特征工程完全指南:数据清洗 / 编码 / 缩放 / 选择

机器学习里有句老话——"垃圾进,垃圾出"(Garbage in, garbage out)。无论你用 XGBoost、LightGBM 还是 Transformer,原始数据如果含大量缺失、类别没编码、量纲混乱、噪声特征一堆,再强的模型也救不回来。Kaggle 顶级选手与普通参赛者的差距,90% 不在模型选择而在特征工程。好特征把"输入-标签"的关系显式化,让模型只需要做最后一步映射。本文系统梳理特征工程五大环节:数据清洗与异常值处理、类别特征编码、数值特征缩放、特征选择方法(Filter / Wrapper / Embedded),以及生产级 Feature Store 设计,最后给出一套从原始数据到模型可用矩阵的完整 checklist。

一、为什么特征工程是 ML 项目核心

很多新手把模型调参当作机器学习的核心,实际上模型选择带来的收益往往以"千分点"计算,而一个有信息量的新特征通常带来"百分点"级提升。CTR 预估场景里,从 LR 升级到 GBDT 提升 1% AUC 是大成功,而把"用户最近 7 天点击品类"这一个特征加进去,AUC 直接 +3%。Kaggle 历年冠军方案 70% 篇幅在讲特征工程,30% 才讲模型。

特征工程的本质是把领域知识翻译成模型语言。原始日志里"用户在凌晨 3 点下单",模型看不到这个含义;但如果你构造一个"hour_of_day"特征再 sin/cos 编码周期性,模型就能学到夜间订单更可能是欺诈。特征工程的好处还有可解释性——线性模型 + 良好特征比黑箱深度模型更容易上线、合规、调试。即使在 LLM 时代,结构化数据建模仍是工业主战场,特征工程仍是核心技能。

二、数据清洗:缺失值与异常值

缺失值处理三步走:第一步评估比例与机制——MCAR(完全随机缺失)、MAR(依赖其他变量)、MNAR(依赖未观测变量),不同机制处理策略不同。第二步选填充方式——删除(缺失比例 50% 以上的列直接删,或行级缺失少时删行)、统计量填充(数值用中位数抗异常值,类别用众数)、模型填充(KNN imputer、MICE 多重插补、训练专门预测模型)。第三步——保留缺失指示位(is_missing 这个 bool 特征本身常常携带强信息,比如用户不填收入往往收入低或抵触)。

异常值处理也分三步:检测(IQR 法 Q1-1.5IQR 与 Q3+1.5IQR、Z-score 大于 3、孤立森林 Isolation Forest、DBSCAN 聚类)、判断真伪(数据录入错误?真实极端值?)、处理(截断 winsorize 到 99 分位、log 变换压缩长尾、单独建模处理)。注意——金融风控场景的"异常"往往就是欺诈样本,不能简单删除,反而要重点学习。日期类异常需特别关注——unix 时间戳为 0 通常是默认值而非有效时间。

三、类别特征编码:One-Hot vs Target vs Ordinal

类别特征不能直接喂给模型,必须编码为数值。最简单是 One-Hot——每个类别一个 0/1 列。优点:无序、信息无损;缺点:维度爆炸(一万个类别就一万列),且对树模型并不最优(每次只能基于一列分裂)。适用场景——类别数小于 50,且类别之间无序。Pandas 的 get_dummies、sklearn 的 OneHotEncoder 都是常用工具。

Target Encoding(目标编码)——把每个类别替换为该类别下目标变量的均值。比如"城市"特征下,北京的转化率均值 5%,就替换为 0.05。优点:维度不增、对高基数特征友好、对树模型与线性模型都好;缺点:容易泄漏(用了未来的标签)、容易过拟合。必须用 K-fold 或留一法计算(每个 fold 用其他 fold 的均值),并加平滑(贝叶斯平滑)防止小样本类别噪声大。Ordinal Encoding 适合天然有序的类别(如学历:高中 1、本科 2、硕士 3、博士 4)。Frequency Encoding(按频次编码)对长尾类别有奇效。Hash Encoding 则把类别哈希到固定维度,适合超高基数(用户 id、设备指纹)。

四、数值特征缩放:标准化与归一化

很多模型对量纲敏感——线性回归、逻辑回归、SVM、KNN、神经网络都需要特征量纲一致,否则大量纲特征主导优化方向。常见缩放方法:StandardScaler(标准化,减均值除标准差,输出 0 均值 1 方差),最通用,对正态分布友好;MinMaxScaler(归一化,缩放到 0-1),适合像素图像或必须非负的场景;RobustScaler(用中位数和 IQR),对异常值不敏感;MaxAbsScaler(缩放到 -1 到 1,保留符号),适合稀疏数据。

非线性变换也很常见:log(对长尾分布如收入、价格压缩)、Box-Cox / Yeo-Johnson(自动找最优幂变换接近正态)、分箱 binning(连续值切成分桶,让模型学到非单调关系)。注意——所有缩放器必须在训练集 fit、然后 transform 训练集、验证集、测试集与线上数据,绝不能在全量数据上 fit 否则数据泄漏。树模型(XGBoost、LightGBM、随机森林)对单调变换不敏感,可不缩放,但其他模型几乎都需要。可以参考本站的 Pandas vs Polars 选择合适的处理工具,数据工程师路线图讨论了完整数据流水线设计。

五、特征构造:从领域知识到衍生变量

特征构造是特征工程价值最大的环节,最依赖领域知识。常见模板:(1)聚合统计——用户最近 7/30/90 天的订单数、消费总额、平均客单价;商品最近 N 天 CTR、转化率。这类滑窗特征对推荐与风控特别重要。(2)交叉组合——用户城市 × 商品品类、用户性别 × 时段。组合后能捕捉交互效应,深度学习里 Wide & Deep 模型核心也是把交叉特征塞给 wide 部分。(3)时间特征——把时间戳拆成 hour、day_of_week、is_weekend、is_holiday,再对周期性变量做 sin/cos 编码(hour_sin = sin(2*pi*hour/24))。

(4)文本特征——TF-IDF、word embeddings、句向量;2026 年大量场景直接用 embedding 模型(OpenAI、bge、m3e)把文本变 768 维向量,再做下游分类或检索。(5)地理特征——经纬度转 geohash、距离 POI(地铁、商圈),LBS 业务必备。(6)外部数据 join——用户所在城市的 GDP、PM2.5、节假日,往往一加显著提升。特征构造没有银弹,靠对业务的理解;最好的特征工程师是同时懂业务和懂模型的人。

六、特征选择:Filter / Wrapper / Embedded

特征过多会带来三个问题:训练慢、过拟合风险、可解释性差。特征选择三大流派:Filter(过滤式)——基于统计指标筛选,不依赖模型。常用:方差过滤(删常量列)、卡方检验(类别 vs 类别)、互信息(任意类型)、皮尔森相关系数(数值 vs 数值)。优点是快、独立于模型;缺点是忽略特征间交互。

Wrapper(包装式)——把特征子集喂给模型评估表现,前向选择 / 后向消除 / RFE 递归特征消除。效果好但慢,特征多时不实用。Embedded(嵌入式)——模型训练过程内置特征选择,最常用:L1 正则化(LASSO,自动把不重要特征系数压到 0)、树模型的 feature_importance(基于分裂增益)、SHAP value(更精细的全局与局部归因)。生产实践 90% 的场景用 Embedded 法——XGBoost 训完看 importance,删掉低重要性特征再重训,简单有效。SHAP 值近年成为黄金标准,既能做特征选择又能解释单个预测。

七、Feature Store:从离线到在线一致

当模型从一个变成几十个,特征工程的工程化挑战凸显——同一个"用户最近 7 天消费"特征可能被推荐、风控、营销三个团队各自实现,定义不一致;训练时用离线 Spark 算,线上推理时用 Java 重算一遍,逻辑漂移导致离在线效果差异巨大;新模型上线要重新跑特征流水线,迭代慢。Feature Store 解决这三个问题。

Feature Store 核心架构:离线层(数据仓库存历史特征,给训练用)+ 在线层(KV 存储如 Redis 存最新特征,毫秒级返回给推理服务)+ 注册中心(特征定义、所有者、血缘)+ 一致性保证(同一份计算逻辑同时写离在线)。开源主流:Feast(轻量级,最易上手)、Hopsworks(功能全)、Tecton(商业版 Feast,原作者团队);云厂商有 AWS SageMaker Feature Store、Databricks Feature Store、阿里 PAI、火山 ML 平台都自带。模型不到 5 个时可以不上 Feature Store;超过 10 个或多团队共享特征时几乎是必备。Feature Store 还能与 MLOps 流水线深度集成,构建端到端的 ML 工程平台。

八、特征工程 Checklist 与常见陷阱

一份生产级特征工程 checklist:(1)所有特征构造逻辑代码化,能从原始日志一键复现;(2)训练 / 验证 / 测试集严格按时间切分,避免未来数据穿越(最常见的 bug);(3)所有 transformer fit 只用训练集,prevent 数据泄漏;(4)特征文档化——每个特征写明含义、计算逻辑、更新频率、负责人;(5)数据版本与代码版本同步管理(DVC、LakeFS);(6)线上线下一致性监控——每日采样对比离在线特征分布。

常见陷阱:(1)Target Leakage——用了未来才能知道的信息,离线 AUC 0.99 上线效果稀烂,最常见来源是聚合统计窗口包含了"当前样本"。(2)Train-Serve Skew——训练用 pandas,推理用 Java/Go 重写,逻辑细节漂移(比如缺失值默认值不同)。(3)特征分布漂移——上线后用户行为变化,特征统计量与训练时分歧,必须监控并触发重训。(4)维度爆炸——盲目交叉特征生成几万列,模型反而退化,要配合特征选择。(5)忽略稀疏性——One-Hot 后 99% 是 0,记得用稀疏矩阵存储与稀疏 friendly 的模型。可以用本站的 JSON 格式化工具调试特征 schema,数据仓库选型讨论了离线特征存储底座。

常见问题

为什么特征工程比模型选择更重要?

工业界共识——好的特征 + 中等模型 通常胜过 烂特征 + 顶级模型。Kaggle 比赛 90% 的差距来自特征工程,模型本身在 XGBoost/LightGBM/CatBoost 之间切换提升只有几个千分点,而新加一个高信息特征可以提升几个百分点。原始特征往往与目标关系复杂,模型需要从噪声里学规律;好特征把关系显式化,模型只需做最后映射。这也是为什么资深算法工程师 70% 时间花在数据与特征上而不在炼丹。

缺失值应该删除还是填充?

看缺失比例与机制:少于 5% 可考虑删除行;超过 50% 缺失的列直接删;中间区间需要填充。数值列常用中位数(抗异常值)或均值;类别列用众数或新增"未知"类。更高级方法:用同 group 的统计量填充、用 KNN 或 MICE 多重插补、训练专门的填充模型。最重要的——给"是否缺失"建一个 bool 特征,因为缺失本身可能携带信息(用户没填收入与填了 0 含义截然不同)。

One-Hot 和 Target Encoding 怎么选?

类别少(小于 50 个唯一值)用 One-Hot,简单稳定,但维度爆炸时不适用。类别多(user_id、商品 id、邮编、城市等高基数特征)用 Target Encoding——把每个类别替换成该类别下目标变量的均值。Target Encoding 对树模型尤其友好,但容易过拟合,必须配合 K-fold 或加噪声防泄漏。中等基数还可考虑 Frequency Encoding(替换为出现频次)、Ordinal Encoding(按某种顺序映射为整数)、Hash Encoding(固定维度哈希)。

StandardScaler 和 MinMaxScaler 选哪个?

默认用 StandardScaler——减均值除标准差,输出近似正态分布,对线性模型、神经网络、SVM、KNN 都友好。当数据有明确边界(如图像像素 0-255)或必须保证非负时用 MinMaxScaler 缩放到 0-1。数据有大量异常值时用 RobustScaler(基于中位数和 IQR),不受异常值影响。树模型(XGBoost、随机森林)对单调变换不敏感,可以不缩放,但其他模型几乎都需要。注意所有 scaler 必须在训练集 fit 然后 transform 验证测试集。

什么是 Feature Store,什么时候需要?

Feature Store 是统一管理特征的平台,解决三大问题:训练-推理一致(避免训练用一个版本计算线上又算一遍导致偏差)、特征复用(不同模型共享同一份特征定义)、在线低延迟(毫秒级取特征服务推理)。开源主流是 Feast、Tecton、Hopsworks,云厂商有 AWS SageMaker Feature Store、阿里 PAI Feature Store、Databricks Feature Store。模型数量少于 5 个不需要,达到几十个或多团队共享特征时几乎是必须。

相关工具