Функция масштабирования преобразует различные значения в столбцах в одном масштабе

Масштабирование преобразует разные столбцы с разными значениями, например, Standard Scaler, но при построении модели из нее ранее отличавшиеся значения преобразуются в одинаковые значения со средним значением =0 и стандартным значением = 1, поэтому это должно влиять на подбор модели и результаты.

Я взял фрейм данных игрушечных панд с 1-м столбцом, начинающимся с 1 до 10, и 2-м столбцом, начинающимся с 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. Если да, то почему мы используем масштабирование объектов и если мы используем масштабирование объектов для отдельных столбцов один за другим, то это также даст те же результаты

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 функция не включена.

Подождав некоторое время и не получив ответа, я попробовал сам, и теперь получил ответ. После масштабирования, хотя разные столбцы могут иметь одинаковое значение, если распределение для этих столбцов одинаковое. Причина, по которой модель может сохранять те же результаты с измененными значениями признаков после масштабирования, заключается в том, что модель изменяет веса коэффициентов.

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

''' 
Другие вопросы по тегам