机器学习实践鹿-2-什么是特征工程

381 阅读5分钟

「小杜」不有趣机器学习实践鹿-2-什么是特征工程

一个小杜logo

初衷

书接上篇,这一篇就写写关于特征工程的内容

网络上算法相关的文章和调参经验非常多,但是相比于算法选择与调参,对建模数据集的优化获得的增益大的多

“如何做好特征工程、如何获取高质量的正负样本、怎样处理不平衡数据集、确定怎样的评估方式”是首要的

“选择什么算法、如何调参、解释模型”是随后才要做的

所以要学好特征工程

微信图片_20210317150053

Tags: 机器学习

[Toc]

📒什么是特征工程

特征我们都知道,就是x1x_1x2x_2...

那么啥是特征工程呢?v2-816803ee0754a5f046e5de180e10ceb5_720w

特征工程就是说把原始数据转换成特征矢量,简单说就是把原始数据映射成特征

23958

下表是一个关于房价预测的原始数据和特征的例子

原始数据特征
房间号:6num_room = 6
街道名:A街==street_name = 0==

从上表可以看到,原始数据是整数或者小数的时候,特征可以直接拿来使用

但是一旦原始数据是分类数据呢?像街道为A街的数据,要怎么转换成特征呢

原始数据是分类数据怎么办?

也许你想到了这种方法

让A街 =0 ,B街 = 1,C街 = 2

用数字做索引,作为模型的输入特征可以吗

可以的,但有局限,让我们回到最初的梯度下降公式

Repeat{θ0=θ0αθ0j(θ0,θ1)θ1=θ1αθ1j(θ0,θ1)}}\begin{aligned} Repeat\{ \\ \theta_0 &=\theta_0 - \alpha \frac{\partial}{\partial \theta_0} j(\theta_0, \theta_1) \\ \theta_1 &=\theta_1 - \alpha \frac{\partial}{\partial \theta_1} j(\theta_0, \theta_1) \} \\ \} \end{aligned}

可以看到,损失函数是通过计算θ\theta(即权重)

假设street_name是特征x2x_2,最终计算出一个θ\theta是要和x2x_2相乘的

显然,在还没有训练的时候

A街的权重为θ×x2=0×θ=0\theta \times x_2 = 0 \times \theta = 0

C街的权重为θ×x2=2×θ=2θ\theta \times x_2 = 2 \times \theta = 2\theta

一般来说,默认所有的街道权重在未开始训练的时候,权重都是一样的,但是使用了数字索引,就好像我们提供了先验知识(对街道的权重排序),默认的权重变得不一样了

就产生了如下问题

  • 第一个问题:街道的初始权重被改变
  • 第二个问题:没有考虑到street_name可能会有多个值(街角处的屋子同时在A街也在B街)

针对以上两个问题,解决办法如下

  • 独热编码one-hot
原始数据特征
房间号:6num_room = 6
街道名:A街==street_name = [1, 0, 0]==
原始数据特征
房间号:7num_room = 7
街道名:B街,C街==street_name = [0, 1, 1]==
  • 稀疏表示法

    假设数据集有100万的不同的街道名称,就可以使用稀疏表示法,仅仅储存张量中的非零值。

🐣 什么是良好特征

用比较规范的语言说,就是如下图

image-20210318145617087

🐇 怎样进行数据清洗?

根据数据类型不同,可以尝试一下几种方法:

  • ==缩放特征值==(标准化):缩小特征值的范围

    例如,考试分数(0-100)可以转换到标准范围(0-1)

    • 帮助梯度下降法更快收敛
    • 帮助避免“NaN”陷阱(就是说数据太大超出内存限制)
    • 帮助模型为每个特征确定合适的权重
  • ==处理极端离群值==把大于设定上限的值都设定为上限值

    例如,大于等于4的值,都设定为4

  • ==分箱==(离散化):把一些无关的变量转为分类变量

    比如说学校的经纬度学生的学习成绩肯定不是线性关系,但是也有一点影响。

    但是学校的经纬度又是浮点数,计算特征不方便,不如统一划分成10个区块,作为分类变量参与模型。

  • ==清查==:就是说从数据集中移除不良样本

    • 遗漏值
    • 重复样本
    • 不良标签(y)
    • 不良特征值(x)

🐧 为什么还要整特征组合

让我们先做出一个关于数据分布的假设

image-20210318153525733

有点意思是不是,很明显,这种分类的问题显然不是个非线性问题

线性回归不适用与所有数据,有的时候我们需要曲线来适应我们的数据

想想常用的曲线有哪些:

  • 二次函数
  • 对数函数
  • 指数函数

那能不能把原来的一次函数转变成二次函数呢?

y=θ0x0+θ1x1+by = \theta_0x_0+\theta_1x_1+b

如果令

x2=x12x_2 = x_1^2

原式变成

y=θ0x0+θ1x2+by=θ0x0+θ1x12+by = \theta_0x_0+\theta_1x_2+b \\ 即 \\ y = \theta_0x_0+\theta_1x_1^2+b

这样不就变成二次函数了吗,计划通!

特征C等于特征A乘以特征A,这个就是特征组合

特征组合就是指通过将两个或多个输入特征相乘来对特征空间中的非线性归类进行编码的合成特征

v2-816803ee0754a5f046e5de180e10ceb5_720w

我们可以创建很多不同种类的特征组合

  • C=[A×B] C = [A \times B]
  • C=[A×B×D×E×F] C = [A \times B \times D \times E \times F]
  • C=[A×A] C = [A \times A]
特征组合的现实应用

假设我们有淘宝APP的点击数据,判断用户是否会点击推荐商品,来预估点击通过率CTR(Click-Through-Rate)

这个点击数据中,

性别(男女)是一个特征

年龄也是一个特征

性别特征是女,年龄是20-30之间,将二者特征组合是非常强的对用户预测是否点击商品的的特征。

20-30岁的女性点击衣服商品的概率非常高,所以交叉后的非线性的组合特征对CTR预估挖掘非常重要

⛹️‍♀️ 一个特殊的特征组合

还记得我们上面讲到的独热编码吗,把分类变量转换成[1, 0, 0, 0]的格式

独热编码怎样组合呢?

假设有两个独热编码的矢量特征

  • country = [A国, B国, C国, D国, E国]

  • language = [1语, 2语, 3语, 4语]

对两个独热编码的矢量特征进行组合(Cross

C=[country×language]C = [country \times language]

很奇妙,新得到的矢量特征C是可解释的

C = [A国1语, A国2语, ···, E国3语, E国4语]


结束!

📃参考资料


  1. Machine-Learning-Book
  2. Coursera-ML-AndrewNg-Notes