Czy ktoś może mi wyjaśnić StandardScaler?

Odpowiedzi:

112

Pomysł StandardScalerpolega na tym, że przekształci dane w taki sposób, aby ich dystrybucja miała średnią wartość 0 i odchylenie standardowe 1.
W przypadku danych wielowymiarowych odbywa się to według cech (innymi słowy niezależnie dla każdej kolumny danych) .
Biorąc pod uwagę rozkład danych, od każdej wartości w zbiorze danych zostanie odjęta średnia wartość, a następnie podzielona przez odchylenie standardowe całego zbioru danych (lub cechy w przypadku wielowymiarowym).

user6903745
źródło
4
Uważam, że ta odpowiedź jest nieprawidłowa. each value in the dataset will have the sample mean value subtracted-- to nie jest prawda. Średnia z KAŻDEJ cechy / kolumny zostanie odjęta od wartości określonej kolumny. Odbywa się to według kolumn. Nie ma sample mean value subtracted- Zobacz moją odpowiedź poniżej
seralouk
@makis Zmieniłem odpowiedź zgodnie z sugestią, którą sugerujesz.
user6903745
110

Wprowadzenie: Zakładam, że masz macierz, w Xktórej każdy wiersz / wiersz jest próbką / obserwacją, a każda kolumna jest zmienną / funkcją (przy okazji jest to oczekiwane dane wejściowe dla dowolnej sklearnfunkcji ML - X.shapepowinno być [number_of_samples, number_of_features]).


Trzon metody : Główną ideą jest normalizować / STANDARDIZE tzn μ = 0i σ = 1twoi funkcje / zmienne / kolumny X, indywidualnie , przed zastosowaniem jakiegokolwiek modelu uczenia maszynowego.

StandardScaler()będzie normalizować funkcje tj każdą kolumnę X INDYWIDUALNIE , tak, że każda kolumna / funkcja / zmienna będzie mieć μ = 0i σ = 1.


PS: Uważam, że najbardziej pozytywna odpowiedź na tej stronie jest błędna. Cytuję „każda wartość w zbiorze danych będzie miała odejmowaną średnią wartość próbki” - To nie jest ani prawdziwe, ani poprawne.


Zobacz też: Jak i dlaczego standaryzować dane: samouczek Pythona


Przykład:

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.]]

Sprawdź, czy średnia dla każdej cechy (kolumny) wynosi 0:

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

Sprawdź, czy standardem każdej funkcji (kolumny) jest 1:

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

Matematyka:

wprowadź opis obrazu tutaj


UPDATE 08/2020 : W odniesieniu do parametrów wejściowych with_meani with_stddo False/ True, podałem tutaj odpowiedź: różnica StandardScaler między „with_std = False or True” a „with_mean = False or True”

seralouk
źródło
Czy masz jakiś pomysł, dlaczego mam [1.15, 1.15]kiedy obliczyć jako pand DF: pd.DataFrame(scaled_data).std(0)?
Sos
kiedy biegnę pd.DataFrame(scaled_data)[0], otrzymuję serię z Name: 0, dtype: float64wartościami i [-1.0, 1.0, -1.0, 1.0]. Przepraszamy za formatowanie
Sos
@seralouk Podobała mi się twoja odpowiedź, ale wciąż zastanawiam się, jaki jest cel przekształcania danych wejściowych za pomocą StandardScaler, czy sprawia, że ​​algorytm uczenia maszynowego działa szybciej, czy pomaga podejmować trafniejsze decyzje, czy coś innego?
sepisoad
Standaryzacja zbioru danych jest częstym wymaganiem dla wielu estymatorów uczenia maszynowego: mogą one działać źle, jeśli poszczególne cechy nie wyglądają mniej więcej jak standardowe dane o rozkładzie normalnym (np. Gaussa z zerową średnią i jednostkową wariancją). Na przykład wiele elementów wykorzystywanych w funkcji celu algorytmu uczącego się (takich jak jądro RBF SVM lub regulatory L1 i L2 modeli liniowych) zakłada, że ​​wszystkie cechy są wyśrodkowane wokół 0 i mają wariancję w tej samej kolejności.
seralouk
Tak więc standaryzacja prowadzi do a) bardziej stabilnego b) mniejszego wpływu zakresu zmiennych c) szybszego dopasowania d) bardziej stabilnego działania
seralouk
24

StandardScaler wykonuje zadanie standaryzacji . Zwykle zbiór danych zawiera zmienne o różnej skali. Na przykład zbiór danych pracownika będzie zawierał kolumnę WIEK z wartościami ze skali 20-70 oraz kolumnę PŁATNOŚĆ z wartościami ze skali 10000-80000 .
Ponieważ te dwie kolumny różnią się skalą, zostały ustandaryzowane, aby mieć wspólną skalę podczas budowania modelu uczenia maszynowego.

krish___na
źródło
10

Jest to przydatne, gdy chcesz porównać dane odpowiadające różnym jednostkom. W takim przypadku chcesz usunąć jednostki. Aby to zrobić w spójny sposób wszystkich danych, należy przekształcić dane w taki sposób, aby wariancja była jednolita, a średnia szeregu wynosiła 0.

Riccardo Petraglia
źródło
1
Czy możesz wyjaśnić na przykładzie… jak to pomaga? .. to było naprawdę
pomocne… dzięki
7

