본문 바로가기

Machine, Deep Learning/Machine, Deep Learning 실습

Kaggle - MINST 예측 모델 생성 by Keras (1)

반응형
SMALL

본 글은 Kaggle MINST Competition에서의 Introduction to CNN Keras - 0.997 (top 6%)의 커널을 참고하여 작성하였습니다.


  • 1. 소개 (Introduction)
  • 2. 데이터 준비 (Data Preparation)
    • 2.1 데이터 로드 (Data Load)
    • 2.2 널 데이터 확인 (Check for null and missing values)
    • 2.3 데이터베이스 정규화 (Normalization)
    • 2.4 재구조화 (Reshape)
    • 2.5 라벨 인코딩 (Label Encoding)
    • 2.6 훈련과 확인 셋 나누기 (Split training and valdiation set)
  • 3. CNN
    • 3.1 모델 정의 (Define the model)
    • 3.2 최적화 (Set the optimizer and annealer)
    • 3.3 데이터 확보 (Data augmentation)
  • 4. 모델 평가 (Evaluatae the model)
    • 4.1 커브 확인과 훈련 (Training and validation curves)
    • 4.2 컨퓨전 행렬 (Confusion Matrix)
  • 5. 예측과 제출 (Prediction and subition)
    • 5.1 결과 예측 및 제출 (Predict and Submit results)

1. 소개 (Introduction)

본 글은 MNIST dataset을 이용하여서 5층 합성곱 신경망을 다룹니다. Tensorflow에 있는 매우 직관적인 Keras API를 사용할 것입니다. 첫째로 손글씨 이미지(Handwritten digits images)를 사용하여서 CNN 모델링을 사용해보도록 하겠습니다.

정확도는 대략 99.671%를 이뤘습니다. 학습 횟수(Epoch)를 약 30으로 둔다면 99+%의 결과를 얻을 수 있을 것입니다. 대신 오래걸리겠죠? (본 글에선 시간 관계상 2로 두고 하겠습니다.)

본 글에서는 3가지의 큰 메인 파트를 두겠습니다.

  • 데이터 준비
  • CNN 모델링과 평가
  • 결과 예측과 제출

우선 사용할 라이브러리를 모두 받아오도록 합시다.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import seaborn as sns
%matplotlib inline

np.random.seed(2)

from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
import itertools

from keras.utils.np_utils import to_categorical # convert to one-hot-encoding
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D
from keras.optimizers import RMSprop
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import ReduceLROnPlateau

sns.set(style='white', context='notebook', palette='deep')

2. 데이터 준비 (Data Preparation)

2.1 데이터 로드 (Data Load)

데이터를 불러와서 확인을 해봅시다.

# Load the data
train = pd.read_csv("input/train.csv")
test = pd.read_csv("input/test.csv")
Y_train=train["label"]

# Drop 'label' column
X_train = train.drop(labels = ["label"], axis = 1)

# free some space
del train

g = sns.countplot(Y_train)
Y_train.value_counts()

X_train은 5개의 열과 784개의 칼럼을 가지고 있습니다. 즉, 28*28 픽셀에서 0과 1로 이루어진 하나의 이미지가 5층이 쌓여져 있다는 것으로 이해하시면 되겠습니다. Y_train 같은 경우엔 Train 데이터에 0부터 9까지 몇개의 숫자가 있는지를 알려주는 train set입니다.

2.2 Null 체크 (Check for null and missing values)

# Check the data
X_train.isnull().any().describe()

test.isnull().any().describe()

Train dataset과 Test dataset을 확인을 해보았습니다. 보다시피 missing values가 없는것을 확인하였습니다.

2.3 데이터베이스 정규화 (Normalization)

이제 Illumination's differences를 줄이기 위해서 Grayscale Normalization을 해봅시다. (저도 무슨말인지 모르겠습니다 >_<)

그리고 CNN converg가 [0..1]일 때가 [0..255]일 때보다 빠르니 처리를 해줍시다.

정규화 처리는 활성화 값을 일부러 고르게 분포시키는 것입니다. 즉, [0..255]를 평균이 0, 분산이 1이 되도록 정규화된 데이터로 수정하는 과정으로서 잘못된 초기값 설정으로 애를 먹는 일이 줄어들면서 오버피팅을 방지하고, 학습 속도가 빨라집니다.

# Normalize the data
X_train = X_train /255.0
test = test / 255.0

2.4 재구조화 (Reshape)

# Reshape image in 3 dimensions (height = 28px, width = 28px, canal = 1)
X_train = X_train.values.reshape(-1, 28, 28, 1)
test = test.values.reshape(-1, 28, 28, 1)

Train과 test images는 pandas로 처리가 되어 있습니다. 근데 이것이 784개의 1차원 벡터로 구성되어 있습니다. 우리는 이것을 쪼개보도록 하겠습니다. 28x28x1 즉, 3차원 행렬로 쪼갰습니다.

Keras는 마지막에 여분의 차원을 필요로 합니다. MNIST images는 흑백으로 구성되어 있습니다. 그래서 하나의 채널을 더 늘린 것입니다. 만약 RGB images였다면 3개의 채널이 되었을 것입니다. (28x28x3 처럼 3차원 행렬이 되었겠죠?)

2.5 라벨 인코딩 (Label Encoding)

# Encode labels to one hot vectors (ex : 2 => [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
Y_train = to_categorical(Y_train, num_classes = 10)

Labels가 0부터 9까지 10개의 숫자를 가지고 있습니다. 그래서 이 것을 one hot vectors로 표현하도록 하겠습니다.

2.6 훈련과 확인 셋 나누기 (Split training and Validation Set)

# Set the random seed
random_seed = 2
# Split the train and the validation set for the fitting
X_train, X_val, Y_train, Y_val = train_test_split(X_train, Y_train, test_size = 0.1, random_state=random_seed)

이 글에서는 train set을 2가지 부분으로 나누도록 하겠습니다. 10%를 모델을 평가할 validation set으로 두고 나머지(90%)를 모델을 훈련할 train set으로 두겠습니다.

균형이 잡힌 42,000 training images를 가지고 있기 때문에, 무작위로 나누는 것은 validation set에 문제가 되지 않습니다. 만약 Unbalanced 한 dataset을 단순히 무작위로 나눌 땐 주의를 가지는 것이 좋습니다.

이런 점을 피하기 위해선 train_test_split function의 (stratify = True) 옵션을 사용하는 것이 좋습니다. (단, sklearn이 0.17 버전보다 높아야 합니다.)

한번 이미지를 시각화 해서 보도록 할까요?

# Some examples
g = plt.imshow(X_train[0][:,:,0])


이제 직접적으로 Keras의 CNN을 사용하여 모델을 정의해보도록 할텐데요 다음 글에서 해보도록 하겠습니다.

이상 Kaggle - MINST 예측 모델 생성 by Keras (1) 이었습니다. ^_^

반응형
LIST