Nie rozumiem strony z StandardScaler
dokumentacją sklearn
.
Czy ktoś może mi to wyjaśnić w prostych słowach?
Nie rozumiem strony z StandardScaler
dokumentacją sklearn
.
Czy ktoś może mi to wyjaśnić w prostych słowach?
Odpowiedzi:
Pomysł StandardScaler
polega 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 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 dowolnej sklearn
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 / 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ć μ = 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
i with_std
do 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: float64
wartoś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