Poniżej znajduje się prosty przykład roboczy wyjaśniający, jak działają obliczenia standaryzacji. Część teoretyczna jest już dobrze wyjaśniona w innych odpowiedziach.

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

Obliczenie

Jak widać na wyjściu, średnia wynosi [6. , 2,5], a odchylenie standardowe wynosi [1,41421356, 0,8660254]

Dane to (0,1) pozycja to 2 Standaryzacja = (2 - 2,5) / 0,8660254 = -0,57735027

Dane w pozycji (1,0) to 4 Standaryzacja = (4-6) / 1,41421356 = -1,414

Wynik po standaryzacji

wprowadź opis obrazu tutaj

Sprawdź średnią i odchylenie standardowe po standaryzacji

wprowadź opis obrazu tutaj

Uwaga: -2,77555756e-17 jest bardzo bliskie 0.

Bibliografia

  1. Porównaj wpływ różnych skalerów na dane z wartościami odstającymi

  2. Jaka jest różnica między normalizacją a normalizacją?

  3. Średnia danych skalowanych za pomocą sklearn StandardScaler nie wynosi zero

LCJ
źródło
5

Powyższe odpowiedzi są świetne, ale potrzebowałem prostego przykładu, aby złagodzić niektóre obawy, które miałem w przeszłości. Chciałem się upewnić, że rzeczywiście traktuje każdą kolumnę osobno. Jestem teraz spokojny i nie mogę znaleźć przykładu, który wzbudził we mnie niepokój. Wszystkie kolumny skalowane oddzielnie, jak opisano powyżej.

KOD

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)

WYNIK

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)

UWAGA:

Moduł scipy.stats prawidłowo raportuje wariancję „próbki”, która używa (n - 1) w mianowniku. Wariancja „populacji” użyłaby n jako mianownika do obliczenia wariancji. Aby lepiej zrozumieć, zapoznaj się z poniższym kodem, który wykorzystuje skalowane dane z pierwszej kolumny powyższego zestawu danych:

Kod

import scipy.stats as ss

sc_Data = [[-1.34164079], [-0.4472136], [0.4472136], [1.34164079]]
col_stats = ss.describe([-1.34164079, -0.4472136, 0.4472136, 1.34164079])
print(col_stats)
print()

mean_by_hand = 0
for row in sc_Data:
    for element in row:
        mean_by_hand += element
mean_by_hand /= 4

variance_by_hand = 0
for row in sc_Data:
    for element in row:
        variance_by_hand += (mean_by_hand - element)**2
sample_variance_by_hand = variance_by_hand / 3
sample_std_dev_by_hand = sample_variance_by_hand ** 0.5

pop_variance_by_hand = variance_by_hand / 4
pop_std_dev_by_hand = pop_variance_by_hand ** 0.5

print("Sample of Population Calcs:")
print(mean_by_hand, sample_variance_by_hand, sample_std_dev_by_hand, '\n')
print("Population Calcs:")
print(mean_by_hand, pop_variance_by_hand, pop_std_dev_by_hand)

Wynik

DescribeResult(nobs=4, minmax=(-1.34164079, 1.34164079), mean=0.0, variance=1.3333333422778562, skewness=0.0, kurtosis=-1.36000000429325)

Sample of Population Calcs:
0.0 1.3333333422778562 1.1547005422523435

Population Calcs:
0.0 1.000000006708392 1.000000003354196
Thom Ives
źródło
2
Dlaczego wariancja nie jest 1, proszę?
Max
To jest źle. standardowo powinno być 1
seralouk
@Max, statystyki scipy używają wariancji próbki. Zobacz nowe dodatki do odpowiedzi.
Thom Ives
@seralouk Tak, jeśli wariancja populacji i odchylenie standardowe, ale nie dla wariancji próbki i odchylenia standardowego - statystyki scipy domyślnie odpowiadają obliczeniom próbki.
Thom Ives
3

Po zastosowaniu StandardScaler(), każda kolumna X będzie mieć średnią i odchylenie standardowe 0 1.

Formuły są wymienione przez innych na tej stronie.

Uzasadnienie: niektóre algorytmy wymagają danych, aby wyglądały w ten sposób (zobacz dokumentację sklearn ).

Paweł
źródło
Poprawny. Niektóre odpowiedzi przedstawiające statystykę scipy opis średniej i wariancji próbki danych skalowanych. Wariancja próbki dla małych zestawów danych może znacznie różnić się od wariancji populacji.
Thom Ives
0

Aplikujemy StandardScalar() szeregowo.

Tak więc dla każdego wiersza w kolumnie (zakładam, że pracujesz z ramką Pandas DataFrame):

x_new = (x_original - mean_of_distribution) / std_of_distribution

Kilka punktów -

  1. Nazywa się to skalarną standardową, ponieważ dzielimy ją przez odchylenie standardowe rozkładu (dystr. Cechy). Podobnie możesz zgadnąć MinMaxScalar().

  2. Oryginalna dystrybucja pozostaje taka sama po zastosowaniu StandardScalar(). Powszechnym błędem jest przekonanie, że rozkład zostaje zmieniony na rozkład normalny. Po prostu zmniejszamy zakres do [0, 1].

hansrajSwapnil
źródło