本文原载于微信公众号【潇杂想】,欢迎关注交流~,原文链接 [什么情况下需要对特征变量标准化](https://mp.weixin.qq.com/s/kKPyn0NbRfzgR4jlB922Cw "什么情况下需要对特征变量标准化")
------------
最近工作中遇到数据标准化前后数据效果不一致的情况,所以本文的问题是:构建数据模型,什么情况下需要对特征变量标准化。
在数学建模过程中,我们的样本通常是多维度的,例如在房价预测问题中,影响房价的特征有房屋面子,卧室个数,距离市中心距离等,这些特征的数值量级和量纲是不同的,对房价的影响程度会不同。所以原始数据在不同维度上的量纲不同或数据取值范围差异较大,例如房屋的面积范围是[50-300]平方米,卧室的个数是[1-10]个,距离市中心的距离是[0-100000]米,这个时候就需要标准化。
### (一)如何标准化
我首先查阅了sklearn的官方文档,sklearn.preprocessing 提供了一些通用的函数可以将原始特征向量进行转换从而更适合数据模型。尤其是当数据中存在异常值(outliers)时,标准化将是必须的。在实际应用中,我们常常将数据分布假设为正态分布,通过均值和标准差来进行标准化。在文档中找到如下两种标准化方法:
#### Standardization, or mean removal and variance scaling(正态标准化,即均值移除,方差规格化)
preprocessing 中函数scale提供了一种快速和简单的方法来进行标准化
```python
from sklearn import preprocessing
import numpy as np
X_train = np.array([[ 1., -1., 2.],[ 2., 0., 0.], [ 0., 1., -1.]])
# scale标准化,从某个方向对变量进行正态标准化,默认是特征方向
X_scaled = preprocessing.scale(X_train)
```

同时preprocessing模块提供了StandardScaler 函数,实现了Transformer API,它的优点在于在训练集上计算均值和标准差后可以以同样的方式作用于测试集。
```python
#StandardScaler标准化
scaler = preprocessing.StandardScaler().fit(X_train)
scaler.transform(X_train)
```

```python
X_test = [[-1., 1., 0.]]
scaler.transform(X_test)
```

#### Scaling features to a range(将特征值缩放到某一范围)
另一种标准化是将特征值缩放到给定的最大值和最小值之间,通常的区间是[0,1],这将会把每个特征值的最大值或最小值缩放到单位值大小。在preprocessing中可通过MinMaxScaler或者MaxAbsScaler来实现。如果缩放范围表达式为feature_range=(min,max),则MinMaxScaler 的计算过程如下:
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min
MaxAbsScaler与MinMaxScaler非常相似,但是它的缩放范围是[-1,+1 ]。当然类似scale,preprocessing也提供了便捷两个的函数minmax_scale和maxabs_scale可以直接使用,不需要实例标准化对象。
#### scale与 StandardScaler 有何区别:
我们看到量这个的标准化都是z-score 正态标准化,即特征值减去均值μ除以标准差σ。不同的是两者使用的场景略有不同:
scale:将训练集合测试集统一标准和,均值是整体的均值,方差是整体的方差。
StandardScaler:首先计算训练集的均值和方差,用它们去标准化测试集。也就是将训练集的均值和方差作为整体的均值和方差。
minmax_scale与MaxAbsScaler,maxabs_scale与MinMaxScaler的区别同理。
### (二)正态标准化(Standardization)与范围缩放(Scalingfeatures to a range)
#### StandardScaler(或scale):对数据等比例缩到[0,1],抗干扰能力差,受离群值影响大。
#### MinMaxScaler(或minmax_scale):要求数据分布近似服从正态分布,否则效果不好,标准差计算使用了所有数据值,抗干扰能力强。
标准化的目的是不同特征之间具备可比性,正态标准化(Standardization)变换之后特征分布没有发生改变,范围缩放(Scaling features to a range)由于受最大值与最小值的影响可能会改变数据分析。
### (三)什么模型需要标准化
最后,常用的机器学习模型哪些需要提前对数据标准化,哪些不需要标准化呢?
若模型中有基于距离计算数值型变量需要进行标准化处理,比如:KNN分类算法,SVM分类算法,K-means聚类算法,线性回归算法;若模型中是基于概率的计算则不需要标准化,例如,逻辑回归、决策树、随机森林、以及基于决策树算法的集成算法Boosting和Bagging、基于gbdt的lightgbm不需要进行标准化处理。另外分类型变量不需要标准化处理。
注:本文示例代码来自scikit-learn官方文档
参考文献:https://scikit-learn.org/