딥러닝을 활용하여 손글씨 숫자 이미지(MNIST 데이터셋)를 분류하는 모델을 구축한다. MNIST는 0부터 9까지의 손글씨 숫자 이미지(28x28 픽셀)로 구성된 대표적인 이미지 분류 데이터셋이다. 이 문제는 10개의 클래스를 분류하는 다중 클래스 분류 문제이다.
TensorFlow의 keras.datasets 모듈을 통해 MNIST 데이터를 로딩한다. 학습 데이터 60,000개와 테스트 데이터 10,000개로 구성되어 있으며, 각 데이터는 28x28 크기의 흑백 이미지이다. 이미지를 시각화하여 각 숫자의 라벨이 잘 매칭되는지 확인한다.
이미지 데이터를 정규화하기 위해 0 ~ 255의 픽셀 값을 0 ~ 1 사이로 스케일링한다. 또한 모델 입력 형식에 맞게 데이터를 reshape 하며, 라벨은 원-핫 인코딩 처리한다. CNN 모델에서는 이미지 차원을 (28, 28, 1)로 변경한다.
딥러닝 모델로는 두 가지 방식을 사용한다.
테스트 데이터 중 하나를 선택하여 예측을 수행하고, 예측 결과를 이미지와 함께 시각화한다. 또한, 테스트 데이터 일부를 이용해 전체 정확도를 평가한다.
학습된 CNN 모델의 정확도는 테스트 데이터에서 약 98% 이상임을 확인한다. Confusion Matrix와 Classification Report를 통해 클래스 별 정밀도와 재현율도 분석한다. 이로써 모델이 손글씨 숫자를 잘 분류함을 확인한다.
• Precision
정확도. 특정 클래스(양성 등)로 예측된 값 중 실제로 해당 클래스인 비율. \[ \text{Precision} = \frac{TP}{TP + FP} \]
• Recall
재현율. 실제 해당 클래스 중 모델이 정확히 예측한 비율.
\[ \text{Recall} = \frac{TP}{TP + FN} \]
• F1-Score
Precision과 Recall의 조화 평균.
\[ \text{F1} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} \]
• Support
각 클래스의 실제 데이터 개수.
Classification Report: precision recall f1-score support 0 0.98 1.00 0.99 42 1 1.00 1.00 1.00 67 2 0.98 0.98 0.98 55 3 0.98 1.00 0.99 45 4 1.00 1.00 1.00 55 5 1.00 0.98 0.99 50 6 1.00 0.98 0.99 43 7 0.98 1.00 0.99 49 8 1.00 0.97 0.99 40 9 1.00 1.00 1.00 54 accuracy 0.99 500 macro avg 0.99 0.99 0.99 500 weighted avg 0.99 0.99 0.99 500
행은 실제 클래스, 열은 예측 클래스이다.
Actual (실제) | Predicted (예측) | |
---|---|---|
Positive (긍정) | Negative (부정) | |
Positive (긍정) | TP | FN |
Negative (부정) | FP | TN |
• True Positive (TP)
실제로 긍정이고 모델도 긍정으로 예측한 경우
• True Negative (TN)
실제로 부정이고 모델도 부정으로 예측한 경우
• False Positive (FP)
실제로 부정인데 모델이 긍정으로 잘못 예측한 경우 (Type I Error)
• False Negative (FN)
실제로 긍정인데 모델이 부정으로 잘못 예측한 경우 (Type II Error)
Confusion Matrix: [[42 0 0 0 0 0 0 0 0 0] [ 0 67 0 0 0 0 0 0 0 0] [ 0 0 54 0 0 0 0 1 0 0] [ 0 0 0 45 0 0 0 0 0 0] [ 0 0 0 0 55 0 0 0 0 0] [ 0 0 0 1 0 49 0 0 0 0] [ 1 0 0 0 0 0 42 0 0 0] [ 0 0 0 0 0 0 0 49 0 0] [ 0 0 1 0 0 0 0 0 39 0] [ 0 0 0 0 0 0 0 0 0 54]]