【问题标题】: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 数据帧上的数据帧产生不同的拟合和结果。 如果是,那么我们为什么要使用特征缩放,如果我们在单个列上一一使用特征缩放,那么它也会产生相同的结果

【问题讨论】:

    标签: python python-3.x pandas feature-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函数中的最后一个值不包括在内。

      【讨论】:

      • 我知道缩放/转换是如何工作的,但更广泛的问题是,如果这两个特征用于回归模型,在缩放之前你有不同的值集,在缩放之后你有相同的值集。所以缩放之前和缩放之后的回归目标变量结果会有差异,那么为什么要使用缩放。
      猜你喜欢
      • 2020-08-15
      • 2015-12-04
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      • 2020-05-18
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多