Exemple de différentes standardisations en python.
Pour référence, consultez cet article wikipedia:
https://en.wikipedia.org/wiki/Unbias_estimation_of_standard_deviation
Exemples de données
import pandas as pd
df = pd.DataFrame({
'A':[1,2,3],
'B':[100,300,500],
'C':list('abc')
})
print(df)
A B C
0 1 100 a
1 2 300 b
2 3 500 c
Normalisation à l'aide de pandas (donne des estimations impartiales)
Lors de la normalisation, nous soustrayons simplement la moyenne et divisons par l'écart-type.
df.iloc[:,0:-1] = df.iloc[:,0:-1].apply(lambda x: (x-x.mean())/ x.std(), axis=0)
print(df)
A B C
0 -1.0 -1.0 a
1 0.0 0.0 b
2 1.0 1.0 c
Normalisation à l'aide de sklearn (donne des estimations biaisées, différentes des pandas)
Si vous faites la même chose avec sklearn
vous obtiendrez une sortie DIFFÉRENTE!
import pandas as pd
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df = pd.DataFrame({
'A':[1,2,3],
'B':[100,300,500],
'C':list('abc')
})
df.iloc[:,0:-1] = scaler.fit_transform(df.iloc[:,0:-1].to_numpy())
print(df)
A B C
0 -1.224745 -1.224745 a
1 0.000000 0.000000 b
2 1.224745 1.224745 c
Est-ce que les estimations biaisées de sklearn rendent l'apprentissage machine moins puissant?
NON.
La documentation officielle de sklearn.preprocessing.scale indique que l'utilisation d'un estimateur biaisé N'EST PAS PROBABLE pour affecter les performances des algorithmes d'apprentissage automatique et que nous pouvons les utiliser en toute sécurité.
From official documentation:
We use a biased estimator for the standard deviation,
equivalent to numpy.std(x, ddof=0).
Note that the choice of ddof is unlikely to affect model performance.
Qu'en est-il de la mise à l'échelle MinMax?
Il n'y a pas de calcul d'écart type dans la mise à l'échelle MinMax. Le résultat est donc le même pour les pandas et pour scikit-learn.
import pandas as pd
df = pd.DataFrame({
'A':[1,2,3],
'B':[100,300,500],
})
(df - df.min()) / (df.max() - df.min())
A B
0 0.0 0.0
1 0.5 0.5
2 1.0 1.0
# Using sklearn
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
arr_scaled = scaler.fit_transform(df)
print(arr_scaled)
[[0. 0. ]
[0.5 0.5]
[1. 1. ]]
df_scaled = pd.DataFrame(arr_scaled, columns=df.columns,index=df.index)
print(df_scaled)
A B
0 0.0 0.0
1 0.5 0.5
2 1.0 1.0