Функция масштабирования преобразует различные значения в столбцах в одном масштабе
Масштабирование преобразует разные столбцы с разными значениями, например, 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)
'''