1. 为什么要做特征归一化/标准化?
数据预处理中,通常会用到特征归一化,为什么要做归一化呢?一般有两点:
消除特征间单位和尺度差异的影响
特征间的单位(尺度)可能不同。比如身高和体重,比如摄氏度和华氏度,比如房屋面积和房间数,一个特征的变化范围可能是[1000, 10000],另一个特征的变化范围可能是[-0.1, 0.2],在进行距离有关的计算时,单位的不同会导致计算结果的不同,尺度大的特征会起决定性作用,而尺度小的特征其作用可能会被忽略,为了消除特征间单位和尺度差异的影响,以对每维特征同等看待,需要对特征进行归一化。-
加速模型收敛速度
原始特征下,因尺度差异,其损失函数的等高线图可能是椭圆形,梯度方向垂直于等高线,下降会走zigzag路线,而不是指向local minimum。通过对特征进行zero-mean and unit-variance变换后,其损失函数的等高线图更接近圆形,梯度下降的方向震荡更小,收敛更快,如下图所示,图片来自Andrew Ng。
2. 常用的feature scaling方法
待补充。
3. 什么情况下需要做归一化?
- 涉及或隐含距离计算的算法,比如K-means、KNN、PCA、SVM等
- 损失函数中有正则项,比如正则,目的也是为了消除不同特征的差异
- 梯度下降优化算法。
模型收敛的速度取决于参数的初始位置到local minima的距离,以及学习率的大小。收敛意味着在每个参数维度上都取得极小值,每个参数维度上的偏导数都为0,但是每个参数维度上的下降速度是不同的,为了每个维度上都能收敛,学习率应取所有维度在当前位置合适步长中最小的那个(学习率是多维度共享的)。
不需要做归一化的情况
- 与距离计算无关的概率模型,不需要feature scaling,比如Naive Bayes;
- 与距离计算无关的基于树的模型,不需要feature scaling,比如决策树、随机森林等,树中节点的选择只关注当前特征在哪里切分对分类更好,即只在意特征内部的相对大小,而与特征间的相对大小无关。