文章目录
博客: blog.shinelee.me | 博客园 | CSDN
写在前面
Feature scaling,常见的提法有“特征归一化”、“标准化”,是数据预处理中的重要技术,有时甚至决定了算法能不能work以及work得好不好。谈到feature scaling的必要性,最常用的2个例子可能是:
-
特征间的单位(尺度)可能不同,比如身高和体重,比如摄氏度和华氏度,比如房屋面积和房间数,一个特征的变化范围可能是 [ 1000 , 10000 ] [1000, 10000] [1000,10000],另一个特征的变化范围可能是 [ − 0.1 , 0.2 ] [-0.1, 0.2] [−0.1,0.2],在进行距离有关的计算时,单位的不同会导致计算结果的不同,尺度大的特征会起决定性作用,而尺度小的特征其作用可能会被忽略,为了消除特征间单位和尺度差异的影响,以对每维特征同等看待,需要对特征进行归一化。
-
原始特征下,因尺度差异,其损失函数的等高线图可能是椭圆形,梯度方向垂直于等高线,下降会走zigzag路线,而不是指向local minimum。通过对特征进行zero-mean and unit-variance变换后,其损失函数的等高线图更接近圆形,梯度下降的方向震荡更小,收敛更快,如下图所示,图片来自Andrew Ng。
对于feature scaling中最常使用的Standardization,似乎“无脑上”就行了,本文想多探究一些为什么,
- 常用的feature scaling方法都有哪些?
- 什么情况下该使用什么feature scaling方法?有没有一些指导思想?
- 所有的机器学习算法都需要feature scaling吗?有没有例外?
- 损失函数的等高线图都是椭圆或同心圆吗?能用椭圆和圆来简单解释feature scaling的作用吗?
- 如果损失函数的等高线图很复杂,feature scaling还有其他直观解释吗?
根据查阅到的资料,本文将尝试回答上面的问题。但笔者能力有限,空有困惑,能讲到哪算哪吧(微笑)。
常用feature scaling方法
在问为什么前,先看是什么。
给定数据集,令特征向量为 x x x,维数为 D D D,样本数量为 R R R,可构成 D × R D \times R D×R的矩阵,一列为一个样本,一行为一维特征,如下图所示,图片来自Hung-yi Lee pdf-Gradient Descent:

feature scaling的方法可以分成2类,逐行进行和逐列进行。逐行是对每一维特征操作,逐列是对每个样本操作,上图为逐行操作中特征标准化的示例。
具体地,常用feature scaling方法如下,来自wiki,
-
Rescaling (min-max normalization、range scaling):
x ′ = a + ( x − min ( x ) ) ( b − a ) max ( x ) − min ( x ) x^{\prime}=a+\frac{(x-\min (x))(b-a)}{\max (x)-\min (x)} x′=a+max(x)−min(x)(x−min(x))(b−a)
将每一维特征线性映射到目标范围 [ a , b ] [a, b] [a,b],即将最小值映射为 a a a,最大值映射为 b b b,常用目标范围为 [ 0 , 1 ] [0, 1] [0,1]和 [ − 1 , 1 ] [-1, 1]