Beispiel für verschiedene Standardisierungen in Python.
Eine Referenz finden Sie in diesem Wikipedia-Artikel:
https://en.wikipedia.org/wiki/Unbiased_estimation_of_standard_deviation
Beispieldaten
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
Normalisierung mit Pandas (Gibt unvoreingenommene Schätzungen)
Bei der Normalisierung subtrahieren wir einfach den Mittelwert und dividieren durch die Standardabweichung.
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
Normalisierung mit sklearn (Gibt voreingenommene Schätzungen, die sich von Pandas unterscheiden)
Wenn Sie dasselbe tun, erhalten sklearn
Sie eine VERSCHIEDENE Ausgabe!
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
Macht voreingenommene Schätzungen von sklearn maschinelles Lernen weniger leistungsfähig?
NEIN.
Die offizielle Dokumentation von sklearn.preprocessing.scale besagt, dass die Verwendung eines voreingenommenen Schätzers die Leistung von Algorithmen für maschinelles Lernen UNMÖGLICHERWEISE beeinträchtigt und wir sie sicher verwenden können.
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.
Was ist mit MinMax-Skalierung?
Bei der MinMax-Skalierung gibt es keine Standardabweichungsberechnung. Das Ergebnis ist also sowohl bei Pandas als auch bei Scikit-Learn gleich.
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