CSI 4506 - Automne 2024
Version: sept. 30, 2024 08h54
Pendant nos discussions en classe, nous avons abordé les concepts de sous-apprentissage et de surapprentissage. Pour approfondir ces sujets, examinons-les dans le contexte de la régression polynomiale.
Un modèle linéaire représente mal ce jeu de données
L’ingénierie des attributs (feature engineering) est le processus de création, transformation et sélection de variables (attributs) à partir de données brutes afin d’améliorer la performance des modèles d’apprentissage automatique.
PolynomialFeatures
Génère une nouvelle matrice d’attributs consistant en toutes les combinaisons polynomiales des attributs avec un degré inférieur ou égal au degré spécifié. Par exemple, si un échantillon d’entrée est bidimensionnel et de la forme \([a, b]\), les attributs polynomiales de degré 2 sont \([1, a, b, a^2, ab, b^2]\).
PolynomialFeatures
Avec deux attributs \(a\) et \(b\), PolynomialFeatures
avec degree=3
ajouterait \(a^2\), \(a^3\), \(b^2\), \(b^3\), ainsi que \(ab\), \(a^2b\), \(ab^2\)!
Avertissement
PolynomialFeatures(degree=d)
ajoute \(\frac{(D+d)!}{d!D!}\) attributs, où \(D\) est le nombre initial de attributs.
LinearRegression
sur PolynomialFeatures
Les données ont été générées selon l’équation suivante, avec l’inclusion de bruit gaussien.
\[ y = 0.5 x^2 + 1.0 x + 2.0 \]
Le modèle appris est présenté ci-dessous.
\[ \hat{y} = 0.56 x^2 + (-1.06) x + 1.78 \]
Une faible valeur de perte sur l’ensemble d’entraînement n’indique pas nécessairement un “meilleur” modèle.
Mauvaise performance à la fois sur les données d’entraînement et les données de test.
Excellentes performances sur l’ensemble d’entraînement, mais mauvaises performances sur l’ensemble de test.
Autres vidéos :
Positif (Prédit) | Négatif (Prédit) | |
---|---|---|
Positif (Réel) | Vrai positif (VP) | Faux négatif (FN) |
Négatif (Réel) | Faux positif (FP) | Vrai négatif (VN) |
import numpy as np
np.random.seed(42)
from sklearn.datasets import load_digits
digits = load_digits()
X = digits.data
y = digits.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
from sklearn.linear_model import LogisticRegression
from sklearn.multiclass import OneVsRestClassifier
clf = OneVsRestClassifier(LogisticRegression())
clf = clf.fit(X_train, y_train)
import matplotlib.pyplot as plt
from sklearn.metrics import ConfusionMatrixDisplay
X_test = scaler.transform(X_test)
y_pred = clf.predict(X_test)
ConfusionMatrixDisplay.from_predictions(y_test, y_pred)
plt.show()
Quelle est l’exactitude de ce résultat ?
\[ \mathrm{exactitude} = \frac{\mathrm{VP}+\mathrm{VN}}{\mathrm{VP}+\mathrm{VN}+\mathrm{FP}+\mathrm{FN}} = \frac{\mathrm{VP}+\mathrm{VN}}{\mathrm{N}} \]
Aussi appelée valeur prédictive positive (PPV).
\[ \mathrm{précision} = \frac{\mathrm{VP}}{\mathrm{VP}+\mathrm{FP}} \]
Aussi appelé sensibilité ou taux de vrais positifs (TVP). \[ \mathrm{rappel} = \frac{\mathrm{VP}}{\mathrm{VP}+\mathrm{FN}} \]
\[ \begin{align*} F_1~\mathrm{score} &= \frac{2}{\frac{1}{\mathrm{précision}}+\frac{1}{\mathrm{rappel}}} = 2 \times \frac{\mathrm{précision}\times\mathrm{rappel}}{\mathrm{précision}+\mathrm{rappel}} \\ &= \frac{\mathrm{VP}}{\mathrm{FP}+\frac{\mathrm{FN}+\mathrm{FP}}{2}} \end{align*} \]
Les mesures de performance micro agrègent les contributions de toutes les classes pour calculer la moyenne des mesures de performance, telles que la précision, le rappel ou le score F1. Cette approche considère chaque prédiction individuelle de manière égale, ce qui permet une évaluation équilibrée en mettant l’accent sur la performance des classes fréquentes.
Les mesures de performance macro calculent les mesures de performance indépendamment pour chaque classe et ensuite les moyennent. Cette approche considère chaque classe de manière égale, quelle que soit sa fréquence, fournissant une évaluation qui accorde la même importance aux performances sur les classes fréquentes et rares.
from sklearn.metrics import ConfusionMatrixDisplay
# Données d'exemple
y_true = ['Chat'] * 42 + ['Chien'] * 7 + ['Renard'] * 11
y_pred = ['Chat'] * 39 + ['Chien'] * 1 + ['Renard'] * 2 + \
['Chat'] * 4 + ['Chien'] * 3 + ['Renard'] * 0 + \
['Chat'] * 5 + ['Chien'] * 1 + ['Renard'] * 5
ConfusionMatrixDisplay.from_predictions(y_true, y_pred)
from sklearn.metrics import classification_report, precision_score
print(classification_report(y_true, y_pred), "\n")
print("Précision micro : {:.2f}".format(precision_score(y_true, y_pred, average='micro')))
print("Précision macro : {:.2f}".format(precision_score(y_true, y_pred, average='macro')))
precision recall f1-score support
Chat 0.81 0.93 0.87 42
Chien 0.60 0.43 0.50 7
Renard 0.71 0.45 0.56 11
accuracy 0.78 60
macro avg 0.71 0.60 0.64 60
weighted avg 0.77 0.78 0.77 60
Précision micro : 0.78
Précision macro : 0.71
La précision macro-pondérée est calculée comme la moyenne des scores de précision pour chaque classe : \(\frac{0.81 + 0.60 + 0.71}{3} = 0.71\).
Alors que la précision micro-pondérée est calculée en utilisant la formule \(\frac{VP}{VP+FP}\) et les données provenant de toute la matrice de confusion \(\frac{39+3+5}{39+3+5+9+2+2} = \frac{47}{60} = 0.78\)
precision recall f1-score support
Chat 0.81 0.93 0.87 42
Chien 0.60 0.43 0.50 7
Renard 0.71 0.45 0.56 11
accuracy 0.78 60
macro avg 0.71 0.60 0.64 60
weighted avg 0.77 0.78 0.77 60
Rappel micro : 0.78
Rappel macro : 0.60
Le rappel macro-moyen est calculé comme la moyenne des scores de rappel pour chaque classe : \(\frac{0.93 + 0.43 + 0.45}{3} = 0.60\).
Alors que le rappel micro-moyen est calculé en utilisant la formule \(\frac{VP}{VP+FN}\) et les données provenant de toute la matrice de confusion \(\frac{39+3+5}{39+3+5+3+4+6} = \frac{47}{60} = 0.78\)
precision recall f1-score support
Normal 1.00 0.99 1.00 990
Tumeur 0.55 0.60 0.57 10
accuracy 0.99 1000
macro avg 0.77 0.80 0.78 1000
weighted avg 0.99 0.99 0.99 1000
Précision micro : 0.99
Précision macro : 0.77
Rappel micro : 0.99
Rappel macro : 0.80
Chargement du jeu de données
Affichage des cinq premiers exemples
Ces images ont des dimensions de ( 28 ) pixels.
SGDClassifier
from sklearn.metrics import accuracy_score
y_pred = clf.predict(X_test)
accuracy_score(y_test, y_pred)
0.9572857142857143
Wow !
Receiver Operating Characteristics (ROC) curve
Marcel Turcotte
École de science informatique et de génie électrique (SIGE)
Université d’Ottawa