Detailliertes Beispiel für Normalisierungsmethoden
- Pandas-Normalisierung (unverzerrt)
- Sklearn-Normalisierung (verzerrt)
- Beeinflusst verzerrt vs. unverzerrt das maschinelle Lernen?
- Mix-Max-Skalierung
Referenzen: Wikipedia: Unverzerrte Schätzung der Standardabweichung
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 (liefert unverzerrte Schätzungen)
Bei der Normalisierung subtrahieren wir einfach den Mittelwert und teilen 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 (liefert verzerrte Schätzungen, unterschiedlich zu pandas)
Wenn Sie dasselbe mit sklearn
machen, erhalten Sie eine ANDERE 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
Beeinflussen verzerrte Schätzungen von sklearn die Leistung des maschinellen Lernens?
NEIN.
Die offizielle Dokumentation von sklearn.preprocessing.scale besagt, dass die Verwendung eines verzerrten Schätzers UNWAHRSCHEINLICH ist, die Leistung von maschinellen Lernalgorithmen zu beeinflussen und wir sie sicher verwenden können.
Aus der offiziellen Dokumentation:
Wir verwenden einen verzerrten Schätzer für die Standardabweichung, äquivalent zu numpy.std(x, ddof=0)
. Beachten Sie, dass die Wahl von ddof
unwahrscheinlich ist, die Modellleistung zu beeinflussen.
Was ist mit MinMax-Skalierung?
Bei der MinMax-Skalierung wird keine Standardabweichung berechnet. Daher ist das Ergebnis sowohl in pandas als auch in 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
# Mit 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