Regressão Logística Esparsa Multi-classe

Beginner

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

Introdução

Neste laboratório, exploraremos como utilizar a Regressão Logística Esparsa Multi-classe no conjunto de dados 20newsgroups utilizando o scikit-learn. Compararemos o desempenho da regressão logística multinomial com a regressão logística L1 um-contra-todos.

Dicas da Máquina Virtual

Após o arranque da VM, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.

Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar o carregamento. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se tiver problemas durante o aprendizado, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.

Importar Bibliotecas

Começamos importando as bibliotecas e módulos necessários que usaremos neste laboratório.

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")

Carregar e Preparar os Dados

Em seguida, carregamos o conjunto de dados 20newsgroups e preparamos os dados para treino e teste.

## Usamos o solucionador SAGA
solver = "saga"

## Reduzimos para um tempo de execução mais rápido
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(
    "Conjunto de dados 20newsgroups, train_samples=%i, n_features=%i, n_classes=%i"
    % (train_samples, n_features, n_classes)
)

Definir e Treinar Modelos

Vamos definir dois modelos, Regressão Logística L1 Multinomial e One-vs-Rest, e treiná-los com diferentes números de épocas.

models = {
    "ovr": {"name": "One versus Rest", "iters": [1, 2, 3]},
    "multinomial": {"name": "Multinomial", "iters": [1, 2, 5]},
}

for model in models:
    ## Adicionar valores iniciais de nível de chance para fins de plotagem
    accuracies = [1 / n_classes]
    times = [0]
    densities = [1]

    model_params = models[model]

    ## Pequeno número de épocas para tempo de execução rápido
    for this_max_iter in model_params["iters"]:
        print(
            "[model=%s, solver=%s] Número de épocas: %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("Precisão de teste para o modelo %s: %.4f" % (model, accuracies[-1]))
    print(
        "%% de coeficientes não nulos para o modelo %s, por classe:\n %s"
        % (model, densities[-1])
    )
    print(
        "Tempo de execução (%i épocas) para o modelo %s: %.2f"
        % (model_params["iters"][-1], model, times[-1])
    )

Visualizar Resultados

Finalmente, vamos visualizar os resultados dos modelos treinados usando um gráfico de linha.

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="Modelo: %s" % name)
    ax.set_xlabel("Tempo de treino (s)")
    ax.set_ylabel("Precisão de teste")
ax.legend()
fig.suptitle("Regressão Logística L1 Multinomial vs One-vs-Rest\nConjunto de Dados %s" % "20newsgroups")
fig.tight_layout()
fig.subplots_adjust(top=0.85)
run_time = timeit.default_timer() - t0
print("Tempo de execução do exemplo em %.3f s" % run_time)
plt.show()

Resumo

Neste laboratório, utilizamos o scikit-learn para realizar Regressão Logística Multi-classe Esparsa em um conjunto de dados 20newsgroups. Comparamos o desempenho da regressão logística multinomial com a regressão logística L1 one-versus-rest e visualizamos os resultados usando um gráfico de linha.