Introducción
En este laboratorio, exploraremos cómo usar la regresión logística multinomial dispersa en el conjunto de datos 20newsgroups utilizando scikit-learn. Compararemos el rendimiento de la regresión logística multinomial con la regresión logística L1 uno contra el resto.
Consejos sobre la VM
Una vez que se haya iniciado la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.
A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.
Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.
Importar bibliotecas
Comenzamos importando las bibliotecas y módulos necesarios que usaremos en este laboratorio.
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")
Cargar y preparar los datos
A continuación, cargamos el conjunto de datos 20newsgroups y preparamos los datos para el entrenamiento y la prueba.
## Usamos el solucionador SAGA
solver = "saga"
## Disminuir para un tiempo de ejecución más 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(
"Dataset 20newsgroup, train_samples=%i, n_features=%i, n_classes=%i"
% (train_samples, n_features, n_classes)
)
Definir y entrenar los modelos
Definiremos dos modelos, Regresión Logística Multinomial y Regresión Logística L1 Uno contra el Resto, y los entrenaremos con un número diferente de épocas.
models = {
"ovr": {"name": "One versus Rest", "iters": [1, 2, 3]},
"multinomial": {"name": "Multinomial", "iters": [1, 2, 5]},
}
for model in models:
## Agregar valores iniciales de nivel de azar para fines de trazado
accuracies = [1 / n_classes]
times = [0]
densities = [1]
model_params = models[model]
## Número pequeño de épocas para un tiempo de ejecución 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("Precisión de prueba para el modelo %s: %.4f" % (model, accuracies[-1]))
print(
"%% de coeficientes no nulos para el modelo %s, por clase:\n %s"
% (model, densities[-1])
)
print(
"Tiempo de ejecución (%i épocas) para el modelo %s:%.2f"
% (model_params["iters"][-1], model, times[-1])
)
Visualizar los resultados
Finalmente, visualizaremos los resultados de los modelos entrenados utilizando un gráfico de líneas.
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("Tiempo de entrenamiento (s)")
ax.set_ylabel("Precisión de prueba")
ax.legend()
fig.suptitle("Multinomial vs One-vs-Rest Logistic L1\nConjunto de datos %s" % "20newsgroups")
fig.tight_layout()
fig.subplots_adjust(top=0.85)
run_time = timeit.default_timer() - t0
print("Ejecución de ejemplo en %.3f s" % run_time)
plt.show()
Resumen
En este laboratorio, usamos scikit-learn para realizar una Regresión Logística Esparsa Multiclase en el conjunto de datos 20newsgroups. Comparamos el rendimiento de la regresión logística multinomial con la regresión logística L1 uno contra el resto, y visualizamos los resultados utilizando un gráfico de líneas.