特征缩放以相同比例转换列中的不同值

Posted

技术标签:

【中文标题】特征缩放以相同比例转换列中的不同值【英文标题】:Feature scaling converts different values in columns on a same scale 【发布时间】:2019-11-05 23:51:49 【问题描述】:

缩放转换具有不同值的不同列,例如标准缩放器,但是在从中构建模型时,之前不同的值将转换为均值 = 0 和标准 = 1 的相同值,因此它应该会影响模型拟合和结果。

我采用了一个玩具熊猫数据框,其中第一列从 1 到 10 开始,第二列从 5 到 14 开始,并使用标准缩放器进行缩放。

import pandas as pd
ls1 = np.arange(1,10)
ls2 = np.arange(5,14)
before_scaling= pd.DataFrame()
before_scaling['a'] = ls1
before_scaling['b'] = ls2
'''
   a   b
0  1   5
1  2   6
2  3   7
3  4   8
4  5   9
5  6  10
6  7  11
7  8  12
8  9  13
'''
from sklearn.preprocessing import StandardScaler,MinMaxScaler
ss = StandardScaler()
after_scaling = pd.DataFrame(ss.fit_transform(before_scaling),columns= 
['a','b'])
'''
          a         b
0 -1.549193 -1.549193
1 -1.161895 -1.161895
2 -0.774597 -0.774597
3 -0.387298 -0.387298
4  0.000000  0.000000
5  0.387298  0.387298
6  0.774597  0.774597
7  1.161895  1.161895
8  1.549193  1.549193
'''

如果要使用上述 2 个自变量构建回归模型,那么我相信拟合模型(线性回归)将使用 before_scaling 和 after_scaling 数据帧上的数据帧产生不同的拟合和结果。 如果是,那么我们为什么要使用特征缩放,如果我们在单个列上一一使用特征缩放,那么它也会产生相同的结果

【问题讨论】:

【参考方案1】:

等了一段时间没有得到我的答案后,我自己尝试了一下,现在我得到了答案。 缩放之后,如果这些列的分布相同,则不同的列可能具有相同的值。模型能够在缩放后改变特征值保留相同结果的原因是模型改变了系数的权重。

# After scaling with Standard Scaler
b = -1.38777878e-17
t = 0.5 * X_a[0,0] + 0.5 * X_a[0,1] + b
t = np.array(t).reshape(-1,1)
sc2.inverse_transform(t)
# out 31.5

'''
X_a
array([[-1.64750894, -1.64750894],
       [-1.47408695, -1.47408695],
       [-1.30066495, -1.30066495],
       [-1.12724296, -1.12724296],
       [-0.95382097, -0.95382097],
       [-0.78039897, -0.78039897],
       [-0.60697698, -0.60697698],
       [-0.43355498, -0.43355498],
       [-0.26013299, -0.26013299],
       [-0.086711  , -0.086711  ],
       [ 0.086711  ,  0.086711  ],
       [ 0.26013299,  0.26013299],
       [ 0.43355498,  0.43355498],
       [ 0.60697698,  0.60697698],
       [ 0.78039897,  0.78039897],
       [ 0.95382097,  0.95382097],
       [ 1.12724296,  1.12724296],
       [ 1.30066495,  1.30066495],
       [ 1.47408695,  1.47408695],
       [ 1.64750894,  1.64750894]])


'''

# Before scaling
2.25 * X_b[0,0] + 2.25 * X_b[0,1] + 6.75
# out 31.5

'''
X_b
array([[ 1, 10],
       [ 2, 11],
       [ 3, 12],
       [ 4, 13],
       [ 5, 14],
       [ 6, 15],
       [ 7, 16],
       [ 8, 17],
       [ 9, 18],
       [10, 19],
       [11, 20],
       [12, 21],
       [13, 22],
       [14, 23],
       [15, 24],
       [16, 25],
       [17, 26],
       [18, 27],
       [19, 28],
       [20, 29]], dtype=int64)

''' 

【讨论】:

【参考方案2】:

发生这种情况是因为fit_transform 函数的工作方式如下:

对于您拥有的每个功能(在您的情况下为“a”、“b”)应用此等式:

 X = (X - MEAN) / STD

其中 MEAN 是特征的平均值,STD 是标准差。

第一个特征a 的平均值为“5”,标准为“2.738613”,而特征b 的平均值为“9”,标准为“2.738613”。因此,如果您从每个值中减去其对应特征的平均值,您将拥有两个相同的特征,并且由于两个特征的标准相等,您最终将得到相同的转换。

before_scaling['a'] = before_scaling['a'] - before_scaling['a'].mean()
before_scaling['b'] = before_scaling['b'] - before_scaling['b'].mean()
print(before_scaling)


    a   b
0   -4.0    -4.0
1   -3.0    -3.0
2   -2.0    -2.0
3   -1.0    -1.0
4   0.0     0.0
5   1.0     1.0
6   2.0     2.0
7   3.0     3.0
8   4.0     4.0

最后要注意arange函数中的最后一个值不包括在内。

【讨论】:

我知道缩放/转换是如何工作的,但更广泛的问题是,如果这两个特征用于回归模型,在缩放之前你有不同的值集,在缩放之后你有相同的值集。所以缩放之前和缩放之后的回归目标变量结果会有差异,那么为什么要使用缩放。

以上是关于特征缩放以相同比例转换列中的不同值的主要内容,如果未能解决你的问题,请参考以下文章

机器学习特征工程之特征缩放+无量纲化:最小最大缩放(MinMaxScaler)

机器学习特征工程之特征缩放+无量纲化:最大绝对值缩放(MaxAbsScaler)

机器学习特征工程之特征缩放+无量纲化:非线性缩放(例如,sigmoidtanharctan等)

机器学习特征工程之特征缩放+无量纲化:数据标准化(StandardScaler)

数据集特征编码和缩放

机器学习特征工程之特征缩放+无量纲化:行归一化(范数化,Normalizer)