nrow(entrainement_ml)
nrow(plis_temporels)
recette_mlMission 2: choisir avant le test
Comparer moyenne, stabilité et mandat
Votre mandat
Votre équipe doit comparer une régression logistique, un arbre et une forêt aléatoire dans les cinq fenêtres définies à la mission 1. Vous devez classer les candidats selon un mandat attribué par la personne animatrice et signer votre choix avant d’ouvrir le test futur.
Durée: 25 minutes.
Production: un tableau comparatif, un classement des trois modèles et une recommandation de six phrases datée et signée par l’équipe.
Ce que vous devez apprendre
À la fin de cette mission, vous devez pouvoir:
- expliquer les principaux réglages d’un arbre et d’une forêt;
- utiliser les mêmes fenêtres et mesures pour plusieurs modèles;
- lire correctement l’aire ROC, l’aire précision-rappel et le score de Brier;
- distinguer performance moyenne et stabilité temporelle;
- choisir selon un mandat plutôt que selon une seule valeur;
- documenter un compromis avant de voir le test final.
Règle absolue
N’ouvrez pas les résultats d’octobre à décembre. Ne consultez pas les sections 19 à 25 du tutoriel et n’exécutez aucune prédiction sur test_ml avant d’avoir remis votre recommandation signée. Les sections 14 à 18 restent permises: elles expliquent les mesures, la validation, la stabilité et la décision dont vous avez besoin ici.
Si votre équipe connaît déjà les résultats à cause d’une lecture antérieure, jouez le rôle d’un comité indépendant: utilisez seulement le tableau de validation fourni dans cette mission et justifiez le choix comme si le test était inconnu.
1. Démarrer même si la mission 1 n’est pas terminée
Deux chemins permettent de commencer immédiatement:
- si votre code de la mission 1 fonctionne, conservez vos objets et passez à la vérification;
- si un objet manque ou si votre équipe a pris du retard, exécutez le bloc de reprise ci-dessous. Il recrée uniquement l’environnement commun. Il ne complète pas les réponses d’interprétation de la mission 1 et n’ouvre aucun résultat du test futur.
Vérifier les objets existants
Vous devez disposer de:
entrainement_ml, contenant janvier à septembre;test_ml, conservé mais non examiné;plis_temporels, contenant cinq fenêtres;recette_ml, définissant le prétraitement commun.
Pour vérifier l’environnement sans ouvrir le test:
Les résultats attendus sont 14 351 lignes d’entraînement et cinq fenêtres.
Bloc de reprise autonome
Le fichier requis est requetes_311_montreal_2024_eiom.csv. Placez-le dans le sous-dossier data de votre projet, puis exécutez ce bloc au complet:
library(tidyverse)
library(tidymodels)
requetes_ml <- read_csv(
"data/requetes_311_montreal_2024_eiom.csv",
show_col_types = FALSE
) |>
mutate(
date_creation = as.Date(date_creation),
verite = factor(
issue_7_jours,
levels = c("non_terminee_7_jours", "terminee_7_jours")
)
) |>
arrange(date_creation, identifiant_requete)
date_coupure <- as.Date("2024-10-01")
entrainement_ml <- requetes_ml |>
filter(date_creation < date_coupure)
test_ml <- requetes_ml |>
filter(date_creation >= date_coupure)
plis_temporels <- sliding_period(
entrainement_ml,
index = date_creation,
period = "month",
lookback = 3,
assess_stop = 1,
complete = TRUE,
step = 1
)
recette_ml <- recipe(
verite ~ jour_semaine + plage_horaire + activite +
type_lieu + arrondissement + provenance,
data = entrainement_ml
) |>
step_novel(all_nominal_predictors(), new_level = "Nouveau") |>
step_unknown(all_nominal_predictors(), new_level = "Non précisé") |>
step_other(activite, threshold = 0.01, other = "Autres activités") |>
step_other(type_lieu, threshold = 0.01, other = "Autres lieux") |>
step_other(
arrondissement,
threshold = 0.005,
other = "Autres territoires"
) |>
step_other(provenance, threshold = 0.005, other = "Autres canaux") |>
step_zv(all_predictors())
stopifnot(
nrow(entrainement_ml) == 14351,
nrow(plis_temporels) == 5
)Le test futur existe maintenant dans test_ml, mais il reste fermé: ne l’affichez pas, ne le résumez pas et ne faites aucune prédiction sur celui-ci. Si l’ajustement des trois modèles ne termine pas à temps à la section 5, utilisez les tableaux de résultats repères fournis pour poursuivre la comparaison et consacrez le temps restant à la décision.
2. Définir les trois candidats
Régression logistique
modele_logistique <- logistic_reg() |>
set_engine("glm")La régression logistique impose une structure globale additive sur l’échelle de la log-cote. Elle sert de référence interprétable et peu coûteuse. Elle ne doit pas être appelée « modèle naïf »: un modèle simple peut généraliser mieux qu’un modèle flexible.
Arbre de décision
modele_arbre <- decision_tree(
cost_complexity = 0.001,
tree_depth = 10,
min_n = 30
) |>
set_engine("rpart") |>
set_mode("classification")Interprétez les trois réglages:
| Réglage | Interprétation |
|---|---|
cost_complexity |
pénalise les branches dont le gain est trop faible |
tree_depth |
limite le nombre de questions successives |
min_n |
exige assez de lignes avant de recouper un noeud |
Ces valeurs sont fixées avant l’évaluation. La mission compare trois candidats définis, elle ne réalise pas une recherche exhaustive d’hyperparamètres.
Forêt aléatoire
modele_foret <- rand_forest(
mtry = 4,
min_n = 30,
trees = 200
) |>
set_engine(
"ranger",
num.threads = 2
) |>
set_mode("classification")La forêt construit 200 arbres et agrège leurs probabilités. À chaque coupure, quatre prédicteurs sont candidats. L’agrégation cherche à réduire l’instabilité d’un arbre unique, mais augmente le coût et rend l’explication d’une prédiction moins directe. L’importance par permutation n’est pas calculée pendant les cinq validations afin d’éviter un travail inutile. Elle sera activée une seule fois sur l’ajustement final, dans la mission 3.
3. Construire un ensemble comparable
modeles <- list(
logistique = modele_logistique,
arbre = modele_arbre,
foret = modele_foret
)
ensemble_workflows <- workflow_set(
preproc = list(pretraitement = recette_ml),
models = modeles
)
ensemble_workflowsLe même objet recette_ml est combiné aux trois spécifications. Cette structure rend explicite ce qui reste constant et ce qui change. Si chaque équipe utilisait un prétraitement différent, il serait impossible d’attribuer un gain à l’algorithme seul.
4. Définir les trois mesures
mesures_ml <- metric_set(
roc_auc,
pr_auc,
brier_class
)L’événement positif est non_terminee_7_jours, placé en premier dans le facteur verite.
| Mesure | Question | Meilleur sens |
|---|---|---|
| aire ROC | une demande positive reçoit-elle généralement un score plus élevé? | plus élevée |
| aire précision-rappel | le classement est-il utile pour retrouver l’événement positif? | plus élevée |
| Brier | les probabilités sont-elles proches des résultats 0 ou 1? | plus faible |
L’aire ROC n’est pas une exactitude. Une aire de 0,72 ne signifie pas que 72 % des demandes sont correctement classées. Le score de Brier utilise ici la probabilité de l’événement placé en premier. Cette orientation doit rester cohérente dans tous les calculs.
5. Évaluer les mêmes fenêtres
L’ajustement peut prendre quelques secondes. La graine assure que les étapes aléatoires de la forêt sont reproductibles.
set.seed(20260828)
resultats_validation <- workflow_map(
ensemble_workflows,
"fit_resamples",
resamples = plis_temporels,
metrics = mesures_ml,
control = control_resamples(save_workflow = TRUE)
)
tableau_validation <- collect_metrics(resultats_validation) |>
transmute(
modele = recode(
wflow_id,
pretraitement_logistique = "Logistique",
pretraitement_arbre = "Arbre",
pretraitement_foret = "Forêt"
),
mesure = .metric,
moyenne = mean,
erreur_type = std_err
)
tableau_validationRésultats repères:
| Modèle | Brier | Aire précision-rappel | Aire ROC |
|---|---|---|---|
| logistique | 0,214 | 0,663 | 0,715 |
| arbre | 0,213 | 0,674 | 0,721 |
| forêt | 0,210 | 0,679 | 0,726 |
Questions:
- Quel modèle est premier sur chaque moyenne?
- Les écarts sont-ils grands par rapport aux valeurs des mesures?
- Peut-on déjà conclure que le même modèle doit être retenu pour tous les mandats?
- Quelle information manque encore avant de répondre?
La forêt est première en moyenne sur les trois mesures. Cette observation ne suffit pas encore. Il faut examiner la variation d’un mois à l’autre et les contraintes du mandat.
6. Examiner les résultats par fenêtre
resultats_par_fenetre <- collect_metrics(
resultats_validation,
summarize = FALSE
) |>
transmute(
modele = recode(
wflow_id,
pretraitement_logistique = "Logistique",
pretraitement_arbre = "Arbre",
pretraitement_foret = "Forêt"
),
pli = id,
mesure = .metric,
valeur = .estimate
)
resultats_par_fenetre |>
filter(mesure == "roc_auc") |>
ggplot(aes(pli, valeur, group = modele, color = modele)) +
geom_line(linewidth = 0.9) +
geom_point(size = 2.5) +
labs(
x = "Fenêtre de validation",
y = "Aire ROC",
color = "Modèle"
)Calculez un résumé simple de stabilité:
stabilite_auc <- resultats_par_fenetre |>
filter(mesure == "roc_auc") |>
group_by(modele) |>
summarise(
minimum = min(valeur),
maximum = max(valeur),
ecart_type = sd(valeur),
.groups = "drop"
)
stabilite_aucRésultats repères:
| Modèle | Minimum | Maximum | Écart-type |
|---|---|---|---|
| arbre | 0,712 | 0,731 | 0,007 |
| forêt | 0,704 | 0,748 | 0,016 |
| logistique | 0,705 | 0,725 | 0,008 |
La forêt a la meilleure moyenne, mais la variation la plus forte dans ces cinq mois. Cette variation ne prouve pas une instabilité universelle des forêts. Elle décrit ces candidats, ces paramètres et ces périodes.
7. Recevoir un mandat
La personne animatrice attribue une carte à votre équipe.
Carte A: communication scientifique
Le modèle doit soutenir une synthèse globale facilement explicable. Une petite perte prédictive est acceptable si l’interprétation est nettement plus claire.
Carte B: tri prédictif expérimental
Le projet pilote veut classer les demandes pour une analyse interne. La performance moyenne est prioritaire, mais une forte instabilité doit être documentée.
Carte C: règle inspectable
Chaque prédiction doit pouvoir être retracée à une suite de règles. L’organisation accepte une perte mesurée de performance pour gagner cette inspectabilité.
Carte D: infrastructure minimale
Le modèle doit être recalculé, surveillé et expliqué avec peu de ressources. Le gain d’un modèle plus coûteux doit être assez grand pour justifier son entretien.
Écrivez le nom de votre carte au haut de votre production.
8. Construire la matrice de décision
Attribuez une appréciation argumentée à chaque cellule. N’utilisez pas une moyenne mécanique pour éviter la discussion. Les critères n’ont pas la même importance dans chaque mandat.
| Critère | Logistique | Arbre | Forêt |
|---|---|---|---|
| aire ROC moyenne | |||
| aire précision-rappel moyenne | |||
| Brier moyen | |||
| stabilité de l’aire ROC | |||
| explication globale | |||
| explication d’une ligne | |||
| coût de calcul et surveillance |
Pour chaque modèle, notez:
- sa meilleure preuve;
- sa principale faiblesse;
- le critère du mandat qu’il sert le mieux.
9. Signer le choix avant le test
Votre recommandation doit contenir exactement six phrases:
- Notre mandat est…
- Nous retenons provisoirement le modèle…
- La première preuve chiffrée est…
- La seconde preuve, portant sur la stabilité, est…
- Nous acceptons le compromis suivant…
- Nous réviserons cette décision si le test futur montre…
Ajoutez la date, les initiales des membres de l’équipe et l’heure de la décision. Ne modifiez plus ce texte après l’ouverture du test. Si vous changez ensuite de choix, conservez les deux versions et expliquez la raison.
Contre-interrogatoire
Échangez votre recommandation avec une autre équipe. La personne sceptique adverse pose trois questions:
- Avez-vous lu les trois mesures dans le bon sens?
- Votre argument de stabilité repose-t-il sur les cinq fenêtres?
- Votre choix répond-il réellement au mandat ou seulement au meilleur score moyen?
Répondez sans ajouter de résultat provenant du test futur.
Erreurs fréquentes à éviter
- Appeler l’aire ROC « pourcentage de bonnes classifications ».
- Dire que le Brier le plus élevé est meilleur.
- Choisir la forêt uniquement parce qu’elle est plus complexe.
- Choisir la logistique uniquement parce qu’elle est familière.
- Généraliser l’instabilité observée à tous les arbres ou toutes les forêts.
- Consulter le test pour départager deux recommandations proches.
- Modifier le mandat après avoir vu le classement.
Vérification avant de remettre
- Les trois modèles ont reçu la même recette.
- Les mêmes cinq fenêtres et les mêmes trois mesures sont utilisées.
- L’événement positif est correctement identifié.
- Moyenne et stabilité sont toutes deux discutées.
- Le mandat attribué apparaît dans la recommandation.
- Le classement contient trois positions, pas seulement un gagnant.
- Le compromis accepté est explicite.
- Le test d’octobre à décembre n’a pas été consulté.
- La recommandation est datée et signée.