Regresión logística paso a paso

Beginner

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

Introducción

En este laboratorio, exploraremos la esparsidad de las soluciones cuando se utilizan penas L1, L2 y Elastic-Net para diferentes valores de C. Utilizaremos regresión logística para clasificar imágenes de dígitos 8x8 en dos clases: 0-4 contra 5-9. Visualizaremos los coeficientes de los modelos para diferentes valores de C.

Consejos sobre la VM

Una vez finalizada la inicialización de 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 las bibliotecas necesarias

El primer paso es importar las bibliotecas necesarias. Necesitaremos numpy, matplotlib.pyplot, datasets, StandardScaler y LogisticRegression 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

Cargar el conjunto de datos

Cargaremos el conjunto de datos de dígitos utilizando datasets.load_digits(return_X_y=True). También estandarizaremos los datos utilizando StandardScaler().fit_transform(X). La variable objetivo será binaria, donde los valores de 0-4 se clasifican como 0 y los valores de 5-9 se clasifican como 1.

X, y = datasets.load_digits(return_X_y=True)
X = StandardScaler().fit_transform(X)
y = (y > 4).astype(int)

Definir el parámetro de regularización y la proporción L1

Definiremos el parámetro de regularización C y la proporción L1 l1_ratio para la penalización Elastic-Net. Estableceremos l1_ratio en 0.5.

l1_ratio = 0.5

Crear subtramas para visualización

Crearemos subtramas para visualizar los coeficientes de los modelos para diferentes valores de C. Crearemos subtramas con 3 filas y 3 columnas.

fig, axes = plt.subplots(3, 3)

Entrenar modelos de regresión logística con diferentes penalizaciones y parámetros de regularización

Entrenaremos modelos de regresión logística con penalizaciones L1, L2 y Elastic-Net y diferentes valores de C. Aumentaremos la tolerancia para un tiempo de entrenamiento corto.

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)

Calcular la esparsidad y las puntuaciones

Calcularemos la esparsidad (porcentaje de coeficientes nulos) y las puntuaciones para cada modelo.

    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)

Visualizar los coeficientes

Visualizaremos los coeficientes de los modelos para cada penalización y valor 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(())

Establecer títulos y etiquetas

Estableceremos los títulos y etiquetas para las subtramas.

    if i == 0:
        axes_row[0].set_title("Penalización L1")
        axes_row[1].set_title("Elastic-Net\nl1_ratio = %s" % l1_ratio)
        axes_row[2].set_title("Penalización L2")

    axes_row[0].set_ylabel("C = %s" % C)

Imprimir los resultados

Imprimiremos la esparsidad y las puntuaciones para cada modelo.

    print("C=%.2f" % C)
    print("{:<40} {:.2f}%".format("Eparsidad con penalización L1:", sparsity_l1_LR))
    print("{:<40} {:.2f}%".format("Eparsidad con penalización Elastic-Net:", sparsity_en_LR))
    print("{:<40} {:.2f}%".format("Eparsidad con penalización L2:", sparsity_l2_LR))
    print("{:<40} {:.2f}".format("Puntuación con penalización L1:", score_l1_LR))
    print("{:<40} {:.2f}".format("Puntuación con penalización Elastic-Net:", score_en_LR))
    print("{:<40} {:.2f}".format("Puntuación con penalización L2:", score_l2_LR))

Mostrar la visualización

Mostraremos las subtramas.

plt.show()

Resumen

En este laboratorio, exploramos la esparsidad de las soluciones cuando se utilizan penalizaciones L1, L2 y Elastic-Net para diferentes valores de C. Utilizamos regresión logística para clasificar imágenes de dígitos 8x8 en dos clases: 0-4 contra 5-9. Visualizamos los coeficientes de los modelos para diferentes valores de C. También calculamos la esparsidad y las puntuaciones para cada modelo e imprimimos los resultados.