MNIST 다항 로지스틱 회귀

Beginner

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

소개

이 실습에서는 MNIST 데이터셋에서 작성된 손글씨 숫자를 분류하는 로지스틱 회귀 알고리즘을 사용하는 방법을 배웁니다. SAGA 알고리즘을 사용하여 MNIST 숫자 분류 작업의 일부에 대한 다항 로지스틱 회귀를 L1 페널티와 함께 적합합니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 연습을 위한 Jupyter Notebook에 접근합니다.

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

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

라이브러리 가져오기

이 실습에서는 필요한 라이브러리를 가져오는 것으로 시작합니다. scikit-learn 라이브러리를 사용하여 데이터셋을 가져오고, 모델을 학습시키며, 모델의 성능을 평가합니다.

import time
import matplotlib.pyplot as plt
import numpy as np

from sklearn.datasets import fetch_openml
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.utils import check_random_state

MNIST 데이터셋 로드

scikit-learn 의 fetch_openml 함수를 사용하여 MNIST 데이터셋을 로드합니다. train_samples 값을 5000 으로 설정하여 데이터의 일부를 선택합니다.

## 더 빠른 수렴을 위해 줄임
t0 = time.time()
train_samples = 5000

## https://www.openml.org/d/554에서 데이터 로드
X, y = fetch_openml(
    "mnist_784", version=1, return_X_y=True, as_frame=False, parser="pandas"
)

전처리

데이터를 섞고, 학습 및 테스트 데이터셋으로 분할하고, StandardScaler를 사용하여 데이터를 스케일링하여 데이터를 전처리합니다.

random_state = check_random_state(0)
permutation = random_state.permutation(X.shape[0])
X = X[permutation]
y = y[permutation]
X = X.reshape((X.shape[0], -1))

X_train, X_test, y_train, y_test = train_test_split(
    X, y, train_size=train_samples, test_size=10000
)

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

모델 학습

L1 페널티와 SAGA 알고리즘을 사용하여 로지스틱 회귀 모델을 학습합니다. C 값은 학습 샘플 수로 50.0 을 나눈 값으로 설정합니다.

## 더 빠른 수렴을 위해 허용 오차를 높임
clf = LogisticRegression(C=50.0 / train_samples, penalty="l1", solver="saga", tol=0.1)
clf.fit(X_train, y_train)

모델 평가

모델의 성능을 희소성 (sparsity) 과 정확도 (accuracy) 점수를 계산하여 평가합니다.

sparsity = np.mean(clf.coef_ == 0) * 100
score = clf.score(X_test, y_test)

print("L1 페널티를 사용한 희소성: %.2f%%" % sparsity)
print("L1 페널티를 사용한 테스트 점수: %.4f" % score)

모델 시각화

각 클래스에 대한 분류 벡터를 플롯하여 모델을 시각화합니다.

coef = clf.coef_.copy()
plt.figure(figsize=(10, 5))
scale = np.abs(coef).max()
for i in range(10):
    l1_plot = plt.subplot(2, 5, i + 1)
    l1_plot.imshow(
        coef[i].reshape(28, 28),
        interpolation="nearest",
        cmap=plt.cm.RdBu,
        vmin=-scale,
        vmax=scale,
    )
    l1_plot.set_xticks(())
    l1_plot.set_yticks(())
    l1_plot.set_xlabel("클래스 %i" % i)
plt.suptitle("분류 벡터...")

run_time = time.time() - t0
print("예제 실행 시간 %.3f 초" % run_time)
plt.show()

요약

이 실험에서 MNIST 데이터셋으로부터 손으로 쓴 숫자를 분류하는 데 로지스틱 회귀를 사용하는 방법을 배웠습니다. 또한 로지스틱 회귀에 L1 페널티를 사용하여 SAGA 알고리즘을 활용하는 방법을 학습했습니다. 희소 가중치 벡터를 사용하여 0.8 이상의 정확도 점수를 달성했으며, 이는 모델의 해석력을 높였습니다. 그러나 이 정확도는 이 데이터셋에서 L2 페널티를 적용한 선형 모델이나 비선형 다층 퍼셉트론 모델로 달성할 수 있는 정확도에 비해 현저히 낮다는 점도 주목했습니다.