为什么要特征标准化
今天我们会来聊聊机器学习所需要的数据,为了让机器学习方面消化, 我们需不需要对数据动些手脚呢. 所以今天就会提到特征数据的标准化, 也可以说正常化, 归一化, 正规化等等.
现实中的数据
说特征标准化之前, 我们先来说说现实生活中, 我们的数据是什么样的. 它们很可能来自不同的地方, 被不同的人采集, 有着不同的规格. 用最经典的房价预测例子来和大家说说. 我们用机器学习从房屋的各个层面来预测房价, 房屋的特征可能包括, 离市中心的距离, 房屋楼层, 房屋面积, 所在城市, 几室几厅等等. 这些数据的取值范围往往差距悬殊, 比如楼层一般在2-30层以内, 面积可能上百, 离市中心距离可以以千来记.
数据方程
回到机器学习中, 如果我们以一个简单的线性回归方程来预测房屋的价格, 那方程可能会是这样 . 价格= a* 离市中心 + b * 楼层 + c * 面积. 其中的 a b c 就是机器学习需要努力努力再努力 来优化的参数.
我们说的在具体一点, 用 abc 算出来的价格是预测价格 . 机器学习需要计算预测值和实际值的差别, 然后对这个误差进行一些数学上的处理, 使之变成进步的阶梯, 然后反向地传递回参数 a b c 来提升下次的预测准确度. 好了. 这些概念和我们要提到的标准化有什么关系呢?
举例说明
我们可以把 abc 想想成3个人. 他们共同努力解决一个问题, 在某一个问题中, a工作的时候总是不知道发生了什么, b 的能力适中, c 工作能力最强, 老板看了他们一起工作的结果, 发现还有很多可以提高的地方, 然后不屑地说: 你们这个结果和我期望的还有很大差距, 你们快去缩小差距. 老板给的要求只是缩小差距. 可是 abc 都不知道差距在哪. 所以他们这次只好平分接下来的任务, 不过 c 很快就做完了, b 第二, a 做得很慢, 所以花的总时间很长, c 和 b 都要等 a 把剩下的工作做完才能再给老板看结果, 这样 效率并不高.
把这个问题放在机器学习中, 为了好理解, 我们把 b 先排除掉. 再把房价问题也简化一下, 留下两个特征. 因为面积的跨度一般可以从0 到 2-300, 而离市中心的距离跨度一般在10以内. 所以在这个公式中, c 只要稍稍变化一点, 他乘以面积的变化就会很大, 因为面积的值可以很大, 但是当a也变化那一点点时, 他对预测价格的影响力不会像 c 那样巨大.
使用这些标准化手段. 我们不仅可以快速推进机器学习的学习速度, 还可以避免机器学习 学得特扭曲.
什么特征标准化?
这样的差别就会影响最终的工作效率. 所以, 我们要提高效率, 特征的标准化就可以帮上忙.我们在机器学习训练之前, 先对数据预先处理一下, 取值跨度大的特征数据, 我们浓缩一下, 跨度小的括展一下, 使得他们的跨度尽量统一.
特征标准化的方法?
- z-score标准化:这是最常见的特征预处理方式,基本所有的线性模型在拟合的时候都会做 z-score标准化。具体的方法是求出样本特征x的均值mean和标准差std,然后用(x-mean)/std来代替原特征。这样特征就变成了均值为0,方差为1了。
- max-min标准化:也称为离差标准化,预处理后使特征值映射到[0,1]之间。具体的方法是求出样本特征x的最大值max和最小值min,然后用(x-min)/(max-min)来代替原特征。如果我们希望将数据映射到任意一个区间[a,b],而不是[0,1],那么也很简单。用(x-min)(b-a)/(max-min)+a来代替原特征即可。
- L1/L2范数标准化:如果我们只是为了统一量纲,那么通过L2范数整体标准化也是可以的,具体方法是求出每个样本特征向量 x的L2范数||x||2,然后用x/||x||2代替原样本特征即可。当然L1范数标准化也是可以的,即用x /||x||1代替原样本特征。通常,范数标准化首选L2范数标准化。
- 此外,经常我们还会用到中心化,主要是在PCA降维的时候,此时我们求出特征x的平均值mean后,用x-mean代替原特征,也就是特征的均值变成了0, 但是方差并不改变。这个很好理解,因为PCA就是依赖方差来降维的,如果我们做了z-score标准化,所以特征的方差为1,那么就没法来降维了。
什么情况不需要标准化?
主要是基于概率分布的模型,比如决策树大家族的CART,随机森林等。当然此时使用标准化也是可以的,大多数情况下对模型的泛化能力也有改进。