JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

特征工程:帮模型看见世界

模型从来看不到真实世界——它只看到你递给它的数字。特征工程就是挑选并塑造这些数字的手艺,让你关心的规律变得一目了然。

特征到底是什么

到现在你已经知道,一个 模型 是从 数据集 中学习的。但模型从不接触真实世界——它看到的永远只是一行数字。这一行里每一个可度量的属性就是一个特征:模型能读取的一列。预测房价时也许会用到面积、卧室数量、到最近车站的距离。每一项都是一个 特征;它们合在一起,构成了模型真正吃进去的输入向量。

关键在于,世界并不是以数字的形式到来的。一个时间戳、一个城市名、一段文字、一张照片——它们本身都不是特征。必须有人决定怎么把它们变成数字,而这个决定悄悄地划定了模型究竟能注意到什么。模型只能找出那些在「翻译成特征」之后仍然存活下来的规律。在这次翻译中被你丢掉的东西,就永远丢掉了,无论算法多么聪明。

塑造特征:编码与缩放

第一项真正的工作,是把杂乱的现实变成干净的列。像「城市 = 东京 / 大阪 / 京都」这样的类别并不是数字——如果你只是把它们标成 1、2、3,模型就会错误地以为京都是东京的三倍。独热编码解决了这个问题:给每个类别一列各自的是/否。先分清类别型与数值型特征的区别,你才知道某一列究竟该用哪种处理。

数值型特征带来一个更微妙的问题:量纲。假设一列是年龄(0–100),另一列是年收入(0–1,000,000)。对一个基于距离的方法来说,收入会把年龄压得无足轻重——纯粹因为它的数字更大,而不是因为它更重要。特征缩放,作为归一化与标准化的一种,把每个特征放到可比的尺度上,让模型按相关性而非单位的偶然大小来权衡它们。

# standardize a column: center, then divide by spread
z = (x - mean(x)) / std(x)

# fit mean/std on TRAIN only, then reuse on test
mean, std = fit(x_train)
x_train = (x_train - mean) / std
x_test  = (x_test  - mean) / std   # same numbers, not refit
只用从训练集学到的统计量来做标准化——在测试数据上重新拟合会泄露信息。

维度灾难

人们很容易以为特征越多越好——把一切都喂给模型,让它自己去理清。现实却会狠狠地反推回来。随着特征(维度)数量增加,数据所栖身的空间会爆炸式膨胀,而你那固定数量的样本在其中变得越来越稀疏。这就是维度灾难

想象 100 个点沿一条 1 米的线铺开:很紧凑,大约每厘米一个。把同样的 100 个点铺到 1 米见方的正方形里,它们就稀疏了;铺进 1 米的立方体,它们几乎彼此孤立。在高维空间里,几乎每个点都离其他所有点都很远,「邻近」失去了意义——而这恰恰是基于距离和近邻的方法所依赖的。更多的列可能意味着更少的信号,而不是更多。

还有一个很实际的后果。每多一个特征,就给了模型多一个可拨弄的旋钮、多一条去拟合噪声而非信号的途径——直接喂养了过拟合。一条粗略的经验法则是:要填满一个高维空间,你需要的样本量会暴增,而你通常没那么多。少而精的特征,往往胜过一大堆弱特征。

降维:留下要紧的东西

如果维度太多有害,自然的应对就是把它们压缩。降维把许多特征挤压成少数几个,力求尽量保留有意义的变化、同时丢掉冗余。最著名的技术是 主成分分析(PCA):它找出数据变化最剧烈的那几个方向,然后只用这少数几个方向来重新描述每个点。

想象给一张漂浮在三维空间里的平整纸片拍照。这张纸其实是二维的;第三个维度几乎不携带信息。PCA 会自动找到那个平面,让你每个点存两个数字而不是三个,几乎毫无损失。真实数据很少这么干净,所以降维是一笔交易:你接受损失一点细节,换来一个更小、更少噪声、训练更快的表示。

手工特征 vs. 学到的表示

几十年来,上面讲的一切就是*那份*工作:熟练的人手工打造特征,而一个模型成败的关键,通常在于特征而非算法。然后深度学习改写了游戏规则。只要数据足够,一个深度网络就能直接从原始输入——像素、音频采样、字符——中学出自己的特征,靠的是表示学习。靠前的层发现边缘,靠后的层把它们组合成形状和物体,整个过程中没有任何人命名过哪怕一个特征。

这些学到的特征常常以嵌入的形式存在:一个稠密向量,相似的东西彼此靠近,是被发现出来的而非被设计出来的。这确实强大,已经为图像、音频和文本免去了大量手工特征工程。但别把它当成天上掉的馅饼。学到的特征需要大量数据和算力,难以解释,还可能悄悄抓住错误的线索——比如靠认出背景里的雪,来把图片分类成「狼」。

那到底该用哪种?在表格类的中小规模数据上——也就是大多数商业问题——配上经典模型的精心特征工程依然胜出,而它仍然是以数据为中心的 AI的核心。在大规模的原始感知数据上,学到的表示则占据主导。诚实的总结是:深度学习挪动了特征工作,而非废除了它。挑选输入、清洗它们、决定模型被允许看见什么,依旧是人的判断——也依旧是大部分真实收益藏身之处。