다중 클래스 희소 로지스틱 회귀

Beginner

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

소개

이 실습에서는 scikit-learn 을 사용하여 20newsgroups 데이터셋에 다중 클래스 희소 로지스틱 회귀를 적용하는 방법을 살펴봅니다. 다항 로지스틱 회귀와 일대다 L1 로지스틱 회귀의 성능을 비교해 보겠습니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습용 Jupyter Notebook에 접근합니다.

때때로 Jupyter Notebook 이 로드되는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.

학습 중 문제가 발생하면 Labby 에게 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

라이브러리 가져오기

이 실습에서 사용할 필요한 라이브러리와 모듈을 먼저 가져옵니다.

import timeit
import warnings

import matplotlib.pyplot as plt
import numpy as np

from sklearn.datasets import fetch_20newsgroups_vectorized
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.exceptions import ConvergenceWarning

warnings.filterwarnings("ignore", category=ConvergenceWarning, module="sklearn")

데이터 로드 및 준비

다음으로 20newsgroups 데이터셋을 로드하고 학습 및 테스트 데이터를 준비합니다.

## SAGA solver 를 사용합니다.
solver = "saga"

## 실행 시간을 단축하기 위해 샘플 수를 줄입니다.
n_samples = 5000

X, y = fetch_20newsgroups_vectorized(subset="all", return_X_y=True)
X = X[:n_samples]
y = y[:n_samples]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, random_state=42, stratify=y, test_size=0.1
)
train_samples, n_features = X_train.shape
n_classes = np.unique(y).shape[0]

print(
    "데이터셋 20newsgroup, train_samples=%i, n_features=%i, n_classes=%i"
    % (train_samples, n_features, n_classes)
)

모델 정의 및 학습

다항 분류 (Multinomial) 및 One-vs-Rest L1 로지스틱 회귀 모델을 정의하고, 다른 에포크 수로 학습합니다.

models = {
    "ovr": {"name": "One versus Rest", "iters": [1, 2, 3]},
    "multinomial": {"name": "Multinomial", "iters": [1, 2, 5]},
}

for model in models:
    ## 플롯을 위해 초기 확률 수준 값 추가
    accuracies = [1 / n_classes]
    times = [0]
    densities = [1]

    model_params = models[model]

    ## 빠른 실행 시간을 위해 에포크 수를 적게 설정
    for this_max_iter in model_params["iters"]:
        print(
            "[model=%s, solver=%s] 에포크 수: %s"
            % (model_params["name"], solver, this_max_iter)
        )
        lr = LogisticRegression(
            solver=solver,
            multi_class=model,
            penalty="l1",
            max_iter=this_max_iter,
            random_state=42,
        )
        t1 = timeit.default_timer()
        lr.fit(X_train, y_train)
        train_time = timeit.default_timer() - t1

        y_pred = lr.predict(X_test)
        accuracy = np.sum(y_pred == y_test) / y_test.shape[0]
        density = np.mean(lr.coef_ != 0, axis=1) * 100
        accuracies.append(accuracy)
        densities.append(density)
        times.append(train_time)
    models[model]["times"] = times
    models[model]["densities"] = densities
    models[model]["accuracies"] = accuracies
    print("모델 %s의 테스트 정확도: %.4f" % (model, accuracies[-1]))
    print(
        "모델 %s의 클래스별 비 -0 계수 비율:\n %s"
        % (model, densities[-1])
    )
    print(
        "모델 %s의 실행 시간 (%i 에포크): %.2f"
        % (model, model_params["iters"][-1], times[-1])
    )

결과 시각화

마지막으로 학습된 모델의 결과를 선 그래프를 사용하여 시각화합니다.

fig = plt.figure()
ax = fig.add_subplot(111)

for model in models:
    name = models[model]["name"]
    times = models[model]["times"]
    accuracies = models[model]["accuracies"]
    ax.plot(times, accuracies, marker="o", label="Model: %s" % name)
    ax.set_xlabel("학습 시간 (초)")
    ax.set_ylabel("테스트 정확도")
ax.legend()
fig.suptitle("다항 분류 vs One-vs-Rest 로지스틱 L1 회귀\n데이터셋 %s" % "20newsgroups")
fig.tight_layout()
fig.subplots_adjust(top=0.85)
run_time = timeit.default_timer() - t0
print("예제 실행 시간 %.3f 초" % run_time)
plt.show()

요약

이 실험에서는 scikit-learn 을 사용하여 20newsgroups 데이터셋에 다중 클래스 희소 로지스틱 회귀를 수행했습니다. 다항 로지스틱 회귀와 One-versus-Rest L1 로지스틱 회귀의 성능을 비교하고, 선 그래프를 사용하여 결과를 시각화했습니다.