前一文讲的是一些特征的基础处理方式,包括怎么降维、怎么处理脏数据等等。其实特征工程真正的难点是如何结合业务需求衍生出新的特征。结合业务需求讲的是利用专家经验来提取出数据里对结果影响更大的特征,往往是原有数据字段通过加减乘除等操作生成新的字段,这些字段在结合一些线性算法做训练的时候往往能起到提升模型效果的作用,接下来就简单介绍下特征衍生。
因为衍生特征这个方法是需要结合业务特点的,范围太广,所以本文就用一个例子来介绍。今天就用一份NBA比赛数据做例子吧,因为读者大部分是男同学,对于篮球应该比较熟悉,如果是妹子读者的话可以咨询下你的男朋友~
球员 | 投篮数 | 命中数 | 比赛场次 | 全明星 |
科比 | 800 | 400 | 500 | 否 |
乔丹 | 500 | 300 | 200 | 是 |
上面这份数据我就随便写两个球员哈(非黑),然后随便写了三个特征数据分别是投篮数、命中数、比赛场次,目标列就是是否是明星球员。现在要思考这样的问题,如果只用原始的这三个输入特征去做训练,信息量可能略显单薄。先拿“命中率”来讲,我们都知道在投篮比赛中命中投篮越多表示这个球员越厉害,原始数据中科比的命中数多于乔丹,而只有乔丹是明星,如果这样的数据带入很有可能学出来的效果是“命中球数越多,越不可能成为全明星”,这个理论与我们熟悉的客观事实不符。
真正熟悉篮球的同学肯定会了解,影响一个球员能否成为明星的关键,不是他浪投进了多少,而是更关键的是这个球员的命中率。如果我们衍生一个字段叫命中率,它的计算方式是“命中数/投篮数”,那这个特征对于数据的刻画可能更深刻。于是数据变成了:
球员 | 投篮数 | 命中数 | 命中率 | 比赛场次 | 全明星 |
科比 | 800 | 400 | 0.5 | 500 | 否 |
乔丹 | 500 | 300 | 0.6 | 200 | 是 |
在真实业务场景中,特征衍生往往要覆盖业务的各个方面,可能要衍生出成百上千的新特征才能更好的描述训练数据集的意义。