Kann mir jemand StandardScaler erklären?

Antworten:

105

Die Idee dahinter StandardScalerist, dass Ihre Daten so transformiert werden, dass ihre Verteilung einen Mittelwert von 0 und eine Standardabweichung von 1 aufweist.
Bei multivariaten Daten erfolgt dies merkmalsmäßig (dh unabhängig für jede Datenspalte). .
Bei gegebener Verteilung der Daten wird für jeden Wert im Datensatz der Mittelwert abgezogen und dann durch die Standardabweichung des gesamten Datensatzes (oder des Merkmals im multivariaten Fall) dividiert.

user6903745
quelle
3
Ich finde, dass diese Antwort nicht richtig ist. each value in the dataset will have the sample mean value subtracted-- das ist nicht wahr. Der Mittelwert JEDES Merkmals / jeder Spalte wird von den Werten der jeweiligen Spalte abgezogen. Dies erfolgt spaltenweise. Es gibt keine sample mean value subtracted- siehe meine Antwort unten
Seralouk
@makis Ich habe meine Antwort nach der von Ihnen vorgeschlagenen Klarstellung bearbeitet.
user6903745
97

Intro: Ich gehe davon aus, dass Sie eine Matrix haben, Xin der jede Zeile / Zeile eine Stichprobe / Beobachtung und jede Spalte eine Variable / ein Merkmal ist (dies ist sklearnübrigens die erwartete Eingabe für jede ML-Funktion - X.shapesollte es sein [number_of_samples, number_of_features]).


Kern der Methode : Die Hauptidee ist zu normalisieren / standardisiert dh μ = 0und σ = 1Ihre Funktionen / Variablen / Spalten X, einzeln , bevor jede Maschine Lernmodell anwenden.

StandardScaler()wird normalisiert die Merkmale dh jede Spalte von X, EINZELN , so dass jede Spalte / Feature / Variabel wird μ = 0und σ = 1.


PS: Ich finde die am besten bewertete Antwort auf dieser Seite falsch. Ich zitiere "Für jeden Wert im Datensatz wird der Stichprobenmittelwert abgezogen" - Dies ist weder wahr noch richtig.


Siehe auch: Wie und warum Sie Ihre Daten standardisieren: Ein Python-Tutorial


Beispiel:

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

Stellen Sie sicher, dass der Mittelwert jedes Features (Spalte) 0 ist:

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

Stellen Sie sicher, dass der Standard für jedes Feature (Spalte) 1 ist:

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

Die Mathematik:

Geben Sie hier die Bildbeschreibung ein


UPDATE 08/2019 : Nach Eingabe der Eingabeparameter with_meanund with_stdzu False/ habe Trueich hier eine Antwort gegeben: StandardScaler-Unterschied zwischen "with_std = False oder True" und "with_mean = False oder True"

Seralouk
quelle
Haben Sie eine Idee, warum ich bekomme, [1.15, 1.15]wenn ich als Pandas rechne pd.DataFrame(scaled_data).std(0)?
Sos
Wenn ich laufe, pd.DataFrame(scaled_data)[0]bekomme ich eine Reihe mit Name: 0, dtype: float64und Werten [-1.0, 1.0, -1.0, 1.0]. Entschuldigung für die Formatierung
Sos
@seralouk Ich mochte Ihre Antwort, aber ich frage mich immer noch, was die Absicht hinter der Transformation von Eingabedaten ist, ob StandardScalerder Algorithmus für maschinelles Lernen dadurch schneller wird oder ob genauere Entscheidungen getroffen werden oder etwas anderes?
Sepisoad
Die Standardisierung eines Datensatzes ist eine häufige Anforderung für viele Schätzer des maschinellen Lernens: Sie können sich schlecht verhalten, wenn die einzelnen Merkmale nicht mehr oder weniger wie normalverteilte Standarddaten aussehen (z. B. Gauß mit 0 Mittelwert und Einheitsvarianz). Beispielsweise gehen viele Elemente, die in der Zielfunktion eines Lernalgorithmus verwendet werden (wie der RBF-Kernel von SVM oder die L1- und L2-Regularisierer von linearen Modellen), davon aus, dass alle Merkmale um 0 zentriert sind und eine Varianz in derselben Reihenfolge aufweisen.
Seralouk
Standardisierung führt also zu a) stabiler b) weniger beeinflusst durch den Variablenbereich c) schnellerer Anpassung d) stabilerer Leistung
seralouk
22

StandardScaler führt die Aufgabe der Standardisierung aus . Normalerweise enthält ein Datensatz Variablen mit unterschiedlichem Maßstab. Beispielsweise enthält ein Mitarbeiterdatensatz eine AGE-Spalte mit Werten auf der Skala 20-70 und eine SALARY-Spalte mit Werten auf der Skala 10000-80000 .
Da sich diese beiden Spalten im Maßstab unterscheiden, sind sie standardisiert, um beim Erstellen eines Modells für maschinelles Lernen einen gemeinsamen Maßstab zu haben.

krish___na
quelle
10

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 für alle Daten zu tun, transformieren Sie die Daten so, dass die Varianz einheitlich ist und der Mittelwert der Reihe 0 ist.

Riccardo Petraglia
quelle
1
Kannst du uns bitte anhand eines Beispiels erklären, wie es hilft? Das ist wirklich hilfreich. Danke
Lakshay
6

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 sicherstellen, dass tatsächlich jede Spalte einzeln behandelt wird. Ich bin jetzt beruhigt und kann nicht finden, welches Beispiel mich beunruhigt hat. Alle Spalten ARE separat skaliert , wie oben von denen beschrieben.

CODE

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)

AUSGABE

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)
Thom Ives
quelle
1
Warum ist Varianz bitte nicht 1?
Max
6

Im Folgenden wird anhand eines einfachen Arbeitsbeispiels erläutert, wie die Standardisierungsberechnung funktioniert. 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 die Standardabweichung beträgt [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

Geben Sie hier die Bildbeschreibung ein

Überprüfen Sie den Mittelwert und die Standardabweichung nach der Standardisierung

Geben Sie hier die Bildbeschreibung ein

Hinweis: -2.77555756e-17 liegt sehr nahe bei 0.

Verweise

  1. Vergleichen Sie die Auswirkungen verschiedener Skalierer auf Daten mit Ausreißern

  2. Was ist der Unterschied zwischen Normalisierung und Standardisierung?

  3. Der Mittelwert der mit sklearn StandardScaler skalierten Daten ist nicht Null

LCJ
quelle
3

Nach dem Anwenden StandardScaler()hat jede Spalte in X einen Mittelwert von 0 und eine Standardabweichung von 1.

Formeln werden von anderen auf dieser Seite aufgelistet.

Begründung: Einige Algorithmen erfordern Daten, die so aussehen (siehe sklearn-Dokumente ).

Paul
quelle