Pourquoi le modèle a-t-il répondu cela ?
Expliquer une prédiction, c’est dire quelles informations ont fait pencher le modèle vers sa réponse. Une personne refusée veut savoir pourquoi, et l’équipe doit le savoir pour corriger.
Vous lirez un modèle simple, puis vous mesurerez l’effet d’une information en la changeant.
À la fin de cette leçon
Remarque
Je peux expliquer pourquoi un modèle a donné une prédiction.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Entrée | une information donnée au modèle |
| Prédiction | la réponse que le modèle donne |
| Poids | le nombre qui dit combien une entrée compte, et dans quel sens |
| Effet | de combien la prédiction change quand une entrée change |
| Explication locale | le pourquoi d’une seule prédiction |
| Boîte noire | un modèle dont on ne peut pas lire le calcul |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un modèle simple se lit comme une recette
Un score de prêt peut s’écrire : une base, plus le revenu fois son poids, plus l’ancienneté fois son poids, moins les dettes fois leur poids. Chaque poids dit combien une entrée compte, et dans quel sens.
On lit directement un tel modèle. Un modèle très complexe, une boîte noire, se lit beaucoup moins bien.
Exemple travaillé : le score d’une demande
| Entrée | Valeur | Poids | Contribution |
|---|---|---|---|
| Base | 20 | ||
| Revenu (en centaines d’euros) | 15 | 2 | 30 |
| Ancienneté (en années) | 2 | 3 | 6 |
| Dettes (en centaines d’euros) | 3 | -4 | -12 |
| Score | 44 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Calculer le score d’une demande
# Le score d’une demande de prêt.
poids = {"base": 20, "revenu": 2, "anciennete": 3, "dettes": -4}
demande = {"revenu": 15, "anciennete": 2, "dettes": 3}
score = poids["base"]
for nom in demande:
score = score + poids[nom] * demande[nom]
print("score :", score)
# Le seuil d’accord est 50.
# Mettez dettes à 0, puis relancez.
Le labo contient un vrai modèle
Dans le labo, un modèle prévoit le nombre de locations d’un jour à partir de deux entrées : la température et la pluie. Il calcule un poids pour chacune.
Le script affiche ces poids. Une ligne dit combien de locations un degré de plus apporte, l’autre combien un millimètre de pluie en retire.
Lire les poids d’un vrai modèle
docker exec jupyter python3 steps/model.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
On mesure l’effet d’une entrée en la changeant
Gardez la demande telle quelle. Changez une seule entrée, puis calculez le nouveau score. L’écart entre les deux scores est l’effet de ce changement.
Répétez pour chaque entrée. L’entrée dont l’effet est le plus grand est la plus importante pour cette demande.
Exemple travaillé : trois changements
| Changement | Nouveau score | Effet |
|---|---|---|
| Revenu de 15 à 20 | 54 | +10 |
| Ancienneté de 2 à 5 | 53 | +9 |
| Dettes de 3 à 0 | 56 | +12 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Mesurer l’effet d’un seul changement
# L’effet d’un seul changement sur le score.
poids = {"base": 20, "revenu": 2, "anciennete": 3, "dettes": -4}
avant = {"revenu": 15, "anciennete": 2, "dettes": 3}
apres = {"revenu": 20, "anciennete": 2, "dettes": 3}
score_avant = poids["base"]
score_apres = poids["base"]
for nom in avant:
score_avant = score_avant + poids[nom] * avant[nom]
score_apres = score_apres + poids[nom] * apres[nom]
print("effet du revenu :", score_apres - score_avant)
# Changez le revenu de apres en 10, puis relancez.
Une erreur fréquente
Attention
Beaucoup pensent qu’une explication montre la cause dans la vie réelle. Elle montre ce que le modèle a utilisé, pas ce qui arrive aux gens. Le classement dépend aussi de la taille des changements essayés : dites-la toujours.
Une bonne explication est courte et utile
Pour une personne refusée, donnez les deux ou trois entrées qui ont le plus pesé. Dites aussi ce qui aurait changé la réponse.
Par exemple : « Votre score est 44 et le seuil est 50. Avec 300 euros de dettes en moins, il aurait été de 56. » Évitez de citer une entrée sur laquelle la personne ne peut rien.
Une entrée neutre peut remplacer un groupe
Le code postal n’est pas un groupe. Mais si A et B habitent des quartiers différents, il en dit presque autant.
Testez chaque entrée : sert-elle de remplaçant à un groupe ? Si oui, expliquez-le, ou retirez-la.
Dans votre carnet : dix millimètres de pluie
import pandas as pd
from sklearn.linear_model import LinearRegression
locations = pd.read_csv("hires.csv")
entrees = locations[["temp_c", "rain_mm"]]
modele = LinearRegression().fit(entrees, locations["hires"])
sec = pd.DataFrame({"temp_c": [15.0], "rain_mm": [0.0]})
pluvieux = pd.DataFrame({"temp_c": [15.0], "rain_mm": [10.0]})
# L’effet de dix millimètres de pluie sur la prédiction.
modele.predict(pluvieux)[0] - modele.predict(sec)[0]
Pour aller plus loin
Écrivez l’explication d’un refus pour une demande de votre choix. Donnez un score, un seuil, les deux entrées qui ont le plus pesé et ce qui aurait changé la réponse.
Relisez-la comme la personne refusée. Comprend-elle ce qu’elle peut faire ? Cite-t-elle une entrée qui remplace un groupe ?