Ich kann die page der StandardScaler
in der Dokumentation von sklearn
nicht verstehen.
Kann mir das jemand einfach erklären?
Die Idee hinter StandardScaler
ist, dass Ihre Daten so umgeformt werden, dass ihre Verteilung einen Mittelwert von 0 und eine Standardabweichung von 1 aufweist. Aufgrund der Verteilung der Daten wird für jeden Wert in der Datenmenge der Mittelwert der Stichprobe abgezogen. und dann durch die Standardabweichung des gesamten Datensatzes geteilt.
So berechnen Sie es:
Sie können hier mehr lesen:
mean = 0
und standard deviation = 1
), bevor Sie maschinelle Lerntechniken anwenden.Wichtig ist, dass die meisten (wenn nicht alle) scikit-learn
Modelle/Klassen/Funktionen eine Matrix X
mit Dimensions/Shape [number_of_samples, number_of_features]
als Eingabe erwarten. Dies ist sehr wichtig. Einige andere Bibliotheken erwarten als Eingabe die Umkehrung.
StandardScaler()
normalisiert die Features (jede Spalte von X), so dass jede Spalte/Feature/Variable mean = 0
und standard deviation = 1
hat.
Beispiel:
from sklearn.preprocessing import StandardScaler
import numpy as np
data = np.array([[0, 0], [0, 0], [1, 1], [1, 1]])
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)
print(data)
[[0 0]
[0 0]
[1 1]
[1 1]]
print(scaled_data)
[[-1. -1.]
[-1. -1.]
[ 1. 1.]
[ 1. 1.]]
Vergewissern Sie sich, dass der Mittelwert jedes Merkmals (Spalte) 0 ist:
scaled_data.mean(axis = 0)
array([0., 0.])
Vergewissern Sie sich, dass der Standardwert jedes Merkmals (Spalte) 1 ist:
scaled_data.std(axis = 0)
array([1., 1.])
StandardScaler übernimmt die Aufgabe der Standardisierung . Normalerweise enthält ein Dataset Variablen, deren Skala unterschiedlich ist. Für z. Ein Mitarbeiter-Datensatz enthält eine AGE-Spalte mit Werten auf Skala 20-70 und SALARY-Spalte mit Werten auf Skala 10000-80000 .
Da sich diese beiden Säulen im Maßstab unterscheiden, sind sie standardisiert, um beim Erstellen eines maschinellen Lernmodells einen gemeinsamen Maßstab zu haben.
Dies ist nützlich, wenn Sie Daten vergleichen möchten, die verschiedenen Einheiten entsprechen. In diesem Fall möchten Sie die Einheiten entfernen. Um dies auf konsistente Weise zu tun, transformieren Sie die Daten in einer Weise, dass die Varianz einheitlich ist und der Mittelwert der Reihe 0 ist.
Im Folgenden wird anhand eines einfachen Arbeitsbeispiels die Funktionsweise der Standardisierungsberechnung erläutert. Der theoretische Teil ist bereits in anderen Antworten gut erklärt.
>>>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
Berechnung
Wie Sie in der Ausgabe sehen können, ist der Mittelwert [6. , 2.5] und Standardabweichung ist [1.41421356, 0.8660254]
Daten sind (0,1) Position ist 2 Standardisierung = (2 - 2,5)/0,8660254 = -0,57735027
Daten in (1,0) -Position sind 4 Standardisierung = (4-6)/1,41421356 = -1,414
Ergebnis nach Standardisierung
Mittelwert und Standardabweichung nach Standardisierung prüfen
Hinweis: -2.77555756e-17 liegt sehr nahe bei 0.
Referenzen
Nach dem Anwenden von StandardScaler()
hat jede Spalte in X den Mittelwert 0 und die Standardabweichung von 1.
Formeln werden von anderen auf dieser Seite aufgelistet.
Begründung: Für einige Algorithmen müssen Daten so aussehen (siehe sklearn docs ).
Die obigen Antworten sind großartig, aber ich brauchte ein einfaches Beispiel, um einige Bedenken auszuräumen, die ich in der Vergangenheit hatte. Ich wollte sichergehen, dass jede Säule separat behandelt wird. Ich bin jetzt beruhigt und kann nicht herausfinden, welches Beispiel mich beunruhigt hatte. Alle SpaltenWERDENseparat skaliert, wie oben beschrieben.
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)