Qualcuno può spiegarmi StandardScaler?


Risposte:


106

L'idea alla base StandardScalerè che trasformerà i tuoi dati in modo tale che la loro distribuzione abbia un valore medio 0 e una deviazione standard di 1.
In caso di dati multivariati, questo viene fatto per funzionalità (in altre parole indipendentemente per ogni colonna di dati) .
Data la distribuzione dei dati, ogni valore nel set di dati avrà il valore medio sottratto e quindi diviso per la deviazione standard dell'intero set di dati (o caratteristica nel caso multivariato).


3
Trovo che questa risposta non sia corretta. each value in the dataset will have the sample mean value subtracted-- questo non è vero. La media di OGNI caratteristica / colonna verrà sottratta dai valori della colonna specifica. Questa operazione viene eseguita in base alla colonna. Non c'è sample mean value subtracted- Vedi la mia risposta qui sotto
seralouk

@makis ho modificato la mia risposta seguendo il chiarimento che suggerisci.
user6903745

98

Intro: presumo che tu abbia una matrice in Xcui ogni riga / linea è un campione / osservazione e ogni colonna è una variabile / caratteristica (questo è l'input previsto per qualsiasi sklearnfunzione ML, tra l'altro - X.shapedovrebbe essere [number_of_samples, number_of_features]).


Core del metodo : l'idea principale è quella di normalizzare / standardizzare ie μ = 0e le σ = 1tue caratteristiche / variabili / colonne di X, individualmente , prima di applicare qualsiasi modello di apprendimento automatico.

StandardScaler()si normalizzare le caratteristiche esempio ogni colonna di X, INDIVIDUALMENTE , in modo che ogni colonna / funzione / variabile avranno μ = 0e σ = 1.


PS: trovo la risposta più votata in questa pagina, sbagliata. Sto citando "ogni valore nel set di dati avrà il valore medio del campione sottratto" - Questo non è né vero né corretto.


Vedi anche: Come e perché standardizzare i tuoi dati: un tutorial su Python


Esempio:

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

Verifica che la media di ogni caratteristica (colonna) sia 0:

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

Verifica che lo standard di ogni caratteristica (colonna) sia 1:

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

La matematica:

inserisci qui la descrizione dell'immagine


AGGIORNAMENTO 08/2019 : Riguardo ai parametri di input with_meane with_stda False/ True, ho fornito una risposta qui: Differenza di StandardScaler tra "with_std = False or True" e "with_mean = False o True"


Avete qualche idea del perché ottengo [1.15, 1.15]quando computo come un panda df: pd.DataFrame(scaled_data).std(0)?
Sos

quando corro pd.DataFrame(scaled_data)[0]ottengo una serie con Name: 0, dtype: float64e valori [-1.0, 1.0, -1.0, 1.0]. Ci scusiamo per la formattazione
Sos

@seralouk Mi è piaciuto la tua risposta, tuttavia mi chiedo ancora qual è l'intenzione dietro la trasformazione dei dati di input utilizzando StandardScaler, rende l'algoritmo di apprendimento automatico più veloce o aiuta a prendere decisioni più accurate o qualcos'altro?
settembre

La standardizzazione di un set di dati è un requisito comune per molti stimatori di machine learning: potrebbero comportarsi male se le singole caratteristiche non sembrano più o meno dati standard normalmente distribuiti (es. Gaussiana con media 0 e varianza unitaria). Ad esempio, molti elementi utilizzati nella funzione obiettivo di un algoritmo di apprendimento (come il kernel RBF di SVM o i regolarizzatori L1 e L2 di modelli lineari) presumono che tutte le caratteristiche siano centrate attorno a 0 e abbiano varianza nello stesso ordine.
seralouk

Quindi, la standardizzazione porta a a) più stabile b) meno influenzato dalla gamma di variabili c) adattamento più veloce d) prestazioni più stabili
seralouk


22

StandardScaler svolge il compito di standardizzazione . Di solito un set di dati contiene variabili di scala diversa. Ad esempio, un dataset di un dipendente conterrà la colonna ETÀ con valori su scala 20-70 e la colonna SALARIO con valori su scala 10000-80000 .
Poiché queste due colonne sono di scala diversa, sono standardizzate per avere una scala comune durante la creazione del modello di apprendimento automatico.


10

Ciò è utile quando si desidera confrontare dati che corrispondono a unità diverse. In tal caso, si desidera rimuovere le unità. Per fare ciò in modo coerente di tutti i dati, trasformi i dati in modo che la varianza sia unitaria e che la media della serie sia 0.


1
puoi spiegarmi con un esempio ... come in come aiuta? .. sarebbe davvero
utile..grazie

6

Le risposte di cui sopra sono ottime, ma avevo bisogno di un semplice esempio per alleviare alcune preoccupazioni che ho avuto in passato. Volevo assicurarmi che stesse effettivamente trattando ciascuna colonna separatamente. Ora sono rassicurato e non riesco a trovare quale esempio mi abbia causato preoccupazione. Tutte le colonne SONO ridimensionate separatamente come descritto da quelle sopra.

CODICE

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)

PRODUZIONE

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)

1
Perché la varianza non è 1, per favore?
Max

6

Di seguito è riportato un semplice esempio di lavoro per spiegare come funziona il calcolo della standardizzazione. La parte teorica è già ben spiegata in altre risposte.

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

Calcolo

Come puoi vedere nell'output, la media è [6. , 2.5] e la deviazione std è [1.41421356, 0.8660254]

I dati sono (0,1) la posizione è 2 Standardizzazione = (2 - 2.5) /0.8660254 = -0.57735027

I dati nella posizione (1,0) sono 4 Standardizzazione = (4-6) /1.41421356 = -1.414

Risultato dopo la standardizzazione

inserisci qui la descrizione dell'immagine

Controllare la media e la deviazione std dopo la standardizzazione

inserisci qui la descrizione dell'immagine

Nota: -2.77555756e-17 è molto vicino a 0.

Riferimenti

  1. Confronta l'effetto di diversi scaler sui dati con valori anomali

  2. Qual è la differenza tra normalizzazione e standardizzazione?

  3. La media dei dati scalati con sklearn StandardScaler non è zero


3

Dopo l'applicazione StandardScaler(), ogni colonna in X avrà media 0 e deviazione standard 1.

Le formule sono elencate da altri in questa pagina.

Razionale: alcuni algoritmi richiedono che i dati abbiano questo aspetto (vedere la documentazione di sklearn ).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.