1 特征缩放介绍
对于有些模型来说,特征缩放是很重要的,举几个例子:
- 神经网络——进行梯度下降时,如果有一个方向数值特别大,那么梯度肯定是向着这个方向走的
- PCA——需要计算类内和类间的variance
- KNN和K-Means——需要计算点与点之间的距离
所以在送入模型之前,进行特征缩放是很重要的
1.1 特征缩放的重要性
1.1.1 未缩放与缩放后的 K 近邻
- 对缩放或未缩放数据的拟合会导致完全不同的模型
- 变量“proline”的值在 0 到 1000 之间变化;而变量“hue”的值在 1 到 10 之间变化
- ——>样本之间的距离主要受“proline”值差异的影响,而“hue”的值则相对被忽略
- 如果使用 StandardScaler 对这个数据库进行归一化,两个缩放后的值大致在 -3 到 3 之间,且两个变量对邻居结构的影响将大致相同
Importance of Feature Scaling — scikit-learn 1.5.0 documentation
1.1.2 对 PCA 降维的缩放效果
- 使用 PCA 进行降维是为了找出最大化方差的特征。
- 如果一个特征仅因其各自的规模而比其他特征变化更大,则 PCA 会确定这样的特征主导了主成分的方向
2 标准化 standardization
- 标准化是将数据按比例缩放,使之落入一个小的特定区间,把数据转换为统⼀的标准。
- 最常用的标准化是z-score标准化,即零-均值标准化
- 标准化缩放后,每个特征的平均值为0,方差为1
2.1 sklearn 实现
from sklearn.preprocessing import StandardScaler
X = np.array([[0, 0, 0],
[0, 1, 1],
[1, 0, 1],
[1, 1, 1]])
stand_x=StandardScaler().fit_transform(X)
stand_x
'''
array([[-1. , -1. , -1.73205081],
[-1. , 1. , 0.57735027],
[ 1. , -1. , 0.57735027],
[ 1. , 1. , 0.57735027]])
'''
每一列(每个特征)进行标准化
3 规范化(归一化)normalization
把数据变为(0,1)之间的小数,可以使处理过程更加便捷、快速。
常见的规范化为 min-max缩放
3.1 sklearn实现
from sklearn.preprocessing import MinMaxScaler
X = np.array([[0, 1, 2],
[0, 2, 3],
[1, 4, 9],
[1, 1, 1]])
stand_x=MinMaxScaler().fit_transform(X)
stand_x
'''
array([[0. , 0. , 0.125 ],
[0. , 0.33333333, 0.25 ],
[1. , 1. , 1. ],
[1. , 0. , 0. ]])
'''
4 RobustScaler
在包含异常值的数据集中,更有可能缩放到更接近正态分布。
4.1 sklearn 实现
有一个参数quantile_range,需要给他复制一个形参(q_min,q_max),表示Q1和Q3的分位
from sklearn.preprocessing import RobustScaler
X = np.array([[0, 1, 2],
[0, 2, 3],
[1, 4, 9],
[1, 1, 1]])
stand_x=RobustScaler().fit_transform(X)
stand_x
'''
array([[-0.5 , -0.33333333, -0.18181818],
[-0.5 , 0.33333333, 0.18181818],
[ 0.5 , 1.66666667, 2.36363636],
[ 0.5 , -0.33333333, -0.54545455]])
'''
5 几种缩放方法的区别
-
在规范化中只更改数据的范围,而在标准化中会更改数据分布的形状。
-
规范化将这些值重新缩放到[0,1]的范围内。在所有参数都需要具有相同的正刻度的情况下是非常有效的。但是数据集中的异常值会丢失。
-
而在标准化中,数据被缩放到平均值(μ)为0,标准差(σ)为1(单位方差)。
-
规范化在0到1之间缩放数据,所有数据都为正。标准化后的数据以零为中心的正负值。
5.1 sklearn可视化对比
数据部分:
import numpy as np
import matplotlib.pyplot as plt
nb_samples = 200
mu = [1.0, 1.0]
covm = [[2.0, 0.0], [0.0, 0.8]]
X = np.random.multivariate_normal(mean=mu,
cov=covm,
size=nb_samples)
from sklearn.preprocessing import StandardScaler,MinMaxScaler,RobustScaler
fig,ax=plt.subplots(2,2,sharex=True,sharey=True,dpi=1000)
ss=StandardScaler().fit_transform(X)
mms=MinMaxScaler().fit_transform(X)
rs=RobustScaler().fit_transform(X)
ax[0][0].scatter(X[:,0],X[:,1])
ax[0][1].scatter(ss[:,0],ss[:,1])
ax[1][0].scatter(mms[:,0],mms[:,1])
ax[1][1].scatter(rs[:,0],rs[:,1])
ax[0][0].set_title('raw data')
ax[0][1].set_title('standard scaler')
ax[1][0].set_title('minmax scaler')
ax[1][1].set_title('robust scaler')
参考内容:特征工程中的缩放和编码的方法总结
Importance of Feature Scaling — scikit-learn 1.5.0 documentation