转载请注明出处
什么是特征缩放
特征缩放其实就是标准化数据特征的范围。
为什么要进行特征缩放
特征缩放可以使得ML方法工作的更好,比如在k-nn的算法中,分类器主要是计算两点之间的欧几里得距离,如果一个feature比其他另外一个feature大超过一个数量级的情况下,那么两者之间的距离就会更大的偏向于这个feature。因此,我们必须对每个feature都进行归一化,将其规范到[0,1]的范围内,这样就可以加速model收敛的速度
特征缩放的一些方法
调节比例( rescaling)
这种方法是将我们的数据都规范到[0,1]或者[-1,1]之间,至于缩放到什么范围,完全由数据的性质来决定。计算公式如下:
,其中,x 是最初的特征值,x’x′是缩放后的值。
标准化( normalization)
特征标准化使每个特征的值有零均值(zero-mean)和单位方差(unit-variance),计算公式如下:
标准差计算公式如下:
接下来,通过具体的实例来表达下上面的意思。如下图所示:
假如说我们现在有一个nn的网络结构,
input的 是1,2,,,数量级的
input的 是100,200,,,数量级的
那么,此时为了让output的a维持一定的标准态, w1的取值就应该是一个很大的数, w2的取值就应该是一个很小的数,这样乘起来的结果再相加才能作为一个比较合理的数。不然,如果 还是一个很小的数,那么乘出来的结果会慢慢吞噬 的作用。那么,如果我们不做feature scaling,会带来什么问题呢?
通过上图左边的这个图,我们发现,其是一个椭圆形的loss曲线。原因就是loss在w1 方向上的梯度变化缓慢,而在 w2方向上的梯度变化剧烈,使得整个曲线的形状像一个椭圆形。如果在训练的过程中,我们为了避免这种情况发生,可以在w1 方向上使用较大learning_rate,而在 w2方向上使用较小的learning_rate。做完feature scaling后,我们的loss曲线就是一个圆形的曲线了,这个时候,不管在哪个方向上的梯度都是一样的,在train的过程中,model很快就能收敛了。