Quelqu'un peut-il m'expliquer StandardScaler?

Réponses:

106

L'idée derrière StandardScalerest qu'il transformera vos données de telle sorte que sa distribution aura une valeur moyenne de 0 et un écart type de 1.
En cas de données multivariées, cela se fait par fonctionnalité (en d'autres termes indépendamment pour chaque colonne des données) .
Compte tenu de la distribution des données, chaque valeur de l'ensemble de données aura la valeur moyenne soustraite, puis divisée par l'écart type de l'ensemble de données (ou entité dans le cas multivarié).

user6903745
la source
3
Je trouve que cette réponse n'est pas correcte. each value in the dataset will have the sample mean value subtracted-- ce n'est pas vrai. La moyenne de CHAQUE caractéristique / colonne sera soustraite des valeurs de la colonne spécifique. Cela se fait par colonne. Il n'y a pas sample mean value subtracted- Voir ma réponse ci
seralouk
@makis J'ai modifié ma réponse à la suite de la clarification que vous suggérez.
user6903745
103

Intro: Je suppose que vous avez une matrice Xoù chaque ligne / ligne est un échantillon / observation et chaque colonne est une variable / caractéristique (c'est l'entrée attendue pour toute sklearnfonction ML d'ailleurs - X.shapedevrait être [number_of_samples, number_of_features]).


Cœur de la méthode : L'idée principale est de normaliser / standardiser ie μ = 0et σ = 1vos fonctionnalités / variables / colonnes de X, individuellement , avant d' appliquer tout modèle d'apprentissage automatique.

StandardScaler()va normaliser les caractéristiques dire que chaque colonne de X, INDIVIDUELLEMENT , de sorte que chaque colonne / fonction / variables auront μ = 0et σ = 1.


PS: Je trouve la réponse la plus votée sur cette page, fausse. Je cite "chaque valeur de l'ensemble de données aura la valeur moyenne de l'échantillon soustraite" - Ce n'est ni vrai ni correct.


Voir aussi: Comment et pourquoi standardiser vos données: un tutoriel python


Exemple:

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

Vérifiez que la moyenne de chaque caractéristique (colonne) est 0:

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

Vérifiez que le std de chaque fonctionnalité (colonne) est 1:

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

Les maths:

entrez la description de l'image ici


MISE À JOUR 08/2019 : Concernant les paramètres d'entrée with_meanet with_stdà False/ True, j'ai fourni une réponse ici: Différence StandardScaler entre "with_std = False or True" et "with_mean = False or True"

seralouk
la source
Avez - vous une idée pourquoi je reçois [1.15, 1.15]quand je calcule comme Pandas df: pd.DataFrame(scaled_data).std(0)?
Sos
quand je cours, pd.DataFrame(scaled_data)[0]j'obtiens une série avec Name: 0, dtype: float64et des valeurs [-1.0, 1.0, -1.0, 1.0]. Désolé pour le formatage
Sos
@seralouk J'ai aimé votre réponse, mais je me demande toujours quelle est l'intention derrière la transformation des données d'entrée en utilisant StandardScaler, cela accélère- t-il l'algorithme d'apprentissage automatique, aide -t-il à prendre des décisions plus précises, ou autre chose?
sepisoad
La normalisation d'un ensemble de données est une exigence courante pour de nombreux estimateurs d'apprentissage automatique: ils peuvent se comporter mal si les caractéristiques individuelles ne ressemblent pas plus ou moins à des données standard normalement distribuées (par exemple, gaussienne avec une moyenne de 0 et une variance unitaire). Par exemple, de nombreux éléments utilisés dans la fonction objective d'un algorithme d'apprentissage (comme le noyau RBF de SVM ou les régulariseurs L1 et L2 des modèles linéaires) supposent que toutes les entités sont centrées autour de 0 et ont une variance dans le même ordre.
seralouk
Ainsi, la normalisation conduit à a) plus stable b) moins influencée par la gamme de variables c) un ajustement plus rapide d) des performances plus stables
seralouk
23

StandardScaler effectue la tâche de normalisation . En général, un ensemble de données contient des variables d'échelle différente. Par exemple, un ensemble de données Employé contiendra une colonne AGE avec des valeurs sur l'échelle 20-70 et une colonne SALAIRE avec des valeurs sur l'échelle 10000-80000 .
Comme ces deux colonnes ont des échelles différentes, elles sont standardisées pour avoir une échelle commune lors de la création du modèle d'apprentissage automatique.

krish___na
la source
10

Ceci est utile lorsque vous souhaitez comparer des données correspondant à différentes unités. Dans ce cas, vous souhaitez supprimer les unités. Pour faire cela de manière cohérente de toutes les données, vous transformez les données de manière à ce que la variance soit unitaire et que la moyenne de la série soit égale à 0.

Riccardo Petraglia
la source
1
pouvez-vous expliquer avec un exemple..comme en quoi cela aide? .. que wud être vraiment
utile..merci
6

Les réponses ci-dessus sont excellentes, mais j'avais besoin d'un exemple simple pour atténuer certaines préoccupations que j'ai eues dans le passé. Je voulais m'assurer qu'il traitait effectivement chaque colonne séparément. Je suis maintenant rassuré et ne trouve pas quel exemple m'avait inquiété. Toutes les colonnes SONT mises à l'échelle séparément comme décrit par celles ci-dessus.

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)

PRODUCTION

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
la source
1
Pourquoi la variance n'est pas 1, s'il vous plaît?
Max
6

Voici un exemple de travail simple pour expliquer le fonctionnement du calcul de la normalisation. La partie théorique est déjà bien expliquée dans d'autres réponses.

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

Calcul

Comme vous pouvez le voir dans la sortie, la moyenne est [6. , 2,5] et l'écart type est [1,41421356, 0,8660254]

Les données sont (0,1) la position est 2 Standardisation = (2 - 2.5) /0.8660254 = -0.57735027

Les données en position (1,0) sont 4 Standardisation = (4-6) /1,41421356 = -1,414

Résultat après normalisation

entrez la description de l'image ici

Vérifier l'écart moyen et standard après la normalisation

entrez la description de l'image ici

Remarque: -2,77555756e-17 est très proche de 0.

Références

  1. Comparez l'effet de différents scalers sur les données avec des valeurs aberrantes

  2. Quelle est la différence entre la normalisation et la normalisation?

  3. La moyenne des données mises à l'échelle avec sklearn StandardScaler n'est pas nulle

LCJ
la source
3

Après application StandardScaler(), chaque colonne de X aura une moyenne de 0 et un écart type de 1.

Les formules sont listées par d'autres sur cette page.

Raison d'être: certains algorithmes nécessitent que les données ressemblent à ceci (voir la documentation sklearn ).

Paul
la source