Nie rozumiem strony z StandardScalerdokumentacją sklearn.
Czy ktoś może mi to wyjaśnić w prostych słowach?
Nie rozumiem strony z StandardScalerdokumentacją sklearn.
Czy ktoś może mi to wyjaśnić w prostych słowach?
Odpowiedzi:
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).
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:
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”
[1.15, 1.15]kiedy obliczyć jako pand DF: pd.DataFrame(scaled_data).std(0)?
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
StandardScaler, 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:
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.
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.
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
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.
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)
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:
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)
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
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 ).
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].
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żej