Je ne parviens pas à comprendre la page du StandardScaler
dans la documentation de sklearn
.
Quelqu'un peut-il m'expliquer cela en termes simples?
Je ne parviens pas à comprendre la page du StandardScaler
dans la documentation de sklearn
.
Quelqu'un peut-il m'expliquer cela en termes simples?
Réponses:
L'idée derrière StandardScaler
est 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é).
Intro: Je suppose que vous avez une matrice X
où chaque ligne / ligne est un échantillon / observation et chaque colonne est une variable / caractéristique (c'est l'entrée attendue pour toute sklearn
fonction ML d'ailleurs - X.shape
devrait être [number_of_samples, number_of_features]
).
Cœur de la méthode : L'idée principale est de normaliser / standardiser ie μ = 0
et σ = 1
vos 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 μ = 0
et σ = 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:
MISE À JOUR 08/2019 : Concernant les paramètres d'entrée with_mean
et 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"
[1.15, 1.15]
quand je calcule comme Pandas df: pd.DataFrame(scaled_data).std(0)
?
pd.DataFrame(scaled_data)[0]
j'obtiens une série avec Name: 0, dtype: float64
et des valeurs [-1.0, 1.0, -1.0, 1.0]
. Désolé pour le formatage
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?
Comment le calculer:
Vous pouvez lire plus ici:
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.
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.
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.
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)
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
Vérifier l'écart moyen et standard après la normalisation
Remarque: -2,77555756e-17 est très proche de 0.
Références
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 ).
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 passample mean value subtracted
- Voir ma réponse ci