« On ajuste le modèle sur
Xety, avecXde forme(n, p)etyde forme(n,). »
Traduction intégrale : on entraîne le modèle sur un tableau de variables explicatives de n lignes et p colonnes, et sur une colonne de n réponses, la i-ème réponse correspondant à la i-ème ligne. Cette convention n'est pas stylistique : elle est typée, la casse portant une information sur la nature mathématique de l'objet.
| Objet mathématique | Typographie conventionnelle | Exemple | Nombre de dimensions |
|---|---|---|---|
| Scalaire | Minuscule italique, ou lettre grecque | n, p, α | 0 |
| Vecteur | Minuscule, souvent gras | y, x, β | 1 |
| Matrice | Majuscule | X, A, Σ | 2 |
Cette discipline de notation, antérieure de plusieurs décennies au Machine Learning, est attribuée à Alston Householder (Principles of Numerical Analysis, 1953) puis adoptée par la littérature d'algèbre linéaire numérique.
Conséquence directe : X est majuscule parce que c'est une matrice
(observations et variables) ; y est minuscule parce que c'est un vecteur
(une valeur par observation).
La seconde source de la convention est la formulation matricielle du modèle linéaire, standard en statistique :
y = X β + ε , d'estimateur des moindres carrés β̂ = (Xᵀ X)⁻¹ Xᵀ y
Argument de cohérence dimensionnelle : Xᵀ X n'a de sens que si X est une
matrice, et Xᵀ y que si y est un vecteur de longueur égale au nombre de lignes
de X. La notation conditionne la lisibilité des formules du domaine.
Définition rigoureuse
Soit un jeu de données de n observations décrites par p variables explicatives. La matrice des variables explicatives X est l'élément de dont le terme est la valeur prise par la j-ème variable explicative sur la i-ème observation. La i-ème ligne de X, notée , est le vecteur de caractéristiques (feature vector) de l'observation i. Synonymes : matrice de plan (design matrix), matrice des prédicteurs, feature matrix.
Traduction en langage courant : le tableau des informations fournies au modèle, débarrassé de la colonne à prédire et des colonnes sans rôle explicatif.
Point de vigilance : X ne contient ni la cible, ni les identifiants, ni les colonnes de traçabilité ; toute colonne conservée sera utilisée par l'algorithme, y compris un identifiant corrélé par accident à la cible (chapitres 005 et 028).
Définition rigoureuse
Le vecteur cible y est l'élément de en régression, ou de en classification où 𝒞 est l'ensemble fini des classes, dont la i-ème composante est la valeur de la variable cible observée pour la i-ème observation. La correspondance est positionnelle : est la réponse associée à la ligne de X. Synonymes : vecteur réponse, variable dépendante, target, labels.
Traduction en langage courant : la colonne des bonnes réponses, dans l'ordre des lignes du tableau.
Point de vigilance : y est un objet à une dimension, de forme (n,) et
non (n, 1) — distinction sans effet en mathématiques, mais réelle en code
(point 2.3).
df = pd.read_csv("transactions.csv")
CIBLE, HORS_MODELE = "statut", ["transaction_id", "date_operation"]
X = df.drop(columns=[CIBLE] + HORS_MODELE)
y = df[CIBLE]Interprétation : X est construit par soustraction, jamais par énumération des colonnes conservées ; une colonne ajoutée en amont entre donc automatiquement dans le modèle, ce qui impose une revue explicite du schéma.
Variantes et notation fautive : Y majuscule est justifié pour une cible
multi-sortie, de forme (n, t), et fautif pour une cible unique. Une partie
de la littérature de réseaux de neurones place les observations en colonnes,
avec X de forme (p, n) : variante cohérente en interne, mais incompatible
avec l'interface de scikit-learn, qui exige les observations en lignes.
| Symbole | Nom | Équivalent scikit-learn | Ce qu'il compte |
|---|---|---|---|
| n | Nombre d'observations | n_samples | Les lignes de X, la longueur de y |
| p | Nombre de variables explicatives | n_features | Les colonnes de X |
| k | Nombre de classes | n_classes | Les modalités distinctes de y |
Certaines références notent d le nombre de variables et m celui des observations : la lettre importe peu, la position importe, le premier axe étant celui des observations.
L'égalité des longueurs est vérifiée automatiquement par scikit-learn. La correspondance ligne à ligne n'est vérifiable par aucune bibliothèque : c'est une propriété du code qui a produit X et y.
Rappel de vocabulaire : la forme (shape) est le t-uplet des tailles des
axes. (n,) et (n, 1) contiennent le même nombre de valeurs mais pas le même
rang — vecteur d'un côté, matrice à une colonne de l'autre.
print("X :", X.shape)
print("y :", y.shape)
print("y ndim :", y.ndim)
print("longueurs égales :", X.shape[0] == y.shape[0])X : (120000, 14)
y : (120000,)
y ndim : 1
longueurs égales : TrueInterprétation : 120 000 observations décrites par 14 variables et 120 000
valeurs cibles ; le rang 1 de y confirme qu'il s'agit d'un vecteur. De coût
nul, la vérification se répète après chaque filtrage.
y_correct = df["statut"] # Series pandas -> forme (120000,) ndim 1
y_faux = df[["statut"]] # DataFrame -> forme (120000, 1) ndim 2Passé à un estimateur, le second déclenche l'avertissement suivant, qui n'interrompt pas l'exécution et se répète à chaque itération de validation :
DataConversionWarning: A column-vector y was passed when a 1d array was
expected. Please change the shape of y to (n_samples,), for example using
ravel().Correction : df["statut"] ou df[["statut"]].to_numpy().ravel().
Le scénario le plus répandu consiste à filtrer X après avoir extrait y.
X = df.drop(columns=["transaction_id", "date_operation", "statut"])
y = df["statut"]
X = X.dropna() # 2 570 lignes retirées de X, aucune de y
RandomForestClassifier().fit(X, y)ValueError: Found input variables with inconsistent numbers of samples:
[117430, 120000]Interprétation : l'erreur est bénigne parce qu'elle est bruyante — le contrôle de cohérence interrompt l'exécution avant tout apprentissage. La forme correcte filtre le tableau source avant la séparation.
Le cas dangereux est le désalignement silencieux : les longueurs sont préservées, mais l'ordre des lignes diverge.
X = df.drop(columns=["transaction_id", "date_operation", "statut"])
X = X.sort_values("montant") # réordonnancement de X seul
y = df["statut"]
print(X.shape[0] == y.shape[0])
print(cross_val_score(RandomForestClassifier(), X, y, cv=5,
scoring="roc_auc").mean().round(3))True
0.501Interprétation : aucune exception n'est levée. Les estimateurs convertissent les objets pandas en tableaux NumPy et ignorent l'index : la correspondance est perdue sans signal, et le modèle apprend une association entre des transactions et les étiquettes d'autres transactions. Un ROC-AUC de 0,501 sur un problème réputé prédictible est la signature d'un désalignement, non celle d'un mauvais algorithme.
Garde-fou : l'index est alors le seul témoin de la correspondance —
assert X.index.equals(y.index). Un filtrage lève une exception, donc reste
bénin ; sort_values(), sample(frac=1) et un reset_index(drop=True)
unilatéral sont silencieux, donc critiques.
Label se traduit par étiquette ; les deux termes sont équivalents et coexistent dans les milieux francophones, de même que étiqueter, annoter et l'anglicisme labelliser.
Définition rigoureuse
Valeur de la variable cible associée à une observation dans un jeu de données d'apprentissage supervisé, tenue pour la réponse de référence de cette observation. L'ensemble ordonné des étiquettes constitue le vecteur cible y.
Traduction en langage courant : la bonne réponse, déjà connue, attachée à une ligne du tableau.
Portée du terme : au sens strict, une étiquette est une valeur catégorielle qui nomme la catégorie d'appartenance de l'observation. En classification, une étiquette est une classe ; en régression, la valeur associée est une valeur cible numérique et non une étiquette au sens strict, même si l'usage professionnel étend le mot aux deux situations.
Point de vigilance : une étiquette n'est pas une vérité absolue mais une valeur enregistrée, qui peut être erronée ou refléter la décision d'un opérateur faillible. La vérité terrain (ground truth), ensemble des valeurs de référence servant à juger le modèle, n'est donc pas la réalité mais sa mesure disponible : un jeu de fraude contient les fraudes détectées, les autres portant l'étiquette « Normal ».
| Critère | Classification | Régression |
|---|---|---|
| Nature de | Catégorie | Nombre réel |
| Terme rigoureux | Étiquette de classe (class label) | Valeur cible, valeur réponse |
| Ensemble d'arrivée | Ensemble fini 𝒞, de cardinal k | ℝ ou un intervalle de ℝ |
| Écart entre deux valeurs | Non défini | Défini et interprétable |
| Exemple | statut ∈ {Fraude, Normal} | montant_sinistre = 4 380,50 $ |
Point de vigilance : la distinction ne se lit pas dans le type informatique
de la colonne — une cible codée 0 et 1 est numérique au sens de pandas et
catégorielle au sens statistique. Le critère est la nature du phénomène
mesuré (chapitre 010).
Qualité de l'étiquetage : entre le phénomène et la valeur inscrite dans y s'interposent une détection et un enregistrement, tous deux faillibles. Lorsque plusieurs opérateurs annotent les mêmes observations, leur taux de désaccord borne la performance atteignable ; le kappa (Cohen, 1960) mesure cet accord en corrigeant l'effet du hasard.
Définition rigoureuse
Modalité de la variable cible d'un problème de classification. L'ensemble des k classes forme une partition de l'espace des observations : toute observation appartient à une classe et à une seule ; les classes sont donc mutuellement exclusives et collectivement exhaustives.
Traduction en langage courant : une des catégories possibles de la réponse, et une seule par ligne.
Cardinal : k = 2 en classification binaire, k > 2 en multiclasse ; la classification multilabel lève l'hypothèse d'exclusivité (chapitre 011).
Point de vigilance : une classe est une modalité de la cible ; les modalités d'une variable explicative sont des catégories (chapitre 022).
La plupart des estimateurs manipulent des étiquettes numériques. La conversion est mécanique, mais porte une décision implicite : quelle classe reçoit 1.
from sklearn.preprocessing import LabelEncoder
encodeur = LabelEncoder().fit(df["statut"])
print(dict(zip(encodeur.classes_, encodeur.transform(encodeur.classes_)))){'Fraude': 0, 'Normal': 1}Interprétation : LabelEncoder trie les modalités par ordre
lexicographique. « Fraude » précédant « Normal » dans l'alphabet, la fraude
reçoit le code 0 et le comportement normal le code 1 ; les métriques retenant
pos_label=1 par défaut, la classe positive devient « Normal » — l'inverse de
l'intention métier, sans aucun avertissement.
Forme recommandée : expliciter le codage plutôt que le subir.
y = (df["statut"] == "Fraude").astype(int)
print(y.value_counts())statut
0 119652
1 348
Name: count, dtype: int64Interprétation : le code 1 désigne la fraude par construction et non par accident alphabétique, et une ligne de code documente la décision.
| Convention | Contenu | Contexte |
|---|---|---|
| 0 / 1 | 0 = absence du phénomène, 1 = présence | Standard en classification binaire |
| Ordre lexicographique | Les modalités sont triées puis numérotées | Comportement par défaut de scikit-learn |
classes_ | Attribut exposant l'ordre retenu par l'estimateur | À consulter systématiquement |
Point de vigilance sur predict_proba : la matrice retournée comporte une
colonne par classe, ordonnées selon estimateur.classes_. Avec classes_ égal
à [0 1] et 1 désignant la fraude, predict_proba(X_test)[:, 1] porte bien la
probabilité de fraude ; avec des étiquettes textuelles non recodées, elle
porterait celle d'être normal, produisant un ROC-AUC inférieur à 0,5 sans
qu'aucune erreur ne soit levée.
Définition rigoureuse
Dans un problème de classification binaire, la classe positive est la modalité de la variable cible désignée comme événement d'intérêt ; elle sert de référence au calcul des quantités TP, FP, FN et TN et de toutes les métriques asymétriques qui en dérivent, la classe négative étant la modalité complémentaire. Le vocabulaire est emprunté au diagnostic médical, où un test « positif » signale la présence de la condition recherchée.
Traduction en langage courant : la classe positive est ce que l'on cherche à détecter.
Point de vigilance : « positif » n'est pas « favorable ». Dans un modèle de dépistage, la classe positive est « atteint » ; dans un modèle d'attrition, « résilie ». Le terme est descriptif, non évaluatif.
Un patient dont le test revient positif n'a pas reçu une bonne nouvelle. Le laboratoire n'a pas exprimé un jugement de valeur : il a signalé que la substance recherchée a été détectée.
Un test conçu pour détecter une maladie est calibré sur la maladie : nul ne demande « quelle est la sensibilité de ce test pour la bonne santé ». La classe positive d'un modèle obéit à la même logique — c'est la substance recherchée.
Les trois critères convergent presque toujours : ce que l'organisation cherche à détecter est aussi ce qui est rare et ce dont l'oubli coûte cher. En cas de divergence, le premier prime, étant métier.
| Cas d'usage | Classe positive | Classe négative | Action déclenchée |
|---|---|---|---|
| Détection de fraude | Fraude | Normal | Blocage ou revue manuelle |
| Dépistage médical | Atteint | Sain | Examen complémentaire |
| Attrition client | Résilie | Reste | Offre de rétention |
| Maintenance prédictive | Panne à 30 jours | Fonctionnement nominal | Intervention préventive |
Soit un modèle évalué sur 24 000 transactions dont 70 fraudes, fraude désignée positive :
| Prédit Normal | Prédit Fraude | |
|---|---|---|
| Réel Normal | TN = 23 620 | FP = 310 |
| Réel Fraude | FN = 28 | TP = 42 |
for nom, val in [("Accuracy", accuracy_score(y_test, y_pred)),
("Precision fraude", precision_score(y_test, y_pred, pos_label=1)),
("Recall fraude", recall_score(y_test, y_pred, pos_label=1)),
("F1 fraude", f1_score(y_test, y_pred, pos_label=1)),
("F1 normal", f1_score(y_test, y_pred, pos_label=0))]:
print(f"{nom:<17}: {val:.4f}")Accuracy : 0.9859
Precision fraude : 0.1193
Recall fraude : 0.6000
F1 fraude : 0.1990
F1 normal : 0.9929Interprétation : le même modèle, sur les mêmes prédictions, affiche un F1-score de 0,199 ou de 0,993 selon la classe désignée positive : détecteur médiocre d'un côté, système excellent en apparence qui laisse passer 40 % des fraudes de l'autre.
| Métrique | Comportement lors de l'inversion de la classe positive |
|---|---|
| Accuracy, Balanced Accuracy, Log Loss, coefficient de Matthews | Invariantes |
| Precision, Recall | Deviennent respectivement la valeur prédictive négative et la spécificité de l'ancienne désignation |
| F1-score, PR-AUC | Changent, radicalement en cas de déséquilibre |
| ROC-AUC | Inchangée si le score employé est celui de la nouvelle classe positive ; devient 1 − AUC sinon |
Ces métriques sont définies une à une aux chapitres 052 à 065 ; ce qui doit être
acquis ici est leur dépendance à la classe de référence. La désignation
gouverne aussi la lecture de la matrice de confusion, où l'échange des rôles
transforme un faux négatif en faux positif (chapitre 052), le sens de
déplacement du seuil (chapitre 062) et la classe que renforcent class_weight
et le suréchantillonnage (chapitre 051).
| Erreur classique | Manifestation | Correction |
|---|---|---|
| Laisser l'ordre alphabétique décider | « Fraude » codé 0 par LabelEncoder | Encoder explicitement la classe d'intérêt en 1 |
| Confondre positif et favorable | « Client fidèle » désigné positif dans un modèle d'attrition | Positif = événement recherché |
| Désigner la classe majoritaire | Métriques flatteuses et inexploitables | Désigner l'événement rare à détecter |
Omettre pos_label avec des étiquettes textuelles | ValueError: pos_label=1 is not a valid label | Passer pos_label="Fraude" ou recoder en 0/1 |
Lire confusion_matrix().ravel() sans vérifier l'ordre | TN, FP, FN, TP intervertis | Fixer labels= et contrôler classes_ |
Recommandation : la désignation appartient au cadrage du problème, au même titre que l'unité d'analyse : arrêtée avec le métier, écrite en clair, matérialisée par une seule expression explicite.
Définition rigoureuse
La classe majoritaire est celle dont l'effectif est le plus élevé dans le jeu considéré, la classe minoritaire celle dont l'effectif est le plus faible ; en multiclasse, la qualification s'étend par ordre décroissant des effectifs. La prévalence de la classe positive est la proportion d'observations de cette classe, π = n₁ / n ; le ratio de déséquilibre (imbalance ratio) est le quotient IR = / .
Traduction en langage courant : la classe la plus fréquente et la plus rare ; le pourcentage de cas positifs et le nombre de négatifs pour un positif.
Point de vigilance : ces qualifications sont empiriques ; elles décrivent la composition d'un échantillon, pas une propriété du phénomène. Un jeu rééchantillonné peut présenter des effectifs égaux alors que le phénomène reste rare dans la population, raison pour laquelle le jeu de test ne doit jamais être rééquilibré (chapitre 051).
Second point de vigilance : ce qui limite l'apprentissage n'est pas le seul ratio mais l'effectif absolu de la classe minoritaire. Un ratio de 100:1 avec 5 000 positifs est exploitable ; le même ratio avec 30 positifs ne l'est pas, quelle que soit la technique employée.
effectifs = df["statut"].value_counts()
print(effectifs)
print("Prévalence :", round(effectifs["Fraude"] / effectifs.sum(), 5))
print("Ratio de déséquilibre :", round(effectifs.max() / effectifs.min(), 1), ": 1")statut
Normal 119652
Fraude 348
Name: count, dtype: int64
Prévalence : 0.0029
Ratio de déséquilibre : 343.8 : 1Interprétation : la majoritaire est « Normal » avec 99,71 % des observations, la minoritaire « Fraude » avec 0,29 %, soit près de 344 transactions normales pour une transaction frauduleuse. L'effectif absolu de 348 fraudes est faible : après un découpage 80/20, le test n'en contiendra qu'environ 70, ce qui rend toute métrique calculée sur cette classe instable et impose un découpage stratifié (chapitre 027).
Recommandation : value_counts() sur la cible est la première commande
exécutée après le chargement d'un jeu de classification ; elle conditionne le
choix des métriques, la stratégie de découpage et le traitement du déséquilibre.
Les prévalences vont de 15 % à 30 % en attrition télécom à moins de 0,1 % en
détection d'intrusion : le déséquilibre est la situation normale.
La configuration dominante associe positive et minoritaire, mais un contrôle qualité où 92 % des pièces sont conformes et où l'on certifie la conformité désigne légitimement la majoritaire comme positive. Après rééquilibrage, la positive n'est plus minoritaire dans le train, mais le reste dans le test.
modele_nul = DummyClassifier(strategy="most_frequent").fit(X_train, y_train)
y_nul = modele_nul.predict(X_test)
print("Accuracy :", round(accuracy_score(y_test, y_nul), 4))
print("Recall fraude :", round(recall_score(y_test, y_nul, pos_label=1), 4))Accuracy : 0.9971
Recall fraude : 0.0Interprétation : un modèle qui prédit systématiquement « Normal » atteint 99,71 % d'accuracy et ne détecte aucune fraude — parfaitement inutile et parfaitement bien noté. C'est la raison pour laquelle l'accuracy est écartée dès que le déséquilibre est marqué. Un tel modèle constitue la baseline obligatoire du projet : un modèle qui ne la dépasse pas n'a rien appris (chapitres 050 et 051).
X.shape[0] == y.shape[0] est une condition nécessaire, jamais suffisante : un
tri, un mélange ou une réindexation appliqués à un seul des deux objets
préservent les longueurs et détruisent la correspondance, en silence.
Formulation correcte : « L'invariant à préserver est la correspondance positionnelle : la ligne i de X et la valeur décrivent la même observation. Tout filtrage ou tri s'applique au tableau source, avant la séparation. »
LabelEncoder trie les modalités par ordre lexicographique : avec « Fraude » et
« Normal », la fraude reçoit le code 0 et les métriques, qui retiennent
pos_label=1 par défaut, mesurent alors la classe « Normal ».
Formulation correcte : « La classe positive se déclare explicitement, par
exemple y = (df["statut"] == "Fraude").astype(int), et se vérifie en lisant
classes_ après ajustement. »
« Positif » signifie « présence de la condition recherchée » : le terme est descriptif et non évaluatif. La classe positive d'un modèle de dépistage est « atteint », celle d'un modèle d'attrition « résilie ».
Formulation correcte : « La classe positive est l'événement que le modèle a pour mission de détecter, indépendamment de son caractère souhaitable. »
Precision, recall, F1-score et PR-AUC sont asymétriques : sur le même modèle, le F1-score vaut 0,199 pour la fraude et 0,993 pour le comportement normal.
Formulation correcte : « Le F1-score sur la classe Fraude est de 0,199 », et jamais « le F1-score du modèle est de 0,199 ».
La classe positive résulte d'une décision méthodologique, la classe minoritaire d'un comptage ; leur coïncidence est un fait empirique. Après rééquilibrage, la classe positive n'est plus minoritaire dans le train mais le reste dans le test.
Formulation correcte : « La classe positive est désignée, la classe minoritaire est constatée. »
NOTATION
X matrice des variables explicatives forme (n, p) MAJUSCULE
y vecteur cible forme (n,) minuscule
Origine : typographie de l'algèbre linéaire
matrice = majuscule, vecteur = minuscule, scalaire = italique
INVARIANT D'ALIGNEMENT
Nécessaire : X.shape[0] == y.shape[0]
Suffisant : la ligne i de X et y_i décrivent la MÊME observation
Le désalignement silencieux ne lève aucune exception.
ÉTIQUETTE ET CLASSE
Étiquette : valeur de la variable cible pour une observation.
classification = étiquette de classe, catégorielle
régression = valeur cible, numérique
Classe : modalité de la cible ; les classes forment une partition,
exclusives et exhaustives.
La vérité terrain est une mesure, pas la réalité.
CLASSE POSITIVE
DÉSIGNÉE, pas constatée.
Critère : l'événement que l'on cherche à détecter
et qui déclenche une action.
Positif = présence du phénomène, jamais « favorable ».
Elle détermine precision, recall, F1, PR-AUC
et la lecture de la matrice de confusion.
CLASSE MAJORITAIRE / MINORITAIRE
CONSTATÉES par comptage : value_counts()
Prévalence = n_positifs / n Ratio = n_maj / n_min
L'effectif ABSOLU de la minoritaire compte autant que le ratio.Énoncé de synthèse
Xest majuscule parce que c'est une matrice de forme (n, p) etyminuscule parce que c'est un vecteur de forme (n,), leur correspondance étant positionnelle et non garantie par la seule égalité de leurs longueurs ; une étiquette est la valeur de la variable cible enregistrée pour une observation, une classe est une modalité de cette variable, et la classe positive est celle que l'organisation cherche à détecter — désignation méthodologique, distincte du constat de minorité, dont dépendent la matrice de confusion et toutes les métriques asymétriques.
Quiz associés
007.1-quiz-notation-x-y.md007.2-quiz-dimensions-alignement.md007.3-quiz-etiquette-label.md007.4-quiz-classe-encodage.md007.5-quiz-classe-positive.md007.6-quiz-classes-majoritaire-minoritaire.mdChapitre suivant : 008-algorithme-vs-modele.md