エンジニア

なんくるないさ

「このブログはアフィリエイト広告を利用しています」

kaggleのタイタニックにNNCを使って入門してみた(NNC学習偏)

jump1268.hatenablog.com

今回は
1 訓練データの分割
2 NNCを使って学習
3 推測
をやります

訓練データの分割

前回の続きから 前回はNNCが読み込めるであろうデータフレームを作るところまでやりました

このNNC_train1というデータフレームをモデルに学習させるファイルと評価に使うファイルに分けます

from sklearn.model_selection import train_test_split
_train, _validation = train_test_split(NNC_train1, test_size=0.2)
_train.to_csv('NNC_train.csv', header=True, index=False)
_validation.to_csv('NNC_validation.csv', header=True, index=False)

これでNNC_train1を2つに分割したcsvファイルが作られました。

NNCを使って学習

この二つのファイルを使って一つは学習用、もう一つは評価用として学習させていきます。
ここからはNNCの作業です。

まずNNCを開きます。
データセットに先ほど作った学習用ファイルと評価用ファイルをセットします 次に適当によさげなモデルを作りinuputを5にします

f:id:jump1268:20190825164611p:plain

あとはconfigで構造探索を自動モードにして何回かモデル探索をさせます
これでデータに適したモデルが自動で作られます(すごい)
まあまあ学習が進んだかな?と思ったモデルと結果がこちら f:id:jump1268:20190825165645p:plain

推測

NNCのモデル画面でモデルの構築プログラムをコピーします。
あとnnpファイルを読み込みます

import nnabla as nn
import nnabla.functions as F
import nnabla.parametric_functions as PF

def network(x, test=False):
    # Input:x -> 5
    # ELU
    h = F.elu(x, 1.0)
    # Affine -> 2550
    h = PF.affine(h, (2550,), name='Affine')
    # BatchNormalization
    h = PF.batch_normalization(h, (1,), 0.9, 0.0001, not test, name='BatchNormalization')
    # SELU
    h = F.selu(h)
    # Dropout
    if not test:
        h = F.dropout(h, 0.6643429070482558)
    # ReLU
    h = F.relu(h, True)
    # Dropout_2
    if not test:
        h = F.dropout(h)
    # Affine_2 -> 1
    h = PF.affine(h, (1,), name='Affine_2')
    # BatchNormalization_2
    h = PF.batch_normalization(h, (1,), 0.9, 0.0001, not test, name='BatchNormalization_2')
    # Sigmoid
    h = F.sigmoid(h)
    # BinaryCrossEntropy
    #h = F.binary_cross_entropy(h, y)
    return h

from nnabla.utils.data_iterator import data_iterator_csv_dataset 

#ネットワークの構築
nn.clear_parameters()


 # Prepare input variable
x = nn.Variable((1,5))
t = nn.Variable((1,1))
 # Build network for inference
y = network(x, test=True)


nn.load_parameters(r'C:\NNC\titanic\titanic_NNC.files\20190825_170248\results.nnp')

で推論と推論結果をdfに起こしてcsvファイルにします

import pandas as pd
test_data = data_iterator_csv_dataset(r"\NNC_test1.csv",1,shuffle=False,normalize=False) 
df=pd.DataFrame(columns=["PassengerId","Survived"])
a=892
for i in range(test_data.size):
#for i in range(5):
        
        x.d, t.d = test_data.next()
        y.forward()
        print(y.d[0])
        if(y.d[0]>=0.5):
            s = pd.Series([a,1],index=df.columns)
            df=df.append(s,ignore_index=True)     
        else:
            s = pd.Series([a,0],index=df.columns)
            df=df.append(s,ignore_index=True)
        a=a+1
df.to_csv("survived.csv",index=False)

これで終了 titanicのページで提出します。 結果

0.76076
う~んって感じ
これで1の人たちどんな魔法使ったんだ。。って思っちゃうよね。
本当に推論させてんのかと...

 まとめ

  • 機械学習の中身がわからなくてもNNC使えばなんとかなる。
  • pands難しい
  • データの前処理が大事 (titanicの場合だとあまり恩恵が少ないけど、もっと複雑なネットワーク組んで推論するときはめちゃくちゃ良いと思っている)