1. 特征工程导论

1.1 到底什么是特征工程?

先问个问题:你给模型喂的是什么?

很多人觉得,机器学习嘛,把数据丢进去,调个参,模型就自己学出来了。我刚开始做项目时也这么想。结果呢?模型跑出来一团糟,准确率还不如瞎猜。

后来我才明白——模型吃的不是原始数据,而是特征。特征工程,说白了就是把原始数据转换成模型能理解、能利用的形式。

我的定义:特征工程 = 从原始数据中提取、构造、选择对预测任务最有用的信息,并把它组织成模型喜欢的格式。

举个例子。你有一堆用户行为日志,里面全是时间戳、页面URL、点击坐标。模型看不懂这些。你得把它变成「用户是否在深夜访问」「访问页面数」「平均停留时长」——这才是特征。

1.2 特征工程在机器学习中的位置

我经常跟团队说一句话:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。

你想想看,一个烂特征配上最好的模型,能赢过一个好特征配上普通模型吗?我在Kaggle上见过太多次了——冠军方案往往不是模型最复杂的,而是特征做得最扎实的。

环节 对最终效果的影响 投入时间占比(我个人的经验)
数据采集与清洗 ★★★★★ 30%
特征工程 ★★★★★ 40%
模型选择与调参 ★★★☆☆ 20%
模型评估与部署 ★★☆☆☆ 10%

嗯,这里要注意:特征工程不是独立的一步。它贯穿整个ML流程——从数据理解开始,到特征构造、选择,再到模型迭代时反复调整。

1.3 特征工程的核心流程

我习惯把特征工程拆成四个阶段。每个阶段都有坑,我一个个说。

阶段一:数据理解与探索

拿到数据别急着写代码。先看看数据长什么样。

  • 数据类型:数值型?类别型?文本?时间序列?
  • 数据质量:缺失值多不多?有没有异常值?
  • 分布情况:是不是长尾?有没有偏态?

我曾经接手过一个项目,对方说数据很干净。我一跑describe(),发现某个特征99%都是0,剩下1%是缺失值。这要是直接丢进模型,后果可想而知。

阶段二:特征构造

这是最花心思的地方。从原始数据里「变」出新特征。

  • 数值特征:做对数变换、分箱、交叉相乘
  • 类别特征:独热编码、标签编码、目标编码
  • 时间特征:提取星期几、是否节假日、距上次事件的天数
  • 文本特征:TF-IDF、词向量、主题模型

我的小技巧:构造特征时,多问问自己「这个特征对业务意味着什么?」。比如预测用户是否会付费,那「用户最近7天登录次数」就比「用户ID」有意义得多。

阶段三:特征选择

特征不是越多越好。我见过有人一口气造了500个特征,结果模型过拟合得一塌糊涂。

常用的方法:

  1. 过滤法:算相关系数、卡方检验、互信息
  2. 包裹法:递归特征消除(RFE)
  3. 嵌入法:L1正则化、树模型的特征重要性

阶段四:特征变换与缩放

这一步很多人会忽略。但模型对尺度很敏感。

  • 标准化:减去均值,除以标准差。适合正态分布的数据。
  • 归一化:缩放到[0,1]区间。适合有边界的数据。
  • 幂变换:Box-Cox、Yeo-Johnson,处理偏态分布。

避坑指南:我曾经在时间序列预测中,不小心用未来数据做了标准化。结果模型在验证集上表现完美,上线后直接崩了。切记:所有变换都只能用训练集的数据来拟合,再应用到验证集和测试集。

1.4 特征工程的思维框架

做特征工程,光有技术不够,还得有思路。我总结了一个四步思维框架,每次做特征工程前都过一遍。

特征工程思维框架 业务理解 数据探索 分布、缺失、异常 特征构造 变换、组合、提取 特征选择 过滤、包裹、嵌入 迭代验证 A/B测试、效果反馈 反馈到业务理解

这个框架的核心就一句话:从业务出发,回到业务验证。别为了造特征而造特征。我见过有人花了两周时间构造了100多个特征,结果上线后业务方说「这个特征我们根本采集不到」——白干了。

1.5 一个简单的例子:房价预测

光说不练假把式。我们拿房价预测来走一遍流程。

原始数据长这样:

| 面积(㎡) | 卧室数 | 建造年份 | 位置     | 价格(万) |
|----------|--------|----------|----------|----------|
| 120      | 3      | 2010     | 朝阳区   | 850      |
| 85       | 2      | 2015     | 海淀区   | 620      |
| 200      | 4      | 2005     | 西城区   | 1200     |

我们能做什么特征?

  • 面积平方:房价和面积往往不是线性关系,大房子单价可能更高
  • 房龄:当前年份 - 建造年份
  • 位置编码:按区域平均房价做目标编码
  • 每平米价格:面积和价格的交叉特征(但注意数据泄露)
  • 卧室密度:卧室数 / 面积,反映户型紧凑程度

经验之谈:构造特征时,先做10个精的,别做100个糙的。我每次迭代都只加3-5个新特征,然后看模型效果有没有提升。没提升就砍掉,别舍不得。

1.6 总结

特征工程不是什么高深莫测的东西。它就是帮模型把话说清楚。你给模型讲得越明白,它学得越快、越准。

记住三个要点:

  1. 理解业务:不懂业务,特征就是瞎造
  2. 从简到繁:先做基础特征,再慢慢加复杂的
  3. 反复验证:每个特征都要问自己「它真的有用吗?」

嗯,这一章就到这里。后面的章节我们会深入每个环节,手把手带你做特征工程。到时候我会把踩过的坑、试过的错,都一一讲给你听。