机器学习笔记:特征缩放(sklearn实现)

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标准化,即零-均值标准化
  • z=\frac{x-\mu}{\sigma}
  • 标准化缩放后,每个特征的平均值为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缩放X_{norm}=\frac{X-X_{min}}{X_{max}-X_{min}}

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 

\frac{x_i-Q_1(x)}{Q_3(x)-Q_1(x)}

在包含异常值的数据集中,更有可能缩放到更接近正态分布。

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')

参考内容:特征工程中的缩放和编码的方法总结

一个简单但是能上分的特征标准化方法 (qq.com)

Importance of Feature Scaling — scikit-learn 1.5.0 documentation

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值