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

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

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


person BlackEagle    schedule 24.06.2019    source источник


Ответы (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 не включено.

person adnanmuttaleb    schedule 25.06.2019
comment
Я знаю, как работает масштабирование/преобразование, но более широкий вопрос, если эти две функции используются в модели регрессии, перед масштабированием у вас есть разные наборы значений, а после масштабирования у вас одинаковый набор значений. Таким образом, будет разница в результатах целевой переменной регрессии до масштабирования и после масштабирования, поэтому зачем использовать масштабирование. - person BlackEagle; 26.06.2019

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

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

''' 
person BlackEagle    schedule 27.06.2019