[MNIST] Random Forest를 이용한 간단한 모델 만들기

2020. 4. 12. 22:40Artificial Intelligence

 

 

 

https://www.iberdrola.com/wcorp/gc/prod/en_US/comunicacion/machine_learning_mult_1_res/machine_learning_746x419.jpg

 

 

 

 

MNIST는 기계학습계의 "Hello world"라고 불릴 만큼 유명한 데이터셋입니다. MNIST데이터셋에는 여러 가지 종류가 있지만 이번 포스팅에서는 가장 기초적인 머신 러닝 모델 학습을 위해 숫자 데이터셋을 이용하도록 하겠습니다. 모델은 28*28 크기의 손글씨 숫자 데이터를 입력받아 해당 손글씨가 나타내는 숫자를 출력하는 간단한 모델입니다.  코드는 Jupyter notebook을 이용하여 Python3 환경에서 작성 및 실행되었으며, 제 Github Repository 에 전체 코드가 작성되어 있습니다.

 

 

 

머신러닝 모델을 만들기 전에 해야 할 가장 중요한 일 중의 하나는 모델에 학습시킬 데이터의 형태, 구조등을 분석하는 것입니다. 크기는 어느 정도인지, 몇 가지의 Feature가 있는지, 그리고 그 Feature가 어떤 형태인지등을 분석해야 머신 러닝 모델 학습에 필요한 데이터의 모양으로 적절하게 전처리를 진행할 수 있습니다. 

 

 

 

 

 

7만개의 28*28 (=784) 크기 데이터가 입력값으로 들어온 것을 확인할 수 있습니다. Test Set으로 1만개, Training Set으로 6만개를 분류하여 최종 모델 성능을 판단할 때 사용할 Test Set을 미리 떼어 놓아야 합니다. (Test Set은 훈련 과정에서 사용해서는 안되는 데이터들입니다.)

 

 

 

MNIST 데이터 값의 샘플입니다.  1000번째 데이터가 나타내는 28*28 이미지를 출력하였고, 해당 Training Set의 원소가 나타내는 label(Y값)은 0으로 제대로 데이터가 주어져 있음을 확인할 수 있습니다.

 

 

 

 

 

앞서 말씀드린 바와 같이 실제 모델의 성능 평가에 사용하기 위해서, 1만개의 테스트 셋을 따로 분류해 놓습니다.  그리고 나서 트레이닝 셋의 index를 np.random.permutation 함수를 이용하여 마구잡이로 섞어놓는데, 이는 MNIST데이터가 순서대로 나열되어 있는 점을 고려했을 때, 학습을 순서대로 진행하는 것 보다 임의의 순서대로 진행하도록 하는 것이 학습 효율이 더 좋기 때문입니다. (0이 정답인 데이터 1만개를 훈련시킨 다음에 1이 정답인 데이터 1만개를 그 다음에 훈련시키는 것보다 섞어서 훈련시키는 것이 효율이 더 좋음)

 

 

 

 

 

Random Forest Classifier 모델을 통해 0~9 사이의 숫자를 판단하는 모델을 만들고 Cross Validation을 진행한 결과입니다. Random Forest를 사용한 이유는 KNN에 비해서 비교적 학습 속도가 빠르고, SGD모델에 비해서는 정확도가 높은 결과를 보여주었기 때문입니다. (목표로 하는 정확도가 96% 였기 때문에 이를 달성하는 효율적인 모델을 임의로 선택한 것입니다.) 

 

 

Random Forest Model에 대해서는 이후 포스팅을 통해 추가적으로 다룰 예정입니다. (의사결정트리의 한 종류). 테스트셋은 최종 모델의 정확도를 판단할 때만 사용할 예정이므로 중간 모델의 정확도는 Cross_Validation과정을 통해 예측합니다. 예측결과 3번의 Cross_Validation 과정에서 모두 96% 이상의 정확도를 나타낸 것을 확인할 수 있습니다.

 

 

모델의 정확도를 높이기 위해 Input data값을 Scaling할 수 있습니다. (Feature Scaling) 하지만, MNIST 데이터셋의 경우 Feature값의 성격이 모두 다 0~255사이의 값으로 통일되어 있기 때문에 정확도의 높은 향상을 기대하기는 어려울 것이라고 짐작할 수 있습니다. 일반적으로 Feature Scaling이 영향력을 발휘하는 부분은 서로 다른 Feature가 나타내는 값의 범위가 많이 다른 경우 (예를 들어, 하나는 범위가 0~1, 하나는 범위가 -10000 ~ 10000) 입니다. 

 

 

 

 

 

최종 모델의 성능을 평가하기 위해 분리해 놓은 Test Set을 이용하여 성능을 측정한 결과 96.02%의 성능이 나온 것을 확인할 수 있습니다. 이를 Visualizing하여 10개만 확인해 보겠습니다.

 

 

 

10개의 데이터 모두 정확한 숫자를 예측하고 있는 것을 확인할 수 있습니다. 

 

 

 

추가적인 성능 향상을 위한 데이터셋 증가 (Training Set Expansion)

 

 

모델의 추가적인 성능 향상을 위해 데이터셋을 임의로 증가시키는 방법을 사용할 수 있습니다. 이를 TSE(Training Set Expansion)이라고 부릅니다. 하나의 이미지를 상하좌우로 각각 1픽셀씩 옮겨서 새로운 트레이닝 셋을 만들면 기존의 Training Set 크기의 5배가 되는 Training Set 을 만들 수 있게 됩니다. 

 

 

단 이러한 방법을 사용했을 때, 추가적으로 획득할 수 있는 정확도의 증가분에 비해 학습 시간이 지나치게 길어지는 경우도 있으므로 이를 잘 고려해서 사용해야 합니다. 

 

 

 

 

동일한 모델 (Random Forest Classifier)을 가지고 테스트를 다시 진행한 결과 0.9% 의 성능 향상을 얻을 수 있었습니다. 다만 학습에 더 오랜 시간이 소요되므로 이러한 오버헤드를 잘 고려해서 모델을 설계해야 합니다. 

 

 

 

반응형