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
Instructions de l’exercice
- Remplacez les valeurs de
WALKSCOREetBIKESCOREpar -1 à l'aide defillna()et du paramètresubset. - Créez une liste de
StringIndexeren utilisant une compréhension de liste pour parcourir chaque colonne decategorical_cols. - Appliquez
fit()puistransform()au pipelineindexer_pipeline. - Supprimez
categorical_colsavecdrop()puisqu'elles ne sont plus nécessaires. Vérifiez les types de données obtenus 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)