Aller au contenu

Quiz 06 – Régression avec Spark ML : pipelines, RMSE et R²

  • Jour 2
  • 20 questions
  • Seuil de réussite : 70 %
  • 20 flashcards

Contenus évalués : Estimator et Transformer ; Pipeline, `fit` et `transform`, PipelineModel ; `StringIndexer`, `OneHotEncoder`, `VectorAssembler` et `handleInvalid="keep"` ; colonne `features` attendue par défaut ; filtrage des courses de distance nulle ; découpage train / test 80 / 20 avec `seed=42` et rôle du jeu de test ; `LinearRegression` contre `DecisionTreeRegressor` et palier du forfait JFK ; lecture de `toDebugString` ; comparaison équitable de modèles, `GBTRegressor` et arbre sur la distance seule ; lecture de la RMSE et du R² ; fuites de données avec `total_amount` et la durée de course ; persistance du pipeline entraîné et colonnes attendues par le modèle rechargé.

Une seule bonne réponse par question. Toutes les valeurs citées sont celles des TP de la formation. Le corrigé détaillé s’affiche après la correction. Ce quiz prépare le QCM de validation des acquis du dernier jour.

Question 1

Dans la préparation du TP 6, tu as utilisé StringIndexer et VectorAssembler. Comment Spark ML classe-t-il ces deux étapes ?

Question 2

Voici la préparation commune aux deux modèles du TP 6.

preparation = [
    StringIndexer(inputCol="Borough", outputCol="borough_idx", handleInvalid="keep"),
    OneHotEncoder(inputCols=["borough_idx"], outputCols=["borough_vec"]),
    VectorAssembler(inputCols=["trip_distance", "heure", "passenger_count", "borough_vec"],
                    outputCol="features"),
]

Que contient la colonne borough_vec ?

Question 3

Le TP 6 découpe les données avec df.randomSplit([0.8, 0.2], seed=42). À quoi sert le paramètre seed=42 ?

Question 4

Dans la fonction evaluer du corrigé, tu as écrit ces deux lignes.

model = Pipeline(stages=preparation + [estimateur]).fit(train)
pred = model.transform(test)

Qu'est-ce que model, et que fait la seconde ligne ?

Question 5

Le StringIndexer du TP 6 est réglé avec handleInvalid="keep". Que se passe-t-il si une valeur de Borough absente du train apparaît dans les données à prédire ?

Question 6

L'arbre du TP 6 obtient une RMSE de 4,66 $ sur le test. L'objectif du TP était une RMSE inférieure à 5 $. Comment lire ce 4,66 $ ?

Question 7

Un participant calcule la RMSE de son arbre avec model.transform(train) au lieu de model.transform(test). Il obtient une valeur plus basse que sur le test et veut garder celle-ci. Que lui réponds-tu ?

Question 8

Tu sauvegardes puis recharges le meilleur modèle du TP 6.

dt_model.write().overwrite().save("out/modele_montant")
recharge = PipelineModel.load("out/modele_montant")

Qu'est-ce qui a été sauvegardé, et que peux-tu faire de recharge ?

Question 9

Au TP 6, l'arbre (maxDepth=6) bat la régression linéaire sur le test. En bonus, ajouter RatecodeID (1 = tarif normal, 2 = forfait JFK) aux features de l'arbre divise l'erreur par deux. Quelle explication tient le mieux ?

Question 10

Au bonus 3 du TP 6, tu ajoutes total_amount aux features d'une régression linéaire. Le R² monte à 0,98. Quel diagnostic est juste ?

Question 11

Avant tout le reste, le corrigé du TP 6 applique .filter("trip_distance > 0"). Pourquoi ce filtre ?

Question 12

Un participant écrit VectorAssembler(..., outputCol="vecteur") et garde le reste du TP 6 à l'identique. Le fit du pipeline échoue : la colonne features est introuvable. Quel diagnostic est juste ?

Question 13

Le corrigé affiche le début de l'arbre entraîné avec dt_model.stages[-1].toDebugString. La première règle lue est la suivante.

If (feature 0 <= 5.96)

Comment la lis-tu ?

Question 14

Au bonus 1, un arbre entraîné sur la distance seule obtient une RMSE d'environ 4,8 $, contre environ 4,7 $ pour l'arbre du TP. Quelle conclusion en tires-tu ?

Question 15

Le bonus 1 évalue aussi GBTRegressor(labelCol="fare_amount", maxIter=20, maxDepth=5). Que fait ce modèle, par rapport à l'arbre unique du TP ?

Question 16

Pour le bonus 2, un participant ajoute simplement "RatecodeID" aux inputCols du VectorAssembler de la préparation, sans rien changer d'autre. Le fit échoue : colonne RatecodeID introuvable. Pourquoi ?

Question 17

Dans le corrigé, evaluer construit chaque modèle avec Pipeline(stages=preparation + [estimateur]). Le commentaire précise : « seule la dernière étape change ». Pourquoi est-ce important pour la comparaison ?

Question 18

Pour faire baisser la RMSE, un participant propose d'ajouter la durée de la course, calculée comme tpep_dropoff_datetime moins tpep_pickup_datetime. Que lui réponds-tu ?

Question 19

Ton RegressionEvaluator affiche la RMSE et le R² de chaque modèle, sur le même jeu de test. Que mesure le R² ?

Question 20

Le lendemain, tu veux prédire le tarif de nouvelles courses avec le modèle sauvegardé.

recharge = PipelineModel.load("out/modele_montant")
nouvelles = spark.read.parquet("data/trips.parquet")
recharge.transform(nouvelles)

Le transform échoue. Que dois-tu faire ?

Cliquez sur une carte pour la retourner. Mélangez-les pour une révision active.

1 / 20

Dépôt des participants : formations2026/formation-spark-ml (branche participants)

Contenu pédagogique © Ambient IT · 140 Avenue Jean Lolive, 93500 Pantin · formation@ambient-it.net · +33 (0)1 48 10 09 46

Organisme de formation enregistré sous le numéro 11 75 54743 75. Cet enregistrement ne vaut pas agrément de l'État.