Regressão Logística Passo a Passo

Beginner

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

Introdução

Neste laboratório, exploraremos a esparcidade das soluções quando as penalidades L1, L2 e Elastic-Net são usadas para diferentes valores de C. Usaremos regressão logística para classificar imagens de dígitos 8x8 em duas classes: 0-4 contra 5-9. Visualizaremos os coeficientes dos modelos para diferentes valores de C.

Dicas da Máquina Virtual

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

Às vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar de carregar. 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 o problema rapidamente para si.

Importação de Bibliotecas Necessárias

O primeiro passo é importar as bibliotecas necessárias. Precisaremos de numpy, matplotlib.pyplot, datasets, StandardScaler e 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

Carregar o Conjunto de Dados

Carregaremos o conjunto de dados de dígitos usando datasets.load_digits(return_X_y=True). Também padronizaremos os dados usando StandardScaler().fit_transform(X). A variável alvo será binária, onde 0-4 serão classificados como 0 e 5-9 como 1.

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

Definir o Parâmetro de Regularização e a Razão L1

Definiremos o parâmetro de regularização C e a razão L1 l1_ratio para a penalidade Elastic-Net. Definiremos l1_ratio como 0,5.

l1_ratio = 0.5

Criar Subgráficos para Visualização

Criaremos subgráficos para visualizar os coeficientes dos modelos para diferentes valores de C. Criaremos 3 linhas e 3 colunas de subgráficos.

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

Treinar Modelos de Regressão Logística com Diferentes Penalidades e Parâmetros de Regularização

Treinaremos modelos de regressão logística com penalidades L1, L2 e Elastic-Net e diferentes valores de C. Aumentaremos a tolerância para reduzir o tempo de treinamento.

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 Esparsidade e Pontuações

Calcularemos a esparsidade (porcentagem de coeficientes zero) e as pontuações 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 Coeficientes

Visualizaremos os coeficientes dos modelos para cada penalidade e 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(())

Definir Títulos e Rótulos

Definiremos os títulos e rótulos dos subgráficos.

    if i == 0:
        axes_row[0].set_title("Penalidade L1")
        axes_row[1].set_title("Rede elástica\nl1_ratio = %s" % l1_ratio)
        axes_row[2].set_title("Penalidade L2")

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

Imprimir Resultados

Imprimiremos a esparcidade e as pontuações para cada modelo.

    print("C=%.2f" % C)
    print("{:<40} {:.2f}%".format("Esparsidade com penalidade L1:", sparsity_l1_LR))
    print("{:<40} {:.2f}%".format("Esparsidade com penalidade Rede elástica:", sparsity_en_LR))
    print("{:<40} {:.2f}%".format("Esparsidade com penalidade L2:", sparsity_l2_LR))
    print("{:<40} {:.2f}".format("Pontuação com penalidade L1:", score_l1_LR))
    print("{:<40} {:.2f}".format("Pontuação com penalidade Rede elástica:", score_en_LR))
    print("{:<40} {:.2f}".format("Pontuação com penalidade L2:", score_l2_LR))

Exibir Visualização

Exibiremos os subgráficos.

plt.show()

Sumário

Neste laboratório, exploramos a esparcidade das soluções quando penalidades L1, L2 e Rede Elástica são utilizadas para diferentes valores de C. Utilizamos regressão logística para classificar imagens de dígitos 8x8 em duas classes: 0-4 contra 5-9. Visualizamos os coeficientes dos modelos para diferentes valores de C. Também calculamos a esparcidade e as pontuações para cada modelo e imprimimos os resultados.