Gérer naïvement les valeurs manquantes et catégorielles
La Random Forest Regression est suffisamment robuste pour nous permettre d’ignorer bon nombre d’étapes de préparation des données longues et fastidieuses. Alors que certaines implémentations de Random Forest gèrent automatiquement les valeurs manquantes et catégorielles, celle de PySpark ne le fait pas. Les principes mathématiques restent toutefois les mêmes, ce qui nous permet d’utiliser des remplacements de valeurs simples.
Pour les valeurs manquantes, puisque nos données sont strictement positives, nous allons leur attribuer -1. La random forest effectuera une séparation sur cette valeur et la traitera différemment du reste des valeurs de la même variable.
Pour les valeurs catégorielles, nous pouvons simplement mapper les valeurs textuelles vers des nombres ; là encore, la random forest les traitera correctement en scindant sur ces valeurs. Dans cet exemple, nous allons ressortir les pipelines vus dans Introduction to PySpark pour écrire un code plus concis. Veuillez noter que l’exercice commence par afficher les dtypes des colonnes du dataframe ; comparez-les aux résultats à la fin de cet exercice.
REMARQUE : Pipeline et StringIndexer sont déjà importés pour vous. La liste categorical_cols est également disponible.
Cet exercice fait partie du cours
<cours>Feature Engineering avec PySpark</cours>Instructions de l’exercice
- Remplacez les valeurs de
WALKSCOREetBIKESCOREpar -1 en utilisantfillna()et le paramètresubset. - Créez une liste de
StringIndexeren utilisant une compréhension de liste pour itérer sur chaque colonne decategorical_cols. - Appliquez
fit()puistransform()au pipelineindexer_pipeline. - Supprimez
categorical_colsavecdrop()puisqu’elles ne sont plus nécessaires. Inspectez les types de données résultants avecdtypes.
Exercice interactif pratique
Essayez cet exercice en complétant ce code d’exemple.
# 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)