소개
이 실습에서는 L1, L2, 그리고 Elastic-Net 패널티를 다양한 C 값으로 적용했을 때 해의 희소성을 탐색합니다. 로지스틱 회귀를 사용하여 8x8 숫자 이미지를 두 개의 클래스 (0-4 대 5-9) 로 분류합니다. 다양한 C 값에 대해 모델의 계수를 시각화합니다.
VM 팁
VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근합니다.
때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.
학습 중 문제가 발생하면 Labby 에게 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.
필요한 라이브러리 가져오기
첫 번째 단계는 필요한 라이브러리를 가져오는 것입니다. numpy, matplotlib.pyplot, datasets, StandardScaler, 그리고 sklearn.linear_model에서 LogisticRegression이 필요합니다.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
데이터셋 로드
datasets.load_digits(return_X_y=True)를 사용하여 숫자 데이터셋을 로드합니다. 또한 StandardScaler().fit_transform(X)를 사용하여 데이터를 표준화합니다. 타겟 변수는 이진 변수로, 0-4 는 0 으로, 5-9 는 1 로 분류됩니다.
X, y = datasets.load_digits(return_X_y=True)
X = StandardScaler().fit_transform(X)
y = (y > 4).astype(int)
정규화 매개변수 및 L1 비율 정의
탄성 네트 (Elastic-Net) 페널티에 대한 정규화 매개변수 C와 L1 비율 l1_ratio를 정의합니다. l1_ratio를 0.5 로 설정합니다.
l1_ratio = 0.5
시각화를 위한 서브플롯 생성
다양한 C 값에 대한 모델 계수를 시각화하기 위해 서브플롯을 생성합니다. 3 행 3 열의 서브플롯을 생성합니다.
fig, axes = plt.subplots(3, 3)
서로 다른 페널티와 정규화 매개변수를 사용하여 로지스틱 회귀 모델 학습
L1, L2, 및 탄성 네트 (Elastic-Net) 페널티와 서로 다른 C 값을 사용하여 로지스틱 회귀 모델을 학습합니다. 짧은 학습 시간을 위해 허용 오차를 높입니다.
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)
희소성 및 점수 계산
각 모델에 대한 희소성 (0 계수의 백분율) 과 점수를 계산합니다.
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)
계수 시각화
각 페널티와 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(())
제목 및 레이블 설정
서브플롯의 제목과 레이블을 설정합니다.
if i == 0:
axes_row[0].set_title("L1 페널티")
axes_row[1].set_title("탄성 네트\nl1_ratio = %s" % l1_ratio)
axes_row[2].set_title("L2 페널티")
axes_row[0].set_ylabel("C = %s" % C)
결과 출력
각 모델의 희소성 (sparsity) 과 점수 (score) 를 출력합니다.
print("C=%.2f" % C)
print("{:<40} {:.2f}%".format("L1 페널티를 사용한 희소성:", sparsity_l1_LR))
print("{:<40} {:.2f}%".format("탄성 네트 페널티를 사용한 희소성:", sparsity_en_LR))
print("{:<40} {:.2f}%".format("L2 페널티를 사용한 희소성:", sparsity_l2_LR))
print("{:<40} {:.2f}".format("L1 페널티를 사용한 점수:", score_l1_LR))
print("{:<40} {:.2f}".format("탄성 네트 페널티를 사용한 점수:", score_en_LR))
print("{:<40} {:.2f}".format("L2 페널티를 사용한 점수:", score_l2_LR))
시각화 표시
서브플롯을 표시합니다.
plt.show()
요약
이 실험에서는 L1, L2, 그리고 탄성 네트 페널티를 사용하여 다양한 C 값에 따른 해의 희소성을 탐구했습니다. 로지스틱 회귀를 사용하여 8x8 숫자 이미지를 두 클래스 (0-4 대 5-9) 로 분류했습니다. 다양한 C 값에 대해 모델의 계수를 시각화했으며, 각 모델의 희소성과 점수를 계산하고 결과를 출력했습니다.