程序员

特征工程之数据预处理

2018-07-05  本文已影响66人  心水

有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。

以上一篇文章提到的例子为例,如果我想根据从家里的出发时间预估到单位的时间,首先要思考哪些因素会影响我到单位的时间,根据经验我总结了下面四大关键特征:

  1. 从家出发的时间,比如早上7点10分
  2. 天气:比如晴,下雨天容易堵车
  3. 星期几,比如星期一,这天经常会堵车
  4. 路线:比如156->三号线->四号线

其实计算机并不知道每个特征的语义,所以数据预处理的关键一环是将数据无量纲化使得不同特征之间拥有可比性。比如两个人体重差10KG,身高差0.02M,在衡量两个人的差别时体重的差距会把身高的差距完全掩盖,无量纲化之后就不会有这样的问题。

无量纲化的常用方法之一是将属性缩放到一个指定的最大和最小值(通常是1-0)之间,公式如下:


区间缩放公式

以第一个特征为例,假设我从家里出发的最早时间是7:00,最晚时间是7:20,那么7:10被区间缩放后的值就是(10-0)/(30 - 10)= 0.5

然后再看最后三个特征,天气、星期几和选择哪一条路线更多的时候是分类特征,而不是连续的数值特征。 比如一个人的特征可以是["male", "female"], ["from Europe", "from US", "from Asia"], ["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"]。 这样的特征可以高效的编码成整数,例如 ["male", "from US", "uses Internet Explorer"]可以表示成 [0, 1, 3],["female", "from Asia", "uses Chrome"]就是[1, 2, 1]。
这个整数特征表示并不能在一些机器学习算法中直接使用,因为这样的连续输入,估计器会认为类别之间是有序的,但实际却是无序的。(例如:浏览器的类别数据则是任意排序的)。
这时可用的方法是使用one-of-K或者one-hot编码,该方法将每个类别特征的n个可能值转换成n个二进制特征值,当然只有一个是激活值。

以路线特征为例,假设我有下面2条可选的路线:

  1. 156->三号线->四号线
  2. 156->一号线->四号线

那么第一条路线的值就是[1, 0],第二条路线的值就是[0, 1]。晴天的值就是[1, 0], 雨天的值就是[0, 1],星期一的值是[1, 0, 0, 0, 0]。所以样本数据:

[7:10,晴,星期一,156->三号线->四号线]

经过预处理之后会变成:

[0.5, 1, 0, 1, 0, 0, 0, 0, 1, 0]

上一篇下一篇

猜你喜欢

热点阅读