Régression logistique multiclasse sparse

Machine LearningMachine LearningBeginner
Pratiquer maintenant

This tutorial is from open-source community. Access the source code

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

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.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/linear_model("Linear Models") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/exceptions("Exceptions and Warnings") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/linear_model -.-> lab-49296{{"Régression logistique multiclasse sparse"}} sklearn/model_selection -.-> lab-49296{{"Régression logistique multiclasse sparse"}} sklearn/datasets -.-> lab-49296{{"Régression logistique multiclasse sparse"}} sklearn/exceptions -.-> lab-49296{{"Régression logistique multiclasse sparse"}} ml/sklearn -.-> lab-49296{{"Régression logistique multiclasse sparse"}} end

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.