Menu
CoddyTech

Classes déséquilibrées

Fait partie de la section Apprentissage supervisé du Journey Machine Learning de Coddy. Leçon 24 sur 58.

Lorsque 95 patients sur 100 sont en bonne santé, un modèle qui répond toujours « en bonne santé » obtient une précision de 95 % et ne détecte aucun patient malade. Avec des classes déséquilibrées, la précision est trompeuse :

Barres de précision et de rappel pour trois modèles sur des données où 5 % des patients sont malades. Toujours en bonne santé : précision 0.95, rappel 0.00. Modèle simple : 0.98 et 0.62. Modèle équilibré : 0.94 et 0.92

Deux correctifs. stratify=y conserve la proportion de 95 à 5 dans les deux ensembles, de sorte que l’ensemble de test contient des patients malades à détecter. class_weight="balanced" donne plus de poids à chaque ligne rare :

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=0, stratify=y)
model = LogisticRegression(max_iter=1000, class_weight="balanced")

Le modèle équilibré sacrifie un peu de précision pour détecter beaucoup plus de cas. Pour les cas rares, examinez le rappel et la précision, et non l’exactitude.

challenge icon

Défi

Moyen

Environ 5 % des roulements d’une usine tombent en panne prématurément. Le code de départ divise les enregistrements d’un banc d’essai et évalue un modèle simple, mais son ensemble de test ne contient que 2 roulements défectueux ; son score de 0.993 ne signifie donc pas grand-chose.

  1. Corrige la division afin que les deux ensembles conservent la même proportion de roulements défectueux.
  2. Entraîne un second modèle qui accorde plus de poids aux lignes défectueuses, et affiche sa ligne comme ci-dessous.

Pour un autre banc d’essai :

Faulty bearings: train 8.1%, test 7.8%
Plain: accuracy 0.947, recall 0.417
Balanced: accuracy 0.900, recall 0.833

Essayez vous-même

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, recall_score

# Une ligne par roulement issu du banc d’essai : 1 dans faulty signifie qu’il est tombé en panne peu après
parts = pd.read_csv("bearings.csv")
features = ["vibration_mm_s", "temp_c", "noise_db", "hours_k"]
X = parts[features]
y = parts["faulty"]

# Corrigez cette répartition
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
print(f"Faulty bearings: train {y_train.mean() * 100:.1f}%, test {y_test.mean() * 100:.1f}%")

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

plain = LogisticRegression(max_iter=1000)
plain.fit(X_train, y_train)
pred = plain.predict(X_test)
print(f"Plain: accuracy {accuracy_score(y_test, pred):.3f}, recall {recall_score(y_test, pred):.3f}")

# Écrivez votre code ci-dessous
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Apprentissage supervisé

Entraînez-vous par vous-même : Compilateur Python en ligne