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.