同一批 10 封邮件,四个特征的单特征准确率:命中营销词 0.900、感叹号个数 0.800、 长度 0.700、出现『附件』0.600。换一个特征,比换一个模型更有效。
上一节写了一个能跑的网络,这一节先别急着上模型——先看喂进去的是什么。
一、特征就是「换个角度看数据」
一封邮件本身是几百个字符,模型看不懂。要把它变成几个数。变的方式就叫特征工程。 Demo 试了四种角度:长度(几个字)、感叹号个数、命中几个营销词、有没有出现「附件」。 四个角度都是人想出来的,不是模型学出来的。 同一条数据,换一个角度,可分性完全不一样。 这就是为什么「特征工程」在传统机器学习里比模型选型更重要。
二、实测:四个特征排排坐
10 封邮件(5 封垃圾、5 封正常),每个特征扫一遍所有可能阈值,取最好的那一刀: 命中营销词 0.900(阈值 ≥ 1);感叹号 ≥ 3 是 0.800;长度 ≥ 7 是 0.700; 出现『附件』0.600——比瞎猜还差一点。 「长度」为什么不好用:我特意让正常邮件里也有长的(一条 30 字的会议通知), 垃圾邮件里也有短的(「免费领取!!!」只有 6 个字)。长度这个角度看过去,两类是混在一起的。 注意这几个准确率都是「在全部 10 封上挑最好阈值」得到的,是上限,不是泛化性能。 真实测试集上会掉——这正是第九章要解决的问题。
三、特征工程的三个动作
第一是构造:从原始数据里算出新的数(字数、标点比例、关键词命中数)。 第二是筛选:算一批特征,看哪个真管用,把没用的扔掉。十维里可能只有三维有用,剩下七维只会添乱。 第三是验证:拿掉一个特征重跑,看指标掉不掉。掉得多说明它重要,不掉说明可以删。 这个动作叫消融,本节没跑,下一章会用到。 这三件事都不需要写模型,但都会直接改变结果——所以训练师做得最多的其实不是调模型,是调特征和调数据。
四、动手 Demo:四个特征,谁真管用
10 封邮件,四个候选特征,每个特征把所有可能阈值扫一遍,取准确率最高的那一刀, 看哪个特征单独就能把两类分开。
feats = {u'长度': lambda s: len(s),
u'感叹号个数': lambda s: s.count(u'!'),
u'命中营销词': lambda s: sum(k in s for k in WORDS),
u'出现附件': lambda s: 1 if u'附件' in s else 0}
for thr in np.unique(v): # 扫所有可能的切点
a = H.acc((v >= thr).astype(int), y)
实跑输出:
--------------------------------------------------------------------
四个特征,哪个真管用
--------------------------------------------------------------------
特征 均值 最佳阈值 单特征准确率
---------------------------------------------
长度 14.70 ≥ 7.00 0.700
感叹号个数 0.90 ≥ 3.00 0.800
命中营销词 0.90 ≥ 1.00 0.900
出现『附件』 0.10 < 1.00 0.600
样本数 10 封(5 封垃圾、5 封正常)
单特征最高的是「命中营销词」,只用这一个就能到很高的准确率;
「长度」几乎没用——正常邮件也能很长。
这就是特征工程的全部意义:**换一个特征,比换一个模型更有效**。
注意每个特征的阈值都是扫全表挑出来的最好那一刀,
所以这几个准确率是「上限」,真实测试集上会掉。
四行准确率:0.900、0.800、0.700、0.600。 最高的是「命中营销词」,最低的是「出现『附件』」——它甚至低于瞎猜。 「出现『附件』」为什么这么差:5 封正常邮件里只有 1 封带附件,另外 4 封没有, 所以它只认得出那 1 封,其余全错。特征稀疏到几乎不出现,就等于没有。 「长度」0.700 也不高,因为数据是我特意造得两类长度交错的。 如果真实数据里垃圾邮件普遍更长,这个特征就会变有用——特征好不好用,取决于数据,不取决于特征本身。 阈值是扫全表挑的,所以这几个数是上限。真实做法要留出测试集,否则等于用答案挑参数。
30 秒实验
- 加一个特征「含链接」,看能不能超过 0.900。
- 把「长度」换成「长度除以 10 取整」,看准确率变不变(分段是否更稳)。
- 想一想:为什么「出现『附件』」这种特征在实际系统里也会被保留?
常见误区
- 「特征越多越好」——十维里可能只有三维有用,其余添乱。
- 「准确率高就说明特征好」——在 10 条样本上扫阈值,等于用答案挑参数。
- 「换模型比换特征快」——本例里换特征直接从 0.6 到 0.9。
自测三问(点开对答案)
1. 四个特征里哪个最有用、哪个最没用? —— 命中营销词 0.900 最有用,出现『附件』0.600 最没用。 2. 为什么「长度」这个特征不好用? —— 这批数据里两类长度交错,换角度看也分不开。 3. 特征工程有哪三个动作? —— 构造新特征、筛掉没用的、拿掉重跑做消融验证。特征从原始数据来,下一节讲怎么把原始数据弄到手。
- ☐ (本节完,下一节 2.1.5 数据处理知识:数据为王的时代必备)