Normalisierung und Vorverarbeitung#

sklearn.preprocessing kann in vielfältiger Form verwendet werden um Daten zu bereinigen:

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