소개
이 실습에서는 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 페널티를 적용한 선형 모델이나 비선형 다층 퍼셉트론 모델로 달성할 수 있는 정확도에 비해 현저히 낮다는 점도 주목했습니다.