손글씨 숫자 인식

Beginner

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

소개

이 실험실에서는 scikit-learn 을 사용하여 0-9 의 손으로 쓴 숫자 이미지를 인식하는 방법을 보여줍니다.

VM 팁

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

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

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

라이브러리 가져오기

먼저 필요한 라이브러리를 가져와야 합니다. 시각화에는 matplotlib를, 데이터셋 로드 및 평가에는 sklearndatasetsmetrics를, 서포트 벡터 머신 학습에는 svm을 사용합니다.

import matplotlib.pyplot as plt
from sklearn import datasets, svm, metrics
from sklearn.model_selection import train_test_split

숫자 데이터셋 로드 및 시각화

8x8 픽셀 이미지로 구성된 숫자 데이터셋을 로드합니다. matplotlibimshow() 메서드를 사용하여 첫 4 개 이미지와 해당 레이블을 시각화합니다.

digits = datasets.load_digits()

_, axes = plt.subplots(nrows=1, ncols=4, figsize=(10, 3))
for ax, image, label in zip(axes, digits.images, digits.target):
    ax.set_axis_off()
    ax.imshow(image, cmap=plt.cm.gray_r, interpolation="nearest")
    ax.set_title("Training: %i" % label)

데이터셋 준비

이미지를 평탄화하여 각 2 차원 회색조 값 배열의 모양을 (8, 8)에서 (64,)로 바꿔야 합니다. 이렇게 하면 (n_samples, n_features) 모양의 데이터셋이 생성됩니다. 여기서 n_samples는 이미지 수이고 n_features는 각 이미지의 총 픽셀 수입니다.

n_samples = len(digits.images)
data = digits.images.reshape((n_samples, -1))

데이터셋 분할

sklearn.model_selectiontrain_test_split() 메서드를 사용하여 데이터셋을 50% 훈련 및 50% 테스트 하위 집합으로 분할합니다.

X_train, X_test, y_train, y_test = train_test_split(
    data, digits.target, test_size=0.5, shuffle=False
)

서포트 벡터 머신 학습

sklearnsvm.SVC() 메서드를 사용하여 훈련 샘플에 대한 서포트 벡터 분류기를 학습합니다.

clf = svm.SVC(gamma=0.001)
clf.fit(X_train, y_train)

모델 예측 및 평가

학습된 모델을 사용하여 테스트 하위 집합의 샘플에 대한 숫자 값을 예측합니다. 그런 다음 sklearn.metricsmetrics.classification_report()metrics.ConfusionMatrixDisplay.from_predictions() 메서드를 사용하여 모델을 평가합니다.

predicted = clf.predict(X_test)

print(
    f"분류기 {clf}에 대한 분류 보고서:\n"
    f"{metrics.classification_report(y_test, predicted)}\n"
)

disp = metrics.ConfusionMatrixDisplay.from_predictions(y_test, predicted)
disp.figure_.suptitle("혼동 행렬")
print(f"혼동 행렬:\n{disp.confusion_matrix}")

혼동 행렬로부터 분류 보고서 재구성

분류기 평가 결과가 혼동 행렬 형태로 저장되어 있고 y_truey_pred 값이 아닌 경우에도 metrics.classification_report() 메서드를 사용하여 분류 보고서를 생성할 수 있습니다.

y_true = []
y_pred = []
cm = disp.confusion_matrix

for gt in range(len(cm)):
    for pred in range(len(cm)):
        y_true += [gt] * cm[gt][pred]
        y_pred += [pred] * cm[gt][pred]

print(
    "혼동 행렬로부터 재구성된 분류 보고서:\n"
    f"{metrics.classification_report(y_true, y_pred)}\n"
)

요약

이 실습에서는 scikit-learn 을 사용하여 서포트 벡터 머신 (Support Vector Machine) 을 통해 0 에서 9 까지의 손글씨 숫자를 인식하는 방법을 배웠습니다. 숫자 데이터셋을 로드하고 시각화했으며, 데이터셋을 준비하고 분할한 후 모델을 학습하고, 분류 보고서와 혼동 행렬을 사용하여 모델을 예측하고 평가했습니다.