新立了一个flag,每周更新一篇,加油!!
最近遇到一个问题,在做底层数据仓库设计的时候,被问为什么需要把一个0-100分的分数做归一化再入hive表,正好看了相关内容,我整理一下,也写写归一化与标准化的区别。
归一化和标准化是数据预处理的两种方式,本质上都是线性变换,这保证了变换前后的数据不会发生本质变化从而影响最后的预测结果
一、为什么要做归一化或者标准化?
主要是为了调整样本数据每个维度的量纲,让每个维度数据量纲相同或接近。 1) 量纲不一样的情况是什么?
比如,预测一批零件是合格品还是残次品。
这个零件把他假象成是细长细长的棍子,有两个维度特征:半径和长度。 半径都是1cm左右,长度都是1000cm左右,数值差距一个甚至几个数量级,这个就叫量纲不一样。
2) 量纲不一样会造成什么样的后果?
会误导模型学习过程,导致对使用特征权重的偏差。例如这个零件是否合格的问题,当计算损失函数的时候会考虑到所有训练数据各个特征的情况总和,这时由半径带来的偏差值很小,例如某个case的半径是0.8,那么由这个case引起的偏差是(0.8 - 1)^2 = 0.04,而长度带来的偏差值则相对大得多,如某个case的长度是1030,偏差为(1030-1000)^2 = 900, 这个值远远大于0.04,残差相加为900.04 。这里面由半径引发的值(0.04)几乎可以与略不计.....但是其实很明显我们并不能说长度这个特征的重要性就比半径重要几万倍(900/0.04)。
这个例子就很形象的说明做归一化/标准版的重要性。如果没用进行这一个量纲的统一,模型可能永远都找不到不合格的真正原因
二、归一化和标准化的区别和理解
1)归一化,计算方法:对样本X的每个列 Xi
Xi = (Xi - min(Xi)) / ( max(Xi) - min(Xi) )
把Xi这列的每个数都减去这列的最小值再除以这列最大值和最小值的差。可以简单的这样理解,把这列数据看作一座山,最小的值看作是山脚,最大值看作山顶,每一个具体的值其实就是他在这座山的位置。如果这座山是1000m,某个点在600m的高度,那他做完归一化之后的值就是0.6。结果: 所有列的数据,都缩放到 0到1之间,且最大值是1,最小值是0
2)标准化,计算方法:对样本X的每个列 Xi
Xi = (Xi - mean(Xi)) / 方差(Xi)
把这列的每个数都减去这列的均值再除以这列的方差。可以简单的这样理解为还是一座山,但是这座山中间的位置保持不变而去拉伸或压缩山顶和山脚,使得这两个点(以及中间各个点)到中间的大致比例保持不变。结果: 所有的数据转化成一组均值为0,方差为1的分布数据。这个变换,保留数据的原始分布(即各点相对于其他点的位置基本不变), 保留了每个数距离均值的差距比例。所有数在均值周围分布,并且方差为1,对于不同数据最大值与最小值之间的差距不一定是多少,不严格限定在0-1之间,输出范围是负无穷到正无穷
三、具体如何应用两种方法
1)如果对输出结果范围有要求(因为标注化的数据没用边界限制),用归一化
2)如果数据不存在异常大或异常小的值,用归一化;反之用标准化
3)如果这组数据的均值有重要意义,用标准化,因为标准化更重视回归原来数据的分布(而归一化收到最大值和最小值的影响大,对平均值几乎无感知)