Gestionarea simplificată a valorilor lipsă și categoriale
Regresia Random Forest este suficient de robustă pentru a ne permite să ignorăm mulți dintre pașii de pregătire a datelor care consumă mult timp. Deși unele implementări de Random Forest gestionează automat valorile lipsă și cele categoriale, cea din PySpark nu face acest lucru. Matematica rămâne însă aceeași, astfel că ne putem descurca cu înlocuiri simple ale valorilor.
Pentru valorile lipsă, deoarece datele noastre sunt strict pozitive, vom atribui valoarea -1. Random forest-ul va realiza o separare pe această valoare și o va trata diferit față de celelalte valori din aceeași caracteristică.
Pentru valorile categoriale, putem pur și simplu să mapăm textul la numere — random forest-ul le va gestiona corespunzător prin separare. În acest exercițiu, vom folosi pipelines din cursul Introducere în PySpark pentru a scrie codul mai concis. Reține că exercițiul va afișa mai întâi dtypes-urile coloanelor din dataframe — compară-le cu rezultatele de la sfârșitul exercițiului.
NOTĂ: Pipeline și StringIndexer sunt deja importate. Lista categorical_cols este de asemenea disponibilă.
Acest exercițiu face parte din cursul
Feature Engineering cu PySpark
Instrucțiuni pentru exercițiu
- Înlocuiește valorile din
WALKSCOREșiBIKESCOREcu -1, folosindfillna()și parametrulsubset. - Creează o listă de
StringIndexer-e prin list comprehension, iterând peste fiecare coloană dincategorical_cols. - Aplică
fit()șitransform()pe pipeline-ulindexer_pipeline. - Elimină
categorical_colsfolosinddrop(), deoarece nu mai sunt necesare. Inspectează tipurile de date rezultate folosinddtypes.
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
# 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)