소개
이 실습에서는 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 로지스틱 회귀의 성능을 비교하고, 선 그래프를 사용하여 결과를 시각화했습니다.