본문 바로가기
머신러닝/SVM

SVM을 이용하여 MNIST 분류하기

by jambo88 2022. 11. 23.

 

학교 과제로 제출한 SVM을 이용한 MNIST Classification.

1. 개요

  • SVM을 이용하여 MNIST Dataset의 Label이 0과 9인 것들을 추출한 후 Binary Classification 수행
  • SVM의 Hyper Parameter (kernel과 C)에 변화를 주며 그 특성 파악

2. Mnist Dataset Load

  • Keras로부터 Mnist dataset load
  • np.where 를 이용해 Label이 0과 9인 항목의 인덱스 추출
  • Train과 Test set에 인덱스를 적용하여, 과제에서 사용할 Dataset 확보

3. SVC 함수 호출 후, 커널과 마진에 따른 성능 비교

  • Kernel은 'linear', 'rbf', 'poly', 'sigmoid' 적용
  • 마진의 정도를 의미하는 C는 0.1, 1, 1000, 1000000 으로 총 4개 적용
  • Confusion Matrix Score와 RoC 커브 및 AUC Score를 활용한 성능 비교
  • Confusion Matrix와 ROC 커브는 첨부파일 참조

4. SVC가 틀린 인덱스의 이미지 확인

  • kernel = 'rbf', C = 1000000 사용
  • 틀린 갯수는 5개
  • 이미지를 육안으로 확인했을 때, 딱히 오분류할 만한 이유는 없어 보임, SVC의 파라미터 조정으로 정확도를 높일 수 있을것으로 사료.
 

 

5. 추가 스터디 (CNN 사용 후, LIME을 통한 CNN 분석)

  • CNN으로 분류 시 역시 5개 틀림
  • 5개의 항목에 대해 이미지 확인 및 LIME으로 Positive 역할을 한 부분을 표시해서 함께 보면, 정답이 9이나 0으로 분류한 경우, 동그라미 부분은 인지했으나, 꼬리 부분을 인지하지 못해 0으로 오분류 한 것을 확인. 필터의 크기와 패딩에 변화를 주며 개선 가능

6. 고찰

  • SVC의 커널의 종류와 마진의 정도를 의미하는 C에 대해 학습 할 수 있었음
  • 커널이 rbf 와 poly의 경우가 linear와 sigmoid 보다 좋은 성능을 보여줌
  • C가 클수록(하드마진) linear와 sigmoid의 경우 오버피팅 되어 모델 평가 시 오히려 성능이 후퇴
  • 반면에 rbf와 poly의 경우 C가 클수록 좋은 성능을 보여줌, 하지만 1000 이상의 값에서는 성능발전이 없었음
  • LIME은 3d 이미지를 요구하여 머신러닝에는(2d 이미지 요구) 적용하지 못했음