空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

機械学習のお勉強(chainerでkaggleに初挑戦)

Kaggleとは

公式:Kaggle: Your Home for Data Science

Kaggleは企業や研究者がデータを投稿し、世界中の統計家やデータ分析家がその最適モデルを競い合う、予測モデリング及び分析手法関連プラットフォーム及びその運営会社である。

Kaggle - Wikipedia

Kaggleを始めるのに参考になるサイト

Kaggle事始め - Qiita

Kaggle に Python で入門しました(Digit Recognizer) | Futurismo

Kaggle の Titanic チュートリアルに挑戦した話

Kaggleのtitanic問題で上位10%に入るまでのデータ解析と所感 - mirandora.commirandora.com

全体の流れ

Kaggle: Your Home for Data Science

  1. アカウントを作る

  2. トライするCompetitionを決める

  3. Dataをダウンロードする

  4. Dataを解析して、提出用csvファイルを作る

  5. 提出する

Digit Recognizerをやってみる(chainerを使用)

trainとtestのcsvファイルのダウンロード

Digit Recognizer | Kaggle

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)

提出

f:id:robonchu:20171008213311p:plain

ここのsubmit predictionsに上記でできたdigit_cnn_output.csvをアップロード

結果

527位 (/ 1661)

f:id:robonchu:20171008213327p:plain

これからコツコツ学んだことを活かして、100位以内を目指してみる〜

コードも適当なので、もっと綺麗にかけるよう練習する

2017/10/11

331位

f:id:robonchu:20171011225357p:plain

全体参考

nocotan.github.io 👈 最高にわかりやすい

GitHub - nocotan/chainer-examples: This is implementation examples by Chainer.

Chainer: ビギナー向けチュートリアル Vol.1 - Qiita

Kaggleを始めてみる - サイバースイッチ

top2%の私が教えるKaggleの極意, Bosch Production Line Performance | RCO Ad-Tech Lab Blog