Introduction
Dans ce laboratoire, nous explorerons la rareté des solutions lorsque la pénalité L1, L2 et Elastic-Net est utilisée pour différentes valeurs de C. Nous utiliserons la régression logistique pour classifier des images 8x8 de chiffres en deux classes : 0-4 contre 5-9. Nous visualiserons les coefficients des modèles pour différentes valeurs de C.
Conseils sur la machine virtuelle
Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Notebook pour accéder au Notebook Jupyter pour pratiquer.
Parfois, vous devrez peut-être attendre quelques secondes pour que le Notebook Jupyter ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du Notebook Jupyter.
Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous résoudrons rapidement le problème pour vous.
Importation des bibliothèques requises
La première étape consiste à importer les bibliothèques nécessaires. Nous aurons besoin de numpy, matplotlib.pyplot, datasets, StandardScaler et LogisticRegression à partir de sklearn.linear_model.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
Charger l'ensemble de données
Nous allons charger l'ensemble de données des chiffres à l'aide de datasets.load_digits(return_X_y=True). Nous allons également standardiser les données à l'aide de StandardScaler().fit_transform(X). La variable cible sera binaire, où 0-4 sera classé comme 0 et 5-9 sera classé comme 1.
X, y = datasets.load_digits(return_X_y=True)
X = StandardScaler().fit_transform(X)
y = (y > 4).astype(int)
Définir le paramètre de régularisation et le rapport L1
Nous allons définir le paramètre de régularisation C et le rapport L1 l1_ratio pour la pénalité Elastic-Net. Nous allons définir l1_ratio sur 0,5.
l1_ratio = 0.5
Créer des sous-graphiques pour la visualisation
Nous allons créer des sous-graphiques pour visualiser les coefficients des modèles pour différentes valeurs de C. Nous allons créer un tableau de sous-graphiques avec 3 lignes et 3 colonnes.
fig, axes = plt.subplots(3, 3)
Entraîner des modèles de régression logistique avec différentes pénalités et paramètres de régularisation
Nous allons entraîner des modèles de régression logistique avec des pénalités L1, L2 et Elastic-Net et différentes valeurs de C. Nous augmenterons la tolérance pour réduire le temps d'entraînement.
for i, (C, axes_row) in enumerate(zip((1, 0.1, 0.01), axes)):
clf_l1_LR = LogisticRegression(C=C, penalty="l1", tol=0.01, solver="saga")
clf_l2_LR = LogisticRegression(C=C, penalty="l2", tol=0.01, solver="saga")
clf_en_LR = LogisticRegression(C=C, penalty="elasticnet", solver="saga", l1_ratio=l1_ratio, tol=0.01)
clf_l1_LR.fit(X, y)
clf_l2_LR.fit(X, y)
clf_en_LR.fit(X, y)
Calculer la rareté et les scores
Nous allons calculer la rareté (pourcentage de coefficients nuls) et les scores pour chaque modèle.
coef_l1_LR = clf_l1_LR.coef_.ravel()
coef_l2_LR = clf_l2_LR.coef_.ravel()
coef_en_LR = clf_en_LR.coef_.ravel()
sparsity_l1_LR = np.mean(coef_l1_LR == 0) * 100
sparsity_l2_LR = np.mean(coef_l2_LR == 0) * 100
sparsity_en_LR = np.mean(coef_en_LR == 0) * 100
score_l1_LR = clf_l1_LR.score(X, y)
score_l2_LR = clf_l2_LR.score(X, y)
score_en_LR = clf_en_LR.score(X, y)
Visualiser les coefficients
Nous allons visualiser les coefficients des modèles pour chaque pénalité et valeur de C.
for ax, coefs in zip(axes_row, [coef_l1_LR, coef_en_LR, coef_l2_LR]):
ax.imshow(np.abs(coefs.reshape(8, 8)), interpolation='nearest', cmap='binary', vmax=1, vmin=0)
ax.set_xticks(())
ax.set_yticks(())
Définir les titres et les étiquettes
Nous allons définir les titres et les étiquettes pour les sous-graphiques.
if i == 0:
axes_row[0].set_title("Pénalité L1")
axes_row[1].set_title("Elastic-Net\nl1_ratio = %s" % l1_ratio)
axes_row[2].set_title("Pénalité L2")
axes_row[0].set_ylabel("C = %s" % C)
Afficher les résultats
Nous allons afficher la rareté et les scores pour chaque modèle.
print("C=%.2f" % C)
print("{:<40} {:.2f}%".format("Rareté avec la pénalité L1 :", sparsity_l1_LR))
print("{:<40} {:.2f}%".format("Rareté avec la pénalité Elastic-Net :", sparsity_en_LR))
print("{:<40} {:.2f}%".format("Rareté avec la pénalité L2 :", sparsity_l2_LR))
print("{:<40} {:.2f}".format("Score avec la pénalité L1 :", score_l1_LR))
print("{:<40} {:.2f}".format("Score avec la pénalité Elastic-Net :", score_en_LR))
print("{:<40} {:.2f}".format("Score avec la pénalité L2 :", score_l2_LR))
Afficher la visualisation
Nous allons afficher les sous-graphiques.
plt.show()
Sommaire
Dans ce laboratoire, nous avons exploré la rareté des solutions lorsque des pénalités L1, L2 et Elastic-Net sont utilisées pour différentes valeurs de C. Nous avons utilisé la régression logistique pour classifier des images de chiffres 8x8 en deux classes : 0-4 contre 5-9. Nous avons visualisé les coefficients des modèles pour différentes valeurs de C. Nous avons également calculé la rareté et les scores pour chaque modèle et affiché les résultats.