Normalisierung und Vorverarbeitung¶
sklearn.preprocessing kann in vielfältiger Form verwendet werden um Daten zu bereinigen:
Standardisierung mit StandardScaler, MinMaxScaler, MaxAbsScaler oder RobustScaler.
Zentrierung von Kernel-Matrizen mit KernelCenterer.
Nicht-lineare Transformationen mit QuantileTransformer, PowerTransformer
Normalisierung mit normalize.
Kodierung kategorischer Merkmale mit OrdinalEncoder, OneHotEncoder.
Diskretisierung (auch bekannt als Quantisierung oder Binning) mit KBinsDiscretizer.
Binarisierung von Merkmalen mit Binarizer
Zurechnen (engl.: Imputation) fehlender Werte mit SimpleImputer, IterativeImputer oder KNNImputer wobei die zugerechneten Werte mit MissingIndicator markiert werden können.
Siehe auch
Beispiel¶
Im folgenden Beispiel füllen wir Mittelwerte auf und nehmen einige Skalierungen vor:
1. Importe¶
[1]:
from datetime import datetime
import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn.impute import SimpleImputer
[2]:
hvac = pd.read_csv("https://raw.githubusercontent.com/kjam/data-cleaning-101/master/data/HVAC_with_nulls.csv")
2. Datenqualität überprüfen¶
Datentypen mit pandas.DataFrame.dtypes anzeigen
[3]:
hvac.dtypes
[3]:
Date object
Time object
TargetTemp float64
ActualTemp int64
System int64
SystemAge float64
BuildingID int64
10 float64
dtype: object
Dimensionen das DataFrame mit pandas.DataFrame.shape als Tupel zurückgeben
[4]:
hvac.shape
[4]:
(8000, 8)
Erste n Zeilen mit pandas.DataFrame.head zurückgeben
[5]:
hvac.head()
[5]:
Date | Time | TargetTemp | ActualTemp | System | SystemAge | BuildingID | 10 | |
---|---|---|---|---|---|---|---|---|
0 | 6/1/13 | 0:00:01 | 66.0 | 58 | 13 | 20.0 | 4 | NaN |
1 | 6/2/13 | 1:00:01 | NaN | 68 | 3 | 20.0 | 17 | NaN |
2 | 6/3/13 | 2:00:01 | 70.0 | 73 | 17 | 20.0 | 18 | NaN |
3 | 6/4/13 | 3:00:01 | 67.0 | 63 | 2 | NaN | 15 | NaN |
4 | 6/5/13 | 4:00:01 | 68.0 | 74 | 16 | 9.0 | 3 | NaN |
3. Fehlenden Werten den Mittelwert zuschreiben¶
Hierzu verwenden wir die mean
-Strategie von sklearn.impute.SimpleImputer
[6]:
imp = SimpleImputer(missing_values=np.nan, strategy="mean")
[7]:
hvac_numeric = hvac[["TargetTemp", "SystemAge"]]
[8]:
imp = imp.fit(hvac_numeric.loc[:10])
Weiter Infos zu fit
erhaltet ihr in der Scikit Learn-Dokumentation.
fit_transform wandelt dann die angepassten Daten um:
[9]:
transformed = imp.fit_transform(hvac_numeric)
[10]:
transformed
[10]:
array([[66. , 20. ],
[67.50773481, 20. ],
[70. , 20. ],
...,
[67.50773481, 4. ],
[65. , 23. ],
[66. , 21. ]])
[11]:
hvac["TargetTemp"], hvac["SystemAge"] = transformed[:,0], transformed[:,1]
Nun lassen wir uns die ersten Zeilen mit den geänderten Datensätzen anzeigen.
[12]:
hvac.head()
[12]:
Date | Time | TargetTemp | ActualTemp | System | SystemAge | BuildingID | 10 | |
---|---|---|---|---|---|---|---|---|
0 | 6/1/13 | 0:00:01 | 66.000000 | 58 | 13 | 20.000000 | 4 | NaN |
1 | 6/2/13 | 1:00:01 | 67.507735 | 68 | 3 | 20.000000 | 17 | NaN |
2 | 6/3/13 | 2:00:01 | 70.000000 | 73 | 17 | 20.000000 | 18 | NaN |
3 | 6/4/13 | 3:00:01 | 67.000000 | 63 | 2 | 15.386643 | 15 | NaN |
4 | 6/5/13 | 4:00:01 | 68.000000 | 74 | 16 | 9.000000 | 3 | NaN |
4. Skalieren¶
Zur Standardisierung von Datensätzen, die wie standardnormalverteilte Daten aussehen, können wir sklearn.preprocessing.scale verwenden. Damit lassen sich die Faktoren ermitteln, um die ein Wert sich vergrößert oder verkleinert. Dies können wir für die Skalierung der aktuellen Temperatur verwenden.
[13]:
hvac["ScaledTemp"] = preprocessing.scale(hvac["ActualTemp"])
[14]:
hvac["ScaledTemp"].head()
[14]:
0 -1.293272
1 0.048732
2 0.719733
3 -0.622270
4 0.853934
Name: ScaledTemp, dtype: float64
sklearn.preprocessing.MinMaxScaler skaliert die Mermale so, dass sie zwischen einem bestimmten Minimal- und Maximalwert liegen, häufig zwischen Null und Eins. Dies hat den Vorteil, dass die Skalierung robuster gegenüber sehr kleinen Standardabweichungen von Merkmalen wird.
[15]:
min_max_scaler = preprocessing.MinMaxScaler()
[16]:
temp_minmax = min_max_scaler.fit_transform(hvac[["ActualTemp"]])
[17]:
temp_minmax
[17]:
array([[0.12],
[0.52],
[0.72],
...,
[0.56],
[0.32],
[0.44]])
Nun fügen wir auch temp_minmax
noch als neue Spalte ein:
[18]:
hvac["MinMaxScaledTemp"] = temp_minmax[:,0]
hvac["MinMaxScaledTemp"].head()
[18]:
0 0.12
1 0.52
2 0.72
3 0.32
4 0.76
Name: MinMaxScaledTemp, dtype: float64
[19]:
hvac.head()
[19]:
Date | Time | TargetTemp | ActualTemp | System | SystemAge | BuildingID | 10 | ScaledTemp | MinMaxScaledTemp | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 6/1/13 | 0:00:01 | 66.000000 | 58 | 13 | 20.000000 | 4 | NaN | -1.293272 | 0.12 |
1 | 6/2/13 | 1:00:01 | 67.507735 | 68 | 3 | 20.000000 | 17 | NaN | 0.048732 | 0.52 |
2 | 6/3/13 | 2:00:01 | 70.000000 | 73 | 17 | 20.000000 | 18 | NaN | 0.719733 | 0.72 |
3 | 6/4/13 | 3:00:01 | 67.000000 | 63 | 2 | 15.386643 | 15 | NaN | -0.622270 | 0.32 |
4 | 6/5/13 | 4:00:01 | 68.000000 | 74 | 16 | 9.000000 | 3 | NaN | 0.853934 | 0.76 |