Module: Intelligence Artificielle
TP : Classification Supervisée
Diagnostic de Transformateurs Électriques
Filière Génie Électrique S2
Année Universitaire 2025 – 2026
Enseignant Pr. Mohamed IKERMANE
Contexte du TP
Vous êtes ingénieur(e) dans une entreprise de distribution électrique. Votre mission est de
développer un système automatique de diagnostic des transformateurs à partir de mesures
capteurs. Le système doit classifier chaque transformateur dans l'un des 3 états :
État Description Action
Normal Fonctionnement nominal Aucune intervention
Surcharge Charge excessive, surchauffe Planifier maintenance
modérée
Défaut Dysfonctionnement critique Intervention immédiate
Dataset : Le fichier [Link] contient 500 mesures avec 7 features et 1 colonne
cible (Etat).
Colonne Unité Description
Tension_V Volts (V) Tension aux bornes du transformateur
Courant_A Ampères (A) Courant traversant le transformateur
Temperature_C °C Température du boîtier
Vibration_mm_s mm/s Vibration mécanique mesurée
Humidite_pct % Humidité ambiante autour du transformateur
Facteur_Puissance Sans unité Facteur de puissance (cos φ)
Puissance_W Watts (W) Puissance apparente consommée
Etat — Classe cible : Normal / Surcharge / Défaut
Partie 1 : Chargement et Exploration des Données
Q1. Chargez le fichier [Link] avec Pandas. Affichez les 5 premières lignes.
import pandas as pd
df = pd.read_csv("[Link]")
print([Link]())
Q2. Combien de lignes et de colonnes contient le dataset ? Utilisez la méthode appropriée.
Q3. Affichez les types de chaque colonne avec [Link]. Y a-t-il des colonnes catégorielles ?
Q4. Affichez les statistiques descriptives (moyenne, écart-type, min, max) avec [Link]().
Commentez les différences d'échelle entre les features.
Q5. Vérifiez s'il y a des valeurs manquantes. Combien y en a-t-il par colonne ?
Q6. Traitez les valeurs manquantes en remplaçant chacune par la moyenne de sa colonne.
[Link]([Link](numeric_only=True), inplace=True)
Q7. Affichez la distribution de la variable cible (Etat). Les classes sont-elles équilibrées ?
Visualisez avec un diagramme en barres.
Q8. Créez un scatter plot avec Courant_A en abscisse et Temperature_C en ordonnée, coloré
par la classe (Etat). Que remarquez-vous ?
Partie 2 : Préparation des Données
Q9. Séparez les features (X) et la cible (y).
Attention: quelle(s) colonne(s) ne doivent PAS être dans X ?
Indication : la colonne Puissance_W est calculée à partir de Tension, Courant et Facteur_Puissance. Faut-il
la garder ? Justifiez.
Q10. Divisez les données en 70% train / 30% test avec train_test_split. Utilisez random_state=42
et stratify=y.
Q11. Vérifiez que la répartition des classes est bien conservée dans le train et le test.
print([Link](y_train).value_counts(normalize=True))
print([Link](y_test).value_counts(normalize=True))
Q12. Appliquez un StandardScaler sur les données. Rappelez pourquoi on fait fit_transform() sur
le train et transform() sur le test.
Q13. Affichez la moyenne et l'écart-type de X_train_s pour vérifier que la normalisation est
correcte.
Partie 2bis : Visualisation avec Matplotlib
Q14. Tracez un scatter plot (nuage de points) de Courant_A en abscisse et Temperature_C en
ordonnée, coloré par la classe Etat (une couleur par état). Ajoutez un titre, des labels sur les
axes et une légende. Commentez la séparation entre les classes.
import [Link] as plt
colors = {"Normal": "green", "Surcharge": "orange", "Défaut": "red"}
for etat, color in [Link]():
mask = y_train == etat
[Link](X_train[mask]["Courant_A"],
X_train[mask]["Temperature_C"],
c=color, label=etat, alpha=0.6)
[Link]("Courant (A)")
[Link]("Température (°C)")
[Link]("Courant vs Température par état")
[Link]()
[Link]()
Q15. Tracez des boxplots côte à côte pour la feature Vibration_mm_s, un boxplot par classe
(Etat). Quelle classe présente la plus grande dispersion ? Ce résultat est-il cohérent avec le
domaine ?
fig, ax = [Link](figsize=(8, 5))
[Link](column="Vibration_mm_s", by="Etat", ax=ax)
ax.set_title("Distribution de la vibration par état")
ax.set_xlabel("État du transformateur")
ax.set_ylabel("Vibration (mm/s)")
[Link]("") # supprimer le titre auto
[Link]()
Partie 3 : K-Nearest Neighbors
Q16. Créez un modèle KNN avec k=5 et entraînez-le sur les données normalisées.
from [Link] import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5)
[Link](X_train_s, y_train)
Q17. Calculez l'accuracy sur le jeu de test. Quel pourcentage de transformateurs sont bien
diagnostiqués ?
Q18. Testez plusieurs valeurs de k (de 1 à 20). Pour chaque k, calculez l'accuracy sur le train ET
sur le test. Tracez les deux courbes sur le même graphique.
• a) Quel est le k optimal ?
• b) Pour k=1, l'accuracy sur le train est de 100%. Pourquoi ? Est-ce un bon signe ?
• c) Que se passe-t-il quand k augmente trop ?
Q19. Avec le k optimal, prédisez l'état d'un transformateur ayant ces mesures: Tension=210V,
Courant=15A, Temp=82°C, Vibration=0.7mm/s, Humidité=52%, FP=0.72.
Q20. Affichez la matrice de confusion du KNN optimal. Combien de transformateurs en Défaut
ont été classés Normal (faux négatifs) ?
Partie 4 : Arbre de Décision
Q21. Créez un Arbre de Décision avec max_depth=4 et entraînez-le. Faut-il utiliser les données
normalisées ? Justifiez.
Q22. Affichez les règles de l'arbre avec export_text(). Quelle est la première question posée par
l'arbre ?
from [Link] import export_text
print(export_text(dt, feature_names=list([Link])))
Q23. Testez plusieurs profondeurs (max_depth de 1 à 10). Tracez l'accuracy train vs test. Quelle
profondeur choisir ?
Q24. Affichez l'importance des features avec dt.feature_importances_. Quelles sont les 3
features les plus utiles pour le diagnostic ?
Q25. Comparez l'accuracy de l'Arbre avec celle du KNN. Lequel est meilleur ici ?
Partie 5 : Support Vector Machine
Q26. Créez un SVM avec noyau RBF et entraînez-le sur les données normalisées.
from [Link] import SVC
svm = SVC(kernel="rbf", random_state=42)
[Link](X_train_s, y_train)
Q27. Calculez l'accuracy. Comparez avec KNN et l'Arbre de Décision.
Q28. Testez les 3 noyaux disponibles : linear, rbf et poly. Comparez leurs accuracy dans un petit
tableau.
Q29. Activez les probabilités (probability=True) et affichez les probabilités prédites pour les 5
premiers exemples du test.
svm_prob = SVC(kernel="rbf", probability=True, random_state=42)
svm_prob.fit(X_train_s, y_train)
print(svm_prob.predict_proba(X_test_s)[:5].round(3))
Q30. Interprétez : pour un transformateur donné, le SVM prédit [0.05, 0.12, 0.83]. Quel est son
état ? Êtes-vous confiant dans cette prédiction ?
Partie 6 : Évaluation et Comparaison Finale
Q31. Pour le meilleur modèle, affichez le classification_report complet. Identifiez la classe la
plus difficile à prédire.
from [Link] import classification_report
print(classification_report(y_test, y_pred,
target_names=["Défaut", "Normal", "Surcharge"]))
Q32. Expliquez en 2-3 phrases la différence entre la précision et le rappel. Dans le contexte de la
maintenance des transformateurs, laquelle est la plus importante et pourquoi ?
Q33. Tracez la courbe ROC pour le meilleur modèle (une courbe par classe). Calculez l'AUC pour
chaque classe.
Q34. Remplissez le tableau comparatif suivant :
Modèle Accuracy F1 (Défaut) F1 (macro) Temps (s)
KNN (k optimal) ... ... ... ...
Arbre (profondeur ... ... ... ...
optimale)
SVM (meilleur ... ... ... ...
noyau)
Q35. Quel modèle recommandez-vous pour le déploiement en production ? Justifiez en
considérant : accuracy, détection des défauts, interprétabilité, vitesse.