단계별 로지스틱 회귀 분석

Beginner

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

소개

이 실습에서는 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 값에 대해 모델의 계수를 시각화했으며, 각 모델의 희소성과 점수를 계산하고 결과를 출력했습니다.