1

缩放转换具有不同值的不同列,例如标准缩放器,但是在从中构建模型时,先前不同的值将转换为均值 = 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 数据帧上的数据帧产生不同的拟合和结果。如果是,那么我们为什么要使用特征缩放,如果我们在单个列上一一使用特征缩放,那么它也会产生相同的结果

4

2 回答 2

1

发生这种情况是因为该fit_transform功能的工作方式如下:

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

 X = (X - MEAN) / STD

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

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

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函数中的最后一个值不包括在内。

于 2019-06-25T08:43:10.430 回答
0

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

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

''' 
于 2019-06-27T13:48:19.410 回答