Fehlende und kategoriale Werte naiv behandeln
Random-Forest-Regression ist robust genug, um viele der zeitaufwendigen und lästigen Schritte der Datenaufbereitung zu ignorieren. Während einige Implementierungen von Random Forest fehlende und kategoriale Werte automatisch behandeln, tut PySpark das nicht. Die zugrunde liegende Mathematik bleibt jedoch gleich, daher können wir mit einigen einfachen Wert-Ersetzungen arbeiten.
Für fehlende Werte, da unsere Daten strikt positiv sind, weisen wir -1 zu. Der Random Forest wird auf diesem Wert splitten und ihn anders behandeln als die übrigen Werte in derselben Feature-Spalte.
Für kategoriale Werte können wir die Textwerte einfach auf Zahlen abbilden, und auch hier wird der Random Forest sie passend behandeln, indem er darauf splittet. In diesem Beispiel holen wir pipelines aus Introduction to PySpark wieder hervor, um unseren Code prägnanter zu schreiben. Bitte beachte, dass die Übung zu Beginn die dtypes der Spalten im DataFrame anzeigt. Vergleiche sie mit den Ergebnissen am Ende dieser Übung.
HINWEIS: Pipeline und StringIndexer wurden bereits für dich importiert. Die Liste categorical_cols ist ebenfalls verfügbar.
Diese Übung ist Teil des Kurses
<Kurs>Feature Engineering mit PySpark</Kurs>Übungsanweisungen
- Ersetze die Werte in
WALKSCOREundBIKESCOREmit -1, indem dufillna()und den Parametersubsetverwendest. - Erstelle eine Liste von
StringIndexer-Objekten, indem du per List Comprehension über jede Spalte incategorical_colsiterierst. - Wende
fit()undtransform()auf die Pipelineindexer_pipelinean. - Entferne die
categorical_colsmitdrop(), da sie nicht mehr benötigt werden. Prüfe die resultierenden Datentypen mitdtypes.
Interaktive praktische Übung
Versuche dich an dieser Übung, indem du diesen Beispielcode vervollständigst.
# Replace missing values
df = df.____(____, ____=[____, ____])
# Create list of StringIndexers using list comprehension
indexers = [____(inputCol=____, outputCol=____+"_IDX")\
.setHandleInvalid("keep") for ____ in ____]
# Create pipeline of indexers
indexer_pipeline = Pipeline(stages=indexers)
# Fit and Transform the pipeline to the original data
df_indexed = ____.____(df).____(df)
# Clean up redundant columns
df_indexed = df_indexed.____(*____)
# Inspect data transformations
print(df_indexed.dtypes)