Nie rozumiem strony z StandardScaler
dokumentacją sklearn
.
Czy ktoś może mi to wyjaśnić w prostych słowach?
python
machine-learning
scikit-learn
scaling
standardized
nitinvijay23
źródło
źródło
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 masample mean value subtracted
- Zobacz moją odpowiedź poniżejWprowadzenie: Zakładam, że masz macierz, w
X
któ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 dowolnejsklearn
funkcji ML -X.shape
powinno być[number_of_samples, number_of_features]
).Trzon metody : Główną ideą jest normalizować / STANDARDIZE tzn
μ = 0
iσ = 1
twoi funkcje / zmienne / kolumnyX
, 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ćμ = 0
iσ = 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:
UPDATE 08/2020 : W odniesieniu do parametrów wejściowych
with_mean
iwith_std
doFalse
/True
, podałem tutaj odpowiedź: różnica StandardScaler między „with_std = False or True” a „with_mean = False or True”źródło
[1.15, 1.15]
kiedy obliczyć jako pand DF:pd.DataFrame(scaled_data).std(0)
?pd.DataFrame(scaled_data)[0]
, otrzymuję serię zName: 0, dtype: float64
wartościami i[-1.0, 1.0, -1.0, 1.0]
. Przepraszamy za formatowanieStandardScaler
, czy sprawia, że algorytm uczenia maszynowego działa szybciej, czy pomaga podejmować trafniejsze decyzje, czy coś innego?Jak to obliczyć:
Możesz przeczytać więcej tutaj:
źródło
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.
źródło
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.
źródło
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
Sprawdź średnią i odchylenie standardowe po standaryzacji
Uwaga: -2,77555756e-17 jest bardzo bliskie 0.
Bibliografia
Porównaj wpływ różnych skalerów na dane z wartościami odstającymi
Jaka jest różnica między normalizacją a normalizacją?
Średnia danych skalowanych za pomocą sklearn StandardScaler nie wynosi zero
źródło
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 SĄ 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
źródło
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 ).
źródło
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 -
Nazywa się to skalarną standardową, ponieważ dzielimy ją przez odchylenie standardowe rozkładu (dystr. Cechy). Podobnie możesz zgadnąć
MinMaxScalar()
.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].źródło