C++,python,热爱算法和机器学习
全部博文(1214)
分类: IT业界
2019-04-06 12:03:39
很多人在建模前看到一组变量,都会有这样的一个问题,这些变量需要标准化吗?然后转身问了下身边的同事、教授。哦!原来要做标准化的,接着把所有变量转化成平均数为0,标准差为1的变量,开开心心地开始建模了。
多数人觉得标准化变量是建模的固定步骤,其实他们也不清楚标准化的作用到底是什么,他们认为做总是比没做好。那么标准化究竟解决了什么,如果不做的话,会产生怎么样的结果呢?今天我们一步一步的来详细讨论一下这个问题吧。
我们先从简单的预测房价的线性回归模型开始:
有一组关于房价和房子变量的数据集,通过房子的面积,房间数量,房子的层数来预测房价。
占地面积1800尺,房间数量3间,房子层数2层-> 房价$$?;
为了方便对比,我们分别看一下标准化前和标准化后的模型输出分布是怎么样的。
可以看出,标准化前后变量的系数不同,误差不同,但是R平方,和变量的t值是相同的。
那标准化前后得到的公式,怎么来解释呢?
标准化前 | 标准化后 |
---|---|
如果居住面积,房间数,房间层数都是0的情况下,房子的价格为91830万 | 如果居住面积,房间数,房间层数是各自的平均数的情况下,房子的价格为539400万 |
当一个外行人在听解释的时候,一定会问,什么呀?所有东西都是0,空气造的房子还能卖9万?!
接着你会问,系数不同,那预测出来的房价会相同吗?
现在我们来预测一个1590尺,3个卧室,3层的房屋
标准化前房价 | 标准化后房价 |
---|---|
$406641.02 | $406641.02 |
我们发现预测出来的房价是一样的。
这时你一定会想,既然结果都一样,做不做标准化,都一样嘛。说到这里,我们再看一下,建模时寻找最优解的时间吧。
标准化前处理时间 | 标准化后处理时间 |
---|---|
0.026s | 0.021s |
为什么标准化后的建模时间会短呢?这时候就要说起寻找系数最优解-梯度下降法。
标准化前,由于变量的单位相差很大,导致了椭圆型的梯度轮廓。标准化后,把变量变成统一单位,产生了圆形轮廓。由于梯度下降是按切线方向下降,所以导致了系统在椭圆轮廓不停迂回地寻找最优解,而圆形轮廓就能轻松找到了。
还有一种比较极端的情况,有时没做标准化,模型始终找不到最优解,一直不收敛。
这种情况下,可见标准化的重要性了吧。
我们再来看一下,如果将预测房价的变量,用PCA方法来降维,会不会对结果产生影响。
我们看出在标准化前,用一个成分就能解释99%的变量变化,而标准化后一个成分解释了75%的变化。 主要原因就是在没有标准化的情况下,我们给了居住面积过大权重,造成了这个结果。
那还有什么情况下,不做归一化会发生这么大的影响?
Kmeans,KNN一些涉及到距离有关的算法,或者聚类的话,都是需要先做变量标准化的。
举个例子,我们将3个城市分成两类,变量有面积和教育程度占比;三个城市分别是这样的:
城市A,面积挺大,但是整天发生偷盗抢劫,教育程度低;
城市B,面积也挺大,治安不错,教育程度高;
城市C,面积中等,治安也挺好,教育程度也挺高;
我们如果不做标准化,直接做聚类模型的话,A城市和B城市分在一块儿了,你想想,一个治安挺好的城市和一个整体偷盗抢劫城市分在一起,实在是有点违反常理。
当然,也不是所有的模型都需要做归一的,比如模型算法里面有没关于对距离的衡量,没有关于对变量间标准差的衡量。比如decision tree 决策树,他采用算法里面没有涉及到任何和距离等有关的,所以在做决策树模型时,通常是不需要将变量做标准化的。