Aller au contenu

Quiz 08 – Clustering K-means, silhouette et GraphFrames

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

Contenus évalués : apprentissage non supervisé et K-means ; centroïdes et affectation des courses ; choix de k par boucle et silhouette ; rôle de `seed` et numéros de `prediction` arbitraires ; `StandardScaler` comme Estimator et échelle des variables ; paramètre `featuresCol` sans normalisation ; lecture des centres sans normalisation ; comparaison des silhouettes ; heure cyclique et identifiants de zone comme variables ; description et nommage des familles de courses ; choix du clustering face à la régression et à la classification ; GraphFrames (sommets, arêtes, PageRank, degrés, jointure avec les zones, installation du JAR) ; mode dégradé avec `groupBy` quand GraphFrames est absent.

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

Au TP 8, tu regroupes les courses en familles avec K-means. Pourquoi parle-t-on d'apprentissage non supervisé ?

Question 2

Après l'entraînement, tu affiches model.stages[-1].clusterCenters(). Que contient ce résultat, et comment K-means affecte-t-il une course à une famille ?

Question 3

Lis ce code du corrigé du TP 8.

for k in range(2, 7):
    model = Pipeline(stages=[assembleur, scaler, KMeans(k=k, seed=1)]).fit(df)
    resultats[k] = silhouette.evaluate(model.transform(df))
k_choisi = max(resultats, key=resultats.get)

Que fait-il ?

Question 4

Dans le TP 8, tu crées StandardScaler(inputCol="brut", outputCol="features", withMean=True, withStd=True). Que fait cette étape ?

Question 5

Tu évalues chaque k avec ClusteringEvaluator(featuresCol="features", metricName="silhouette"). Que mesure la silhouette ?

Question 6

Deux valeurs de k obtiennent une silhouette presque égale. Le TP est réussi si 3 familles sont nommées avec des mots métier. Quelle démarche suit la consigne ?

Question 7

Tu relances K-means avec k = 3 sans StandardScaler, sur les variables brutes (distance, montant, heure). En affichant les centres, tu constates que l'heure moyenne est identique dans les trois familles. Quelle est l'explication ?

Question 8

Un participant remarque que la silhouette sans StandardScaler est plus élevée qu'avec. Que conclus-tu ?

Question 9

Voici le bonus GraphFrames du corrigé, avec aretes construit à partir de PULocationID renommé src et de DOLocationID renommé dst.

g = GraphFrame(zones.withColumnRenamed("LocationID", "id"), aretes)
g.pageRank(resetProbability=0.15, maxIter=10).vertices.orderBy(F.desc("pagerank"))

Quelle lecture est juste ?

Question 10

Sur ton poste, from graphframes import GraphFrame échoue. Le script passe en mode dégradé et exécute aretes.groupBy("dst").count(), renommé en inDegree. Qu'obtiens-tu ?

Question 11

Pour la partie 5 du TP 8, le corrigé entraîne K-means sans normalisation avec ce code.

brut = Pipeline(stages=[assembleur, KMeans(k=3, seed=1, featuresCol="brut")]).fit(df)

Pourquoi faut-il préciser featuresCol="brut" ?

Question 12

Dans la boucle du TP 8, chaque modèle est créé avec KMeans(k=k, seed=1). À quoi sert seed=1 ?

Question 13

Tu as nommé tes familles à k = 3, puis tu réentraînes avec k = 4 pour comparer. La famille 0 de k = 4 ne ressemble plus du tout à la famille 0 de k = 3. Quel est le bon diagnostic ?

Question 14

Le TP 8 pose la question : l'heure est traitée comme un nombre, donc 23 h et 0 h sont « loin ». Quelle correction règle ce problème ?

Question 15

Dans la boucle, le StandardScaler est placé dans le Pipeline, et .fit(df) est rappelé pour chaque k. Que se passe-t-il pour le scaler au moment du fit ?

Question 16

Tu as fait pip install graphframes-py. L'import from graphframes import GraphFrame passe, mais la création de GraphFrame(...) échoue avec une erreur côté Java. Que manque-t-il ?

Question 17

Le corrigé affiche les zones les plus desservies avec ce code.

g.inDegrees.join(zones, g.inDegrees.id == zones.LocationID).orderBy(F.desc("inDegree")).select("Zone", "inDegree").show(5)

Pourquoi la jointure avec zones est-elle nécessaire ?

Question 18

Lis cette ligne du bonus GraphFrames.

g.pageRank(resetProbability=0.15, maxIter=10).vertices.orderBy(F.desc("pagerank")).select("id", "Zone", "pagerank").show(5)

Que t'affiche-t-elle, et que règle maxIter=10 ?

Question 19

Parmi ces situations, vues dans l'activité « quel type de problème ? », laquelle se traite avec un clustering comme au TP 8, et non avec une régression ou une classification ?

Question 20

Un participant ajoute PULocationID aux inputCols du VectorAssembler, en pensant que la zone de départ aidera à former les familles. Le StandardScaler reste en place. Quel est le problème ?

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.