Introduction
Dans ce laboratoire, nous allons explorer la manière d'utiliser la régression logistique multinomiale sparse sur l'ensemble de données 20newsgroups à l'aide de scikit-learn. Nous comparerons les performances de la régression logistique multinomiale avec la régression logistique L1 one-versus-rest.
Conseils sur la VM
Une fois le démarrage de la VM terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Notebook pour accéder à Jupyter Notebook pour la pratique.
Parfois, vous devrez peut-être attendre quelques secondes pour que Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations de Jupyter Notebook.
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
Nous commençons par importer les bibliothèques et les modules nécessaires que nous utiliserons dans ce laboratoire.
import timeit
import warnings
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import fetch_20newsgroups_vectorized
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.exceptions import ConvergenceWarning
warnings.filterwarnings("ignore", category=ConvergenceWarning, module="sklearn")
Charger et préparer les données
Ensuite, nous chargeons l'ensemble de données 20newsgroups et préparons les données pour l'entraînement et les tests.
## Nous utilisons le solveur SAGA
solver = "saga"
## Baisser pour une exécution plus rapide
n_samples = 5000
X, y = fetch_20newsgroups_vectorized(subset="all", return_X_y=True)
X = X[:n_samples]
y = y[:n_samples]
X_train, X_test, y_train, y_test = train_test_split(
X, y, random_state=42, stratify=y, test_size=0.1
)
train_samples, n_features = X_train.shape
n_classes = np.unique(y).shape[0]
print(
"Dataset 20newsgroup, train_samples=%i, n_features=%i, n_classes=%i"
% (train_samples, n_features, n_classes)
)
Définir et entraîner les modèles
Nous allons définir deux modèles, la régression logistique multinomiale et la régression logistique L1 One-vs-Rest, et les entraîner avec un nombre différent d'époques.
models = {
"ovr": {"name": "One versus Rest", "iters": [1, 2, 3]},
"multinomial": {"name": "Multinomial", "iters": [1, 2, 5]},
}
for model in models:
## Ajoutez des valeurs initiales de niveau aléatoire pour les fins de tracé
accuracies = [1 / n_classes]
times = [0]
densities = [1]
model_params = models[model]
## Petit nombre d'époques pour une exécution rapide
for this_max_iter in model_params["iters"]:
print(
"[model=%s, solver=%s] Nombre d'époques: %s"
% (model_params["name"], solver, this_max_iter)
)
lr = LogisticRegression(
solver=solver,
multi_class=model,
penalty="l1",
max_iter=this_max_iter,
random_state=42,
)
t1 = timeit.default_timer()
lr.fit(X_train, y_train)
train_time = timeit.default_timer() - t1
y_pred = lr.predict(X_test)
accuracy = np.sum(y_pred == y_test) / y_test.shape[0]
density = np.mean(lr.coef_!= 0, axis=1) * 100
accuracies.append(accuracy)
densities.append(density)
times.append(train_time)
models[model]["times"] = times
models[model]["densities"] = densities
models[model]["accuracies"] = accuracies
print("Précision de test pour le modèle %s: %.4f" % (model, accuracies[-1]))
print(
"%% de coefficients non nuls pour le modèle %s, par classe:\n %s"
% (model, densities[-1])
)
print(
"Temps d'exécution (%i epoques) pour le modèle %s:%.2f"
% (model_params["iters"][-1], model, times[-1])
)
Visualiser les résultats
Enfin, nous allons visualiser les résultats des modèles entraînés à l'aide d'un graphique en ligne.
fig = plt.figure()
ax = fig.add_subplot(111)
for model in models:
name = models[model]["name"]
times = models[model]["times"]
accuracies = models[model]["accuracies"]
ax.plot(times, accuracies, marker="o", label="Modèle : %s" % name)
ax.set_xlabel("Temps d'entraînement (s)")
ax.set_ylabel("Précision de test")
ax.legend()
fig.suptitle("Multinomiale vs One-vs-Rest Logistique L1\nEnsemble de données %s" % "20newsgroups")
fig.tight_layout()
fig.subplots_adjust(top=0.85)
run_time = timeit.default_timer() - t0
print("Exécution de l'exemple en %.3f s" % run_time)
plt.show()
Sommaire
Dans ce laboratoire, nous avons utilisé scikit-learn pour effectuer une régression logistique multiclasse sparse sur l'ensemble de données 20newsgroups. Nous avons comparé les performances de la régression logistique multinomiale avec la régression logistique L1 one-versus-rest, et visualisé les résultats à l'aide d'un graphique en ligne.