TensorFlowの公式チュートリアルを見て、あまり丁寧でないと思ったのでKaggle Titanicを題材にTensorFlowの使い方を解説する。
とはいえ僕もまだまだTensorFlowに対する理解が浅いので初歩的な範囲で。
コード解説
実際にTitanicコンペのために組んだコード(https://www.kaggle.com/yusukemigitera/tf-first )を解説する。
インポート、データ整形
ほぼ前回(2層ニューラルネットワークでKaggle Titanicを解く)と同じ。
使うデータ項目を選択
今回はPclass(チケットクラス)、Sex(性別)、Age(年齢)、SibSp(兄弟/配偶者の数)Fare(料金)の5項目を利用したが、行列から必要な部分を切り出す方法が分からなかったので一列ずつ削除していった。
train_target = train.pop('Survived')
train.pop('PassengerId')
train.pop('Name')
train.pop('Parch')
train.pop('Ticket')
train.pop('Cabin')
train.pop('Embarked')
train_array = np.asarray(train.values) #Numpy配列にする
target_array = np.asarray(train_target.values) #Numpy配列にする
dataset = tf.data.Dataset.from_tensor_slices((train_array.astype('float32'), target_array))
# TensorFlowで扱いやすい形の変数におく
また、np.asarray()
や.astype('float32')
でデータ型を指定しなければよく分からないエラーが起きる。
モデル定義、学習
model = tf.keras.Sequential([
tf.keras.layers.Dense(10, activation='relu'),
tf.keras.layers.Dense(10, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
tf.keras.Sequential
というクラスのインスタンスを作る。引数に入れた配列の要素tf.keras.layers.Dense()
がニューラルネットワークの層を表す。Dense
は全結合の層で、(ノード数, 活性化関数)をその引数で指定する。
入力層はこれに含めず、上から中間層2つのノードが10個ずつ、出力層のノードが1個のニューラルネットワークを定義している。
分類問題は出力層に分類の数と同じノードを用意するものだが、ここは公式チュートリアルの書き方に従った。2値分類はまた特殊なのかもしれない。
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
model.fit(train_array.astype('float32'), target_array, epochs=15)
compile
メソッドでオプティマイザ、損失関数、メトリクスを設定する。tf.keras.Sequential
のメソッドについてはKeras Documentationを見ると参考になる。
学習の実行はfit
メソッドの1行で書ける。この辺はフレームワークの便利さが分かる。
推論
y = model.predict(test_array.astype('float32'))
推論の実行も1行で書ける。
データを整形してCSVに出力
前回と同じ。
評価
スコアは前回と比べて1%だけ高くなった。まだだいぶ低いが、今回は特に最適化を考えていなかったので仕方ない。
Numpyオンリーで書くよりよっぽど楽。