Читать книгу Praxiseinstieg Machine Learning mit Scikit-Learn, Keras und TensorFlow - Aurélien Géron - Страница 72
Aufbereiten der Daten
ОглавлениеDie meisten Machine-Learning-Algorithmen können mit fehlenden Merkmalen nicht umgehen. Deshalb werden wir einige Funktionen schreiben, die sich darum kümmern. Sie haben bereits bemerkt, dass beim Attribut total_bedrooms einige Werte fehlen. Um diesen Umstand zu beheben, haben Sie drei Möglichkeiten:
1 die entsprechenden Bezirke entfernen
2 das Merkmal komplett verwerfen
3 die Werte auf einen bestimmten Wert setzen (null, den Median o.Ä.)
Sie können alle drei leicht mit den Methoden dropna(), drop() und fillna() eines DataFrames umsetzen:
housing.dropna(subset=["total_bedrooms"]) # Option 1
housing.drop("total_bedrooms", axis=1) # Option 2
median = housing["total_bedrooms"].median() # Option 3
housing["total_bedrooms"].fillna(median, inplace=True)
Wenn Sie sich für die dritte Möglichkeit entscheiden, sollten Sie den Median des Trainingsdatensatzes berechnen und die fehlenden Werte mit diesem auffüllen. Sie sollten aber auch daran denken, den berechneten Wert zu sichern. Sie werden ihn später benötigen, um fehlende Werte im Testdatensatz zu ersetzen, wenn Sie Ihr System evaluieren, und um fehlende Werte in neuen Daten zu ersetzen, sobald Ihr System in Betrieb geht.
Scikit-Learn enthält eine nützliche Klasse zum Umgang mit fehlenden Werten: SimpleImputer. Sie verwenden diese, indem Sie zuerst eine Instanz von SimpleImputer erzeugen und angeben, dass Sie die fehlenden Werte jedes Merkmals mit dessen Median ersetzen möchten:
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy="median")
Da der Median sich nur bei numerischen Merkmalen berechnen lässt, müssen wir eine Kopie der Daten unter Ausschluss des Textmerkmals ocean_proximity erzeugen:
housing_num = housing.drop("ocean_proximity", axis=1)
Anschließend können Sie die imputer-Instanz durch Aufrufen der Methode fit() an die Trainingsdaten anpassen:
imputer.fit(housing_num)
Der imputer hat einfach den Median jedes Merkmals berechnet und das Ergebnis im Attribut statistics_ gespeichert. Lediglich beim Merkmal total_bedrooms gab es fehlende Daten, aber wir können uns nicht sicher sein, dass die neuen Daten im Betrieb nicht ebenfalls lückenhaft sind. Daher ist es sicherer, den imputer auf sämtliche numerischen Merkmale anzuwenden:
>>> imputer.statistics_
array([ -118.51 , 34.26 , 29. , 2119.5 , 433. , 1164. , 408. , 3.5409])
>>> housing_num.median().values
array([ -118.51 , 34.26 , 29. , 2119.5 , 433. , 1164. , 408. , 3.5409])
Sie können nun mit diesem »trainierten« imputer den Trainingsdatensatz transformieren, sodass die fehlenden Werte durch die gefundenen Mediane ersetzt werden:
X = imputer.transform(housing_num)
Das Ergebnis ist ein NumPy-Array mit den transformierten Merkmalen. Dieses wieder in ein pandas-DataFrame zu überführen, ist ebenfalls einfach:
housing_tr = pd.DataFrame(X, columns=housing_num.columns,
index=housing_num.index)