Juste en moyenne, injuste pour un groupe
L’équité d’un modèle se mesure en comparant ce qu’il fait pour chaque groupe. Un modèle qui trie des candidatures peut être bon en moyenne et injuste pour un groupe.
Vous calculerez les taux de chaque groupe. Vous verrez aussi pourquoi deux définitions de l’équité ne s’accordent pas toujours.
À la fin de cette leçon
Remarque
Je peux mesurer si un modèle traite deux groupes de la même façon.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Équité | un traitement jugé juste entre des groupes, qu’on peut mesurer |
| Taux de sélection | la part des personnes d’un groupe que le modèle choisit |
| Vrai positif | une personne qualifiée que le modèle choisit |
| Taux de vrais positifs | la part des personnes qualifiées que le modèle choisit |
| Faux positif | une personne non qualifiée que le modèle choisit |
| Matrice de confusion | un tableau des bonnes et des mauvaises réponses du modèle |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
On compare des taux, jamais des nombres bruts
Un groupe de 200 personnes a plus de personnes choisies qu’un groupe de 50. Comparer les nombres bruts ne dit rien.
Le taux de sélection divise le nombre de personnes choisies par la taille du groupe. C’est lui qu’on compare entre A et B.
Exemple travaillé : un tri de candidatures
| Groupe | Candidats | Qualifiés | Choisis | Choisis et qualifiés |
|---|---|---|---|---|
| A | 100 | 50 | 50 | 40 |
| B | 100 | 25 | 50 | 15 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Les deux taux du même tri
| Groupe | Taux de sélection | Taux de vrais positifs |
|---|---|---|
| A | 50 sur 100, soit 50 % | 40 sur 50, soit 80 % |
| B | 50 sur 100, soit 50 % | 15 sur 25, soit 60 % |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Calculer les deux taux d’un groupe
# Le tri des candidatures du groupe A.
candidats = 100
qualifies = 50
choisis = 50
choisis_qualifies = 40
print("taux de sélection :", choisis * 100 / candidats, "%")
print("taux de vrais positifs :", choisis_qualifies * 100 / qualifies, "%")
# Changez les quatre nombres pour le groupe B : 100, 25, 50 et 15.
Deux définitions de l’équité peuvent se contredire
Première définition : le même taux de sélection pour chaque groupe. Seconde définition : le même taux de vrais positifs, donc la même chance pour une personne qualifiée.
Dans notre exemple, la première est respectée et la seconde ne l’est pas. Une personne qualifiée du groupe B est moins souvent choisie que sa pareille du groupe A.
Le choix est humain
Important
Aucun calcul ne dit quelle définition est la bonne. Ici, A compte 50 qualifiés pour 100 et B seulement 25. Quand les groupes n’ont pas la même part de qualifiés, on ne respecte pas toujours les deux définitions. Il faut choisir, puis expliquer pourquoi.
La matrice de confusion donne tous les taux
Une matrice de confusion range les réponses d’un modèle dans quatre cases : vrais positifs, faux négatifs, faux positifs et vrais négatifs.
Le labo contient un petit modèle qui prévoit si un jour de location sera plein, c’est-à-dire 300 locations ou plus. Les lignes de la matrice sont la vérité, les colonnes sont la réponse du modèle, les jours pleins d’abord.
Lire une vraie matrice de confusion
docker exec jupyter python3 steps/knn.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.
Une erreur fréquente
Attention
Beaucoup pensent qu’une exactitude élevée prouve l’équité. L’exactitude moyenne cache les écarts. Un modèle exact à 90 % peut se tromper bien plus souvent sur un petit groupe. Calculez toujours les taux groupe par groupe.
Un écart se compare à un seuil
Un petit écart peut venir du hasard, surtout dans un petit groupe. Fixez à l’avance l’écart que vous acceptez, par exemple 5 points de pourcentage.
Si l’écart dépasse le seuil, ne cachez pas le chiffre. Dites quelle définition vous avez mesurée, sur combien de personnes, et ce que vous proposez de faire.
Dans votre carnet : deux types de jour
import pandas as pd
locations = pd.read_csv("hires.csv")
locations["plein"] = locations["hires"] >= 300
# Le taux de jours pleins pour chaque jour de la semaine.
locations.groupby("weekday")["plein"].mean().round(2)
# Quels jours ont le taux le plus haut et le plus bas ? Quel écart ?
Pour aller plus loin
Dans votre carnet, séparez les jours de semaine et de week-end avec locations["weekday"].isin(["Sat", "Sun"]).
Calculez pour chaque type de jour le taux de jours pleins. Dites en deux phrases si un modèle qui prévoit les jours pleins traiterait les deux types de la même façon.