機械学習のお勉強(chainerでkaggleに初挑戦)
Kaggleとは
公式:Kaggle: Your Home for Data Science
Kaggleは企業や研究者がデータを投稿し、世界中の統計家やデータ分析家がその最適モデルを競い合う、予測モデリング及び分析手法関連プラットフォーム及びその運営会社である。
Kaggleを始めるのに参考になるサイト
Kaggle に Python で入門しました(Digit Recognizer) | Futurismo
Kaggle の Titanic チュートリアルに挑戦した話
Kaggleのtitanic問題で上位10%に入るまでのデータ解析と所感 - mirandora.commirandora.com
全体の流れ
Kaggle: Your Home for Data Science
アカウントを作る
トライするCompetitionを決める
Dataをダウンロードする
Dataを解析して、提出用csvファイルを作る
提出する
Digit Recognizerをやってみる(chainerを使用)
trainとtestのcsvファイルのダウンロード
chainer用のデータセットの作り方
とてもわかりやすい 👇
chainerのデータセットの作り方 LinearやCNN - Qiita
chainerの独自datasetの作り方 - 午睡二時四十分
ChainerのCNNにおけるデータセットの作り方 – ハックマン.com
Chainer: ビギナー向けチュートリアル Vol.1 - Qiita
chainerはtupleで[data,label]となるようにdatasetsを作ってから、学習を行う
Import
# -*- coding: utf-8 -*- import chainer import pandas as pd import chainer.functions as F import chainer.links as L from chainer import training from chainer.training import extensions import pandas as pd import numpy as np from chainer import datasets from chainer.datasets import tuple_dataset from chainer import serializers
kaggle dataをchainerデータセットに変換
train = pd.read_csv('./train.csv') test = pd.read_csv('./test.csv') features = train.ix[:,1:].values labels = train.ix[:,0] features = features.reshape(features.shape[0],28,28) imageData = [] labelData = [] for i in range(len(labels)): img = features[i] imgData = np.asarray(np.float32(img)/255.0) imgData = np.asarray([imgData]) imageData.append(imgData) labelData.append(np.int32(labels[i])) threshold = np.int32(len(imageData)/8*7) train = tuple_dataset.TupleDataset(imageData[0:threshold], labelData[0:threshold]) val = tuple_dataset.TupleDataset(imageData[threshold:], labelData[threshold:])
Trainerで学習
モデル
class CNN(chainer.Chain): def __init__(self, train=True): super(CNN, self).__init__( conv1=L.Convolution2D(1, 32, 5), conv2=L.Convolution2D(32, 64, 5), l1=L.Linear(1024, 10), ) self.train = train def __call__(self, x): h = F.max_pooling_2d(F.relu(self.conv1(x)), 2) h = F.max_pooling_2d(F.relu(self.conv2(h)), 2) return self.l1(h)
学習
model = L.Classifier(CNN()) optimizer = chainer.optimizers.Adam() optimizer.setup(model) train_iter = chainer.iterators.SerialIterator(train, batch_size=100) test_iter = chainer.iterators.SerialIterator(val, batch_size=100, repeat=False, shuffle=False) updater = training.StandardUpdater(train_iter, optimizer) trainer = training.Trainer(updater, (5, 'epoch'), out='result') trainer.extend(extensions.Evaluator(test_iter, model)) trainer.extend(extensions.LogReport()) trainer.extend(extensions.PrintReport( ['epoch', 'main/loss', 'validation/main/loss', 'main/accuracy','validation/main/accuracy'])) trainer.extend(extensions.ProgressBar()) trainer.run() serializers.save_npz("digit-learn5.data", model)
テストデータの準備
test = test.ix[:,:].values.astype('float32') test_data = test.reshape(test.shape[0],28,28) testData = [] for i in range(len(test_data)): img = test_data[i] imgData = np.asarray(np.float32(img)/255.0) imgData = np.asarray([imgData]) testData.append(imgData)
作成モデルでの予測
def predict(model, test): # テストデータ全部に対して予測を行う preds = [] for img in test: img = img.reshape(-1, 1, 28, 28) pred = F.softmax(model.predictor(img)).data.argmax() preds.append(pred) return preds predictions = predict(model, testData)
kaggle提出用フォーマットに変換
submissions = pd.DataFrame({"ImageId": list(range(1, len(predictions)+1)), "Label": predictions}) submissions.to_csv("digit_cnn_output.csv", index=False, header=True)
提出
ここのsubmit predictionsに上記でできたdigit_cnn_output.csvをアップロード
結果
527位 (/ 1661)
これからコツコツ学んだことを活かして、100位以内を目指してみる〜
コードも適当なので、もっと綺麗にかけるよう練習する
2017/10/11
331位
全体参考
nocotan.github.io 👈 最高にわかりやすい
GitHub - nocotan/chainer-examples: This is implementation examples by Chainer.
Chainer: ビギナー向けチュートリアル Vol.1 - Qiita
top2%の私が教えるKaggleの極意, Bosch Production Line Performance | RCO Ad-Tech Lab Blog