今回は
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にします
あとはconfigで構造探索を自動モードにして何回かモデル探索をさせます
これでデータに適したモデルが自動で作られます(すごい)
まあまあ学習が進んだかな?と思ったモデルと結果がこちら
推測
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の場合だとあまり恩恵が少ないけど、もっと複雑なネットワーク組んで推論するときはめちゃくちゃ良いと思っている)