Naïef omgaan met missende en categorische waarden
Random Forest Regression is robuust genoeg om veel van de tijdrovende en saaie stappen in gegevensvoorbereiding te kunnen overslaan. Hoewel sommige implementaties van Random Forest automatisch met missende en categorische waarden omgaan, doet PySpark dat niet. De wiskunde blijft echter hetzelfde, dus we kunnen volstaan met een paar eenvoudige vervangingen.
Voor missende waarden, omdat onze data strikt positief is, wijzen we -1 toe. Het random forest zal op deze waarde splitsen en die anders behandelen dan de rest van de waarden binnen dezelfde feature.
Voor categorische waarden kunnen we de tekstwaarden simpelweg naar getallen mappen; ook hier zal het random forest ze passend behandelen door erop te splitsen. In dit voorbeeld halen we pipelines uit Introduction to PySpark weer van stal om onze code compacter te schrijven. Let op: de oefening begint met het tonen van de dtypes van de kolommen in de dataframe; vergelijk die met de resultaten aan het einde van deze oefening.
OPMERKING: Pipeline en StringIndexer zijn al voor je geïmporteerd. De lijst categorical_cols is ook beschikbaar.
Deze oefening maakt deel uit van de cursus
Feature Engineering met PySpark
Oefeninstructies
- Vervang de waarden in
WALKSCOREenBIKESCOREdoor -1 metfillna()en de parametersubset. - Maak een lijst met
StringIndexers door met list comprehension over elke kolom incategorical_colste itereren. - Pas
fit()entransform()toe op de pipelineindexer_pipeline. - Verwijder de
categorical_colsmetdrop()omdat ze niet meer nodig zijn. Bekijk de resulterende datatypes metdtypes.
Interactieve oefening met praktijkervaring
Probeer deze oefening door deze voorbeeldcode aan te vullen.
# 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)