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 :
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.
Défi
MoyenEnviron 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.
- Corrige la division afin que les deux ensembles conservent la même proportion de roulements défectueux.
- 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.833Essayez 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
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é
1Votre premier modèle
Apprendre à partir d’exemplesJeux d’entraînement et de testAjuster et prédireÉvaluer un modèleRécapitulatif : trieur de graines4Régression logistique
Prédictions oui ou nonLe seuil de décisionLes poids comme indicesPlusieurs classesRécapitulatif : filtre anti-spam2Plus proches voisins
Comment k-NN prend ses décisionsChoisir kFrontières de décisionMettre les voisins à l’échelleRécapitulatif : voisins et vin5Évaluer les classificateurs
La matrice de confusionPrécision et rappelLe score F1Classes déséquilibréesCourbes ROCRécapitulatif : test de dépistage8Validation croisée
Validation K-foldComparer les modèles équitablementRecherche par grilleRécapitulatif : réparations de skateboard11Projet : espèces de manchots
À la rencontre des manchotsPréparer les donnéesChoisir un modèleOptimiser le modèle gagnantDéployer le modèle3Régression linéaire
Prédire des nombresPlusieurs caractéristiquesMesurer les erreursGraphiques des résidusRécapitulatif : locations de vélos6Arbres de décision
Les arbres posent des questionsLire un arbreProfondeur de l’arbreImportance des caractéristiquesRécapitulatif : décisions de prêtEntraînez-vous par vous-même : Compilateur Python en ligne