CommencezCommencez gratuitement

Gérer naïvement les valeurs manquantes et catégorielles

La Random Forest Regression est assez robuste pour nous permettre d'ignorer plusieurs étapes de préparation des données, souvent longues et fastidieuses. Même si certaines implantations de Random Forest gèrent automatiquement les valeurs manquantes et les variables catégorielles, celle de PySpark ne le fait pas. Les principes mathématiques restent toutefois les mêmes, donc nous pouvons nous en tirer avec des remplacements simples.

Pour les valeurs manquantes, puisque nos données sont strictement positives, nous allons 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 caractéristique.

Pour les valeurs catégorielles, nous pouvons simplement convertir les libellés en nombres et, encore une fois, la random forest les traitera adéquatement en scindant sur ces valeurs. Dans cet exemple, nous allons dépoussiérer les pipelines vus dans Introduction à PySpark afin d'é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.

NOTE : Pipeline et StringIndexer sont déjà importés pour vous. La liste categorical_cols est aussi disponible.

Cette activité fait partie du cours

Ingénierie des caractéristiques avec PySpark

Voir le cours

Instructions de l’exercice

  • Remplacez les valeurs de WALKSCORE et BIKESCORE par -1 à l'aide de fillna() et du paramètre subset.
  • Créez une liste de StringIndexer en utilisant une compréhension de liste pour parcourir 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. Vérifiez les types de données obtenus 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