손글씨 숫자 분류를 위한 온라인 솔버 비교

Beginner

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

소개

이 실험에서는 손글씨 숫자 분류를 위한 다양한 온라인 솔버의 성능을 비교합니다. scikit-learn 라이브러리를 사용하여 데이터를 로드하고 전처리하며, 분류기를 학습하고 테스트합니다. 목표는 훈련 데이터의 비율이 다를 때 서로 다른 솔버의 성능을 관찰하는 것입니다.

VM 팁

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

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

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

데이터 로드 및 전처리

먼저 scikit-learn 에서 손글씨 숫자 데이터셋을 로드하고 훈련 데이터와 테스트 데이터로 분할합니다. 또한 데이터를 평균 0, 분산 1 로 스케일링합니다.

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

## 숫자 데이터셋 로드
X, y = datasets.load_digits(return_X_y=True)

## 데이터를 훈련 및 테스트 세트로 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

## 데이터를 평균 0, 분산 1 로 스케일링
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

분류기 정의

다양한 하이퍼파라미터를 가진 여러 온라인 분류 솔버를 정의합니다. 다음 분류기를 사용합니다.

  • SGDClassifier
  • Perceptron
  • PassiveAggressiveClassifier
  • LogisticRegression
from sklearn.linear_model import SGDClassifier, Perceptron, PassiveAggressiveClassifier, LogisticRegression

classifiers = [
    ("SGD", SGDClassifier(max_iter=1000)),
    ("Perceptron", Perceptron(max_iter=1000)),
    ("Passive-Aggressive I", PassiveAggressiveClassifier(max_iter=1000, loss="hinge", C=1.0, tol=1e-4)),
    ("Passive-Aggressive II", PassiveAggressiveClassifier(max_iter=1000, loss="squared_hinge", C=1.0, tol=1e-4)),
    ("LogisticRegression", LogisticRegression(max_iter=1000))
]

분류기 훈련 및 평가

각 분류기를 훈련 데이터의 1% 에서 95% 까지의 비율로 훈련시키고, 테스트 데이터에서 성능을 평가합니다. 테스트 오류율의 더 정확한 추정치를 얻기 위해 이 과정을 10 번 반복합니다.

heldout = [0.01, 0.05, 0.25, 0.5, 0.75, 0.9, 0.95]
rounds = 10
xx = 1.0 - np.array(heldout)

for name, clf in classifiers:
    print("Training %s" % name)
    yy = []
    for i in heldout:
        yy_ = []
        for r in range(rounds):
            X_train_, X_test_, y_train_, y_test_ = train_test_split(X_train, y_train, test_size=i, random_state=r)
            clf.fit(X_train_, y_train_)
            y_pred = clf.predict(X_test_)
            yy_.append(1 - np.mean(y_pred == y_test_))
        yy.append(np.mean(yy_))
    plt.plot(xx, yy, label=name)

plt.legend(loc="upper right")
plt.xlabel("훈련 데이터 비율")
plt.ylabel("테스트 오류율")
plt.show()

결과 해석

플롯에서 SGDClassifier, Perceptron, 그리고 Passive-Aggressive 분류기는 유사한 성능을 보이는 것을 관찰할 수 있습니다. Passive-Aggressive II 분류기는 약간 더 나은 성능을 보입니다. LogisticRegression 분류기는 모든 훈련 데이터 비율에서 가장 낮은 테스트 오류율을 보여 전체적으로 가장 우수한 성능을 보입니다.

요약

이 실험에서는 손글씨 숫자 분류를 위한 다양한 온라인 솔버의 성능을 비교했습니다. LogisticRegression 분류기가 전체적으로 가장 우수한 성능을 보였으며, SGDClassifier, Perceptron, 그리고 Passive-Aggressive 분류기는 유사한 성능을 보였습니다. 이 비교는 특정 문제와 데이터 세트에 가장 적합한 분류기를 선택하는 데 도움이 될 수 있습니다.