【AIプログラミング】タイタニックの問題を改善する試行錯誤、OptunaとMLP

1_プログラミング

Kaggleのタイタニックのチュートリアル、スコア改善をしています。

スコアは上がったのかな??

Optunaを使って、機械学習アルゴリズムのハイパーパラメータの最適化を学びましたので、さっそくKaggleでタイタニックの問題のスコアを改善するために活用できないかと、試してみました。結論から言うと、スコアは微上昇です^^;

76%が77%になりました。

ということで、Optunaを使って、タイタニックの課題にscikit-learnのMLPで取り組んでみました。

こんな人の役に立つかも

・機械学習プログラミングを勉強している人

・Optunaでscikit-learnのMLPを探索したい人

・kaggleのタイタニックの課題に取り組んでいる人

スポンサーリンク

KaggelでOptuna

最初、すごく気になったことは、Kaggleの開発環境の「Notebook」でも、無事Optunaを利用することができました。すんなり、利用することができました。

!pip install optuna
import optuna

optuna.__version__
'1.4.0'

2020/06/11の段階では、Kaggleでpipしたoptunaのバージョンは「1.4.0」でした。GoogleColaboにpipしたときは「1.5.0」でしたので、少し古いのかな?

すんなりOptuna使えるなんて、KaggleのNotebookは便利。

次に、タイタニックのデータ読み込みです。以前行ったKaggleのNotebookにタイタニックチュートリアルのデータ(csv)を追加して、それを読み込み、訓練データ(X)とテストデータ(X_test)、訓練データの教師データ(y)を作成する手順です。

タイタニックデータの読み込み等につきましては、こちらの記事もご参考ください。

「タイタニックのデータをNotebookに追加」の項目が役に立つと思います。

#Kaggleノートへのタイタニックのデータのセットアップ
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))

#csvから訓練データとテストデータを読み込む
train_data = pd.read_csv("/kaggle/input/titanic/train.csv")
test_data = pd.read_csv("/kaggle/input/titanic/test.csv")

#教師データの作成
y = train_data["Survived"]

#特徴量データの作成
features = ["Pclass", "Sex", "SibSp", "Parch"]
X = train_data[features]
X = pd.get_dummies(train_data[features])

#テストデータの作成
X_test = pd.get_dummies(test_data[features])

OptunaでMLPのパラメータ探索

ハイパーパラメータ探索の方針

今回は、scikit-learnのMLP(多層パーセプトロン)でタイタニックのデータを分類してみようと考えました。理由としては、まだ学習して間もないので使ってみたかったからです 笑

Optunaで、MLPのわかりやすいハイパーパラメータの「中間層」と「学習率」を変化させてみました。

以下のプログラムは最終的に3層の中間層で試した場合のプログラムになります。

from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import cross_val_score

#1.目的関数の定義
def objective(trial):
    hidden_layer_sizes_1 = trial.suggest_int('hidden_layer_sizes_1', 80, 200)
    hidden_layer_sizes_2 = trial.suggest_int('hidden_layer_sizes_2', 80, 200)
    hidden_layer_sizes_3 = trial.suggest_int('hidden_layer_sizes_3', 10, 100)
    learning_rate_init = trial.suggest_loguniform('learning_rate_init', 0.001, 0.1)
    clf1 = MLPClassifier(max_iter=10000,
                         early_stopping=True,
                         hidden_layer_sizes=[hidden_layer_sizes_1, hidden_layer_sizes_2, hidden_layer_sizes_3],
                         learning_rate_init=learning_rate_init,
                         solver='adam',
                         activation='relu'
                        )
    
    score = cross_val_score(clf1, X, y, cv=3)
    return np.mean(score)

#2.Optunaオブジェクトを作成
study = optuna.create_study(direction='maximize')
#3.Optunaでパラメータ探索
study.optimize(objective, n_trials=100)

#4.ベストパラメータ表示
study.best_params

一番良いスコアのパラメータは、次のようになりました。

{'hidden_layer_sizes_1': 101,
 'hidden_layer_sizes_2': 113,
 'hidden_layer_sizes_3': 87,
 'learning_rate_init': 0.009783716035949859}

Notebookのバージョンを保存するとき、Optunaの最適化をプログラムに入れているとNotebookの保存が長くなるので、以下のプログラムをコメントアウトします。

「2.Optunaオブジェクトを作成」

「3.Optunaでパラメータ探索」

「4.ベストパラメータ表示」

コメントアウトしておくと、Notebookのバージョン作成処理が短くなりますので、コメントアウトしてから「Save Version」を押してください。

念のため、最高のスコアを確認しておきます。

study.best_value
0.8047138047138048

Optunaで導き出したパラメータでMLPを作成します。そして、「predictions」という名前の変数にテストデータの答えを入れます。

model = MLPClassifier(max_iter=10000,early_stopping=True,hidden_layer_sizes=[101,113,87],learning_rate_init=0.009783716035949859,
                      solver='adam',activation='relu').fit(X,y)

predictions = model.predict(X_test)

提出データの出力

提出データの出力プログラムは次のようになります。Kaggleではこの出力ブロックを使いまわしていきそうです。

output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
output.to_csv('my_submission.csv', index=False)
print("Your submission was successfully saved!")

SaveVersionを行い、答えデータを提出します。

提出結果と考察

何回かパラメータを試して最高でも現状では77%程度のスコアです。

Kaggleでは、1日に最大で10回までしか答えデータを提出できませんので、やみくもに答え合わせをすることは出来ないので注意です。

今回は、若干ですが、一番最初に提出したファイルよりもスコアを上げることができました。

中間層を1層のみ、2層、3層と試してみましたが、どれも似たようなスコアで頭打ちしているような感じで、提出した結果、77%程度のスコアだったというのが今回の結果です。現状では、タイタニックデータの特徴量を生かし切れていない感じがしますので、使っていない特徴量について考える必要がありそうです。また、年齢などの特徴量には「NaN」という値が含まれているので、データの前処理もしていく必要もありそうです。

タイタニックのチュートリアルで、初めての実践的な課題を行いました。自分で考えてハイパーパラメータを調整したりしたので、良い経験になっています。タイタニックの課題は有名なので、正答率を上げる方法はすでにWeb上にたくさんありますが、自分で考えてどのようにしたらスコアが上がったのかを模索するのも一つの楽しみかな、と思います。

アルゴリズム以前にデータの前処理をしてみないとな。

タイトルとURLをコピーしました