👋
kaggle digit recognizerに挑戦!
初めに
この記事では、kaggleのDigit Recognizerコンペについて説明していきます!0から9までの手書き文字を判別するコンペです。なお、コードは以下を参考にして下さい。
ライブラリのインポート
以下のライブラリをインポートします。
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from keras.utils.np_utils import to_categorical
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D
データの準備
データを読み込みます。
train = pd.read_csv('../input/digit-recognizer/train.csv')
test = pd.read_csv('../input/digit-recognizer/test.csv')
sample = pd.read_csv('../input/digit-recognizer/sample_submission.csv')
データを画像とラベルに分けます。
train_x = train.drop(['label'], axis=1)
train_y = train['label']
test_x = test.copy()
データのサイズを確認します。
train_x.shape, train_y.shape, test_x.shape
学習用の画像が42000枚、テストの画像が28000枚あることが分かります。また、画像データが2次元になっていないため、後ほどサイズを変更します。
次に欠損値を確認します。
train_x.isnull().any().describe()
test_x.isnull().any().describe()
出力から欠損値はないことが分かります。
また、pixelの値は0~255なので、255で割ることで正規化します。
train_x = train_x / 255.0
test_x = test_x / 255.0
次に、データの形状を2次元に変更します。pixel数が784個あるため28×28に変換します。
train_x = train_x.values.reshape(-1, 28, 28, 1)
test_x = test_x.values.reshape(-1, 28, 28, 1)
続いて、画像のラベルをワンホットエンコーディングします。
train_y = to_categorical(train_y, num_classes=10)
学習用データを訓練データと検証データに分割します。
tr_x, va_x, tr_y, va_y = train_test_split(train_x, train_y, test_size=0.2, random_state=0)
モデルの定義
kerasを用いてモデルを定義します。
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(5, 5), padding='same',
activation='relu', input_shape=(28, 28, 1)))
model.add(Conv2D(filters=32, kernel_size=(5, 5), padding='same',
activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(filters=64, kernel_size=(3, 3), padding='same',
activation='relu'))
model.add(Conv2D(filters=64, kernel_size=(3, 3), padding='same',
activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
モデルをコンパイルします。最適化の手法にはAdamを用います。
model.compile(optimizer="Adam",loss="categorical_crossentropy", metrics=["accuracy"])
エポック数とバッチサイズを定義します。
epochs = 2
batch_size = 64
モデルの学習を行います。
history = model.fit(tr_x, tr_y,
batch_size=batch_size, epochs=epochs,
validation_data=(va_x, va_y))
予測と提出
学習したモデルを使って、テストデータに対する予測値を出力します。
results = model.predict(test_x)
results = np.argmax(results, axis=1)
results = pd.Series(results)
最後にsample_submission.csvの形に整えます。
submission = pd.DataFrame({'ImageId': range(1, 28001), 'Label': results})
submission.to_csv('submission.csv', index=False)
最後に
最後まで読んでいただいてありがとうございました~
Discussion