CommencerCommencez gratuitement

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>
Voir le cours

Instructions de l’exercice

  • Remplacez les valeurs de WALKSCORE et BIKESCORE par -1 en utilisant fillna() et le paramètre subset.
  • Créez une liste de StringIndexer en utilisant une compréhension de liste pour itérer sur chaque colonne de categorical_cols.
  • Appliquez fit() puis transform() au pipeline indexer_pipeline.
  • Supprimez categorical_cols avec drop() puisqu’elles ne sont plus nécessaires. Inspectez les types de données résultants avec dtypes.

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)
Modifier et exécuter le code