scikit-learnの実装トレーニング3~ディープラーニングで探索~


前回までにやったこと

機械学習で顧客情報から顧客が定期預金を申し込む確率を予測した。
ロジスティック回帰、ランダムフォレスト、サポートベクタマシンを使用した前回の最高スコアは
grid best score, 0.9296152371929293
Test set AUC: 0.90
であった。
前々回のロジスティック回帰モデルの結果の
grid best score, 0.9383648126404396
Test set AUC: 0.91
にわずかに劣った。

今回やること

ディープラーニングのMLPClassifierを利用し、高い精度を目指す。
実装コードはこちらのbank3.py

パッケージのインポート(前回と少し違う)
import numpy as np
import pandas as pd
from sklearn.model_selection import *
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier
import warnings
import mglearn
# 実行上問題ない注意は非表示にする
warnings.filterwarnings('ignore') 
データの読み込み(前回と同じ)
df = pd.read_csv("data/bank_01.csv")
#ワンホットエンコーディング
data_dummies = pd.get_dummies(df)

features = data_dummies.loc[:, 'age':'poutcome_success']
X = features.values
y = data_dummies['y_no'].values
#データ確認
print("X.shape: {}  y.shape: {}".format(X.shape, y.shape))
print(data_dummies.y_no.value_counts())
GridSearchCVを使って最適なalpha, 隠れ層数を探す

めちゃくちゃ時間が掛かったのでmax_iterの桁を下げるか、パラメータ数を下げることを推奨。1時間以上掛かった。

pipe = Pipeline([('scaler', StandardScaler()), ('classifier', MLPClassifier(max_iter=200000))])
param_grid = {'classifier__alpha':[0.01, 0.1, 1, 10 ], 'classifier__hidden_layer_sizes': [[10], [100], [1000], [10000], [100000]]}
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
grid = GridSearchCV(pipe, param_grid=param_grid, cv=2, return_train_score=False,  scoring="roc_auc")
grid.fit(X_train, y_train)
print("Best parameters: ", grid.best_params_)
print("grid best score, ", grid.best_score_)
print("Test set accuracy: {:.2f}".format(grid.score(X_test, y_test)))

結果
Best parameters: {'classifier_alpha': 10, 'classifier_hidden_layer_sizes': [10]}
grid best score, 0.9368240651853158
Test set accuracy: 0.91
前々回のロジスティック回帰モデルの結果に並んだ。

テストデータでヒートマップ確認
xa = 'classifier__hidden_layer_sizes'
xx = param_grid[xa]
ya = 'classifier__alpha'
yy = param_grid[ya]
plt.figure(figsize=(5,8))
scores = np.array(grid.cv_results_['mean_test_score']).reshape(len(yy), -1)
mglearn.tools.heatmap(scores, xlabel=xa, xticklabels=xx, 
                      ylabel=ya, yticklabels=yy, cmap="viridis")

結果

隠れ層は大きいほど高スコアが確認できる。
alphaはそんなに影響ない?