Хто-небудь може пояснити мені StandardScaler?


Відповіді:


106

Ідея StandardScalerполягає в тому, що він перетворить ваші дані таким чином, що їх розподіл матиме середнє значення 0 і стандартне відхилення 1.
У випадку багатовимірних даних це робиться з особливими ознаками (іншими словами, незалежно для кожного стовпця даних) .
Враховуючи розподіл даних, кожне значення в наборі даних відніме середнє значення, а потім поділить на стандартне відхилення цілого набору даних (або функції у багатовимірному випадку).


3
Я вважаю, що ця відповідь не правильна. each value in the dataset will have the sample mean value subtracted-- це не правда. Середнє значення КОЖНОЇ ознаки / стовпця буде віднято від значень конкретного стовпця. Це робиться по колонці. Немає sample mean value subtracted- Дивіться мою відповідь нижче
seralouk

@makis Я відредагував свою відповідь після роз’яснень, які ви пропонуєте.
user6903745

103

Вступ: Я припускаю, що у вас є матриця, Xде кожен рядок / рядок є зразком / спостереженням, а кожен стовпець - змінною / ознакою (це sklearn, до речі, очікуваний вхід для будь-якої функції ML - X.shapeповинен бути [number_of_samples, number_of_features]).


Основний метод : Основна ідея полягає в тому, щоб нормалізувати / гостірована тобто μ = 0і σ = 1ваші функції / змінні / стовпці X, по окремо , перед застосуванням будь-якої машини моделі навчання.

StandardScaler()буде нормалізувати функції , тобто кожен стовпець X, ІНДИВІДУАЛЬНО , так що кожен стовпець / функція / змінна буде мати μ = 0і σ = 1.


PS: Я знайшов найбільш прихильну відповідь на цій сторінці, неправильно. Я цитую "кожне значення в наборі даних буде віднімати середнє значення вибірки" - це не відповідає дійсності та правильності.


Дивіться також: Як і чому стандартизувати ваші дані: Підручник з Python


Приклад:

from sklearn.preprocessing import StandardScaler
import numpy as np

# 4 samples/observations and 2 variables/features
data = np.array([[0, 0], [1, 0], [0, 1], [1, 1]])
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)

print(data)
[[0, 0],
 [1, 0],
 [0, 1],
 [1, 1]])

print(scaled_data)
[[-1. -1.]
 [ 1. -1.]
 [-1.  1.]
 [ 1.  1.]]

Переконайтеся, що середнє значення кожної ознаки (стовпця) дорівнює 0:

scaled_data.mean(axis = 0)
array([0., 0.])

Переконайтеся, що std кожної функції (стовпця) дорівнює 1:

scaled_data.std(axis = 0)
array([1., 1.])

Математика:

введіть тут опис зображення


ОНОВЛЕННЯ 08/2019 : Concering вхідних параметрів with_meanі with_stdдо False/ True, я дала відповідь тут: різниця між StandardScaler «with_std = False або True» і «with_mean = False або True»


Чи маєте ви уявлення, чому я отримую, [1.15, 1.15]коли обчислюю як панду df pd.DataFrame(scaled_data).std(0):?
Sos

коли я запускаю, pd.DataFrame(scaled_data)[0]я отримую серію з Name: 0, dtype: float64і значеннями [-1.0, 1.0, -1.0, 1.0]. Вибачте за форматування
Sos

@seralouk Мені сподобалось, що ти відповів, проте мені все ще цікаво, в чому полягає намір перетворення вхідних даних за допомогою StandardScaler, чи змушує це алгоритм машинного навчання йти швидше, чи допомагає приймати більш точні рішення, чи щось інше?
sepisoad

Стандартизація набору даних є загальною вимогою для багатьох оцінювачів машинного навчання: вони можуть поводитися погано, якщо окремі функції не більш-менш виглядають як стандартні нормально розподілені дані (наприклад, гауссова з 0 середньою та одиничною дисперсією). Наприклад, багато елементів, що використовуються в цільовій функції алгоритму навчання (наприклад, ядро ​​RBF SVM або регулятори L1 та L2 лінійних моделей), припускають, що всі функції відцентровані навколо 0 і мають дисперсію в однаковому порядку.
seralouk

Отже, стандартизація веде до а) більш стабільного б) меншого впливу діапазону змінних в) швидшого пристосування г) більш стабільного виконання
seralouk


23

StandardScaler виконує завдання стандартизації . Зазвичай набір даних містить різні за масштабом змінні. Наприклад, набір даних працівника міститиме стовпець AGE зі значеннями за шкалою 20-70 та стовпець SALARY зі значеннями за шкалою 10000-80000 .
Оскільки ці дві колонки відрізняються за масштабом, вони стандартизовані, щоб мати загальний масштаб під час побудови моделі машинного навчання.


10

Це корисно, коли потрібно порівняти дані, що відповідають різним одиницям виміру. У такому випадку ви хочете видалити блоки. Щоб зробити це послідовно для всіх даних, ви перетворюєте дані таким чином, що дисперсія є унітарною, а середнє значення ряду - 0.


1
? Може у будь ласка пояснити з example..as в тому , що це допомагає .. що WUD бути на самому справі helpful..thanks
Lakshay

6

Наведені вище відповіді чудові, але мені потрібен був простий приклад, щоб полегшити деякі проблеми, які були у мене в минулому. Я хотів переконатися, що це справді трактує кожну колонку окремо. Зараз я заспокоєний і не можу знайти, який приклад викликав у мене занепокоєння. Усі стовпці АС масштабуються окремо, як описано вище.

КОД

import pandas as pd
import scipy.stats as ss
from sklearn.preprocessing import StandardScaler


data= [[1, 1, 1, 1, 1],[2, 5, 10, 50, 100],[3, 10, 20, 150, 200],[4, 15, 40, 200, 300]]

df = pd.DataFrame(data, columns=['N0', 'N1', 'N2', 'N3', 'N4']).astype('float64')

sc_X = StandardScaler()
df = sc_X.fit_transform(df)

num_cols = len(df[0,:])
for i in range(num_cols):
    col = df[:,i]
    col_stats = ss.describe(col)
    print(col_stats)

ВИХІД

DescribeResult(nobs=4, minmax=(-1.3416407864998738, 1.3416407864998738), mean=0.0, variance=1.3333333333333333, skewness=0.0, kurtosis=-1.3599999999999999)
DescribeResult(nobs=4, minmax=(-1.2828087129930659, 1.3778315806221817), mean=-5.551115123125783e-17, variance=1.3333333333333337, skewness=0.11003776770595125, kurtosis=-1.394993095506219)
DescribeResult(nobs=4, minmax=(-1.155344148338584, 1.53471088361394), mean=0.0, variance=1.3333333333333333, skewness=0.48089217736510326, kurtosis=-1.1471008824318165)
DescribeResult(nobs=4, minmax=(-1.2604572012883055, 1.2668071116222517), mean=-5.551115123125783e-17, variance=1.3333333333333333, skewness=0.0056842140599118185, kurtosis=-1.6438177182479734)
DescribeResult(nobs=4, minmax=(-1.338945389819976, 1.3434309690153527), mean=5.551115123125783e-17, variance=1.3333333333333333, skewness=0.005374558840039456, kurtosis=-1.3619131970819205)

1
Чому дисперсія не дорівнює 1, будь ласка?
Макс

6

Далі наведено простий робочий приклад, який пояснює, як працює розрахунок стандартизації. Теоретична частина вже добре пояснена в інших відповідях.

>>>import numpy as np
>>>data = [[6, 2], [4, 2], [6, 4], [8, 2]]
>>>a = np.array(data)

>>>np.std(a, axis=0)
array([1.41421356, 0.8660254 ])

>>>np.mean(a, axis=0)
array([6. , 2.5])

>>>from sklearn.preprocessing import StandardScaler
>>>scaler = StandardScaler()
>>>scaler.fit(data)
>>>print(scaler.mean_)

#Xchanged = (X−μ)/σ  WHERE σ is Standard Deviation and μ is mean
>>>z=scaler.transform(data)
>>>z

Розрахунок

Як ви можете бачити на виході, середнє значення [6. , 2.5], а стандартне відхилення становить [1.41421356, 0.8660254]

Дані (0,1) позиція 2 Стандартизація = (2 - 2,5) /0,8660254 = -0,57735027

Дані в положенні (1,0) становлять 4 Стандартизація = (4-6) /1,41421356 = -1,414

Результат після стандартизації

введіть тут опис зображення

Перевірте середнє та стандартне відхилення після стандартизації

введіть тут опис зображення

Примітка: -2,77555756e-17 дуже близький до 0.

Список літератури

  1. Порівняйте вплив різних скалерів на дані з викидами

  2. Яка різниця між нормалізацією та стандартизацією?

  3. Середнє значення даних, масштабоване за допомогою sklearn StandardScaler, не дорівнює нулю


3

Після нанесення StandardScaler(), кожен стовпець в X буде мати середнє значення 0 і стандартне відхилення 1.

Формули перераховані іншими на цій сторінці.

Обґрунтування: деякі алгоритми вимагають даних, щоб виглядати так (див. Sklearn docs ).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.