#前回までにやったこと
ロジスティック回帰を使用し、顧客情報から顧客が定期預金を申し込む確率を予測した
前回の結果は
grid best scoreが 0.938。
AUCが 0.91
だった。
##今回やること
他のモデルの利用し、前回よりも高い精度を目指す。
ランダムフォレストとサポートベクタマシンを使用する。
ディープラーニングは次回。
実装コードはこちらのbank2.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.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
import matplotlib.pyplot as plt
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を使って最適なモデルを探索
pipe = Pipeline([('scaler', StandardScaler()), ('classifier', SVC())])
param_grid = [
{'classifier': [SVC()], 'classifier__C': [0.001, 0.01, 0.1, 1]},
{'classifier': [RandomForestClassifier()], 'scaler': [None], 'classifier__max_features': [1, 2, 3, 4, 5]}
]
X_train, X_test, y_train, y_test = train_test_split(
X, y, random_state=0)
grid = GridSearchCV(pipe, param_grid=param_grid, cv=5, 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': SVC(), 'classifier__C': 0.1}
grid best score, 0.9249419295996347
Test set accuracy: 0.89
この2つのモデルではSVCのCが0.1のときに高スコアとなった。
次に、SVCのgammaを調整して高スコアを目指す。
#####SVCの最適なC, gammaを探索
pipe = Pipeline([('scaler', StandardScaler()), ('classifier', SVC())])
param_grid = {'classifier__C': [0.001, 0.01, 0.1, 1], 'classifier__gamma': [0.01, 0.1, 1, 10, 100]}
X_train, X_test, y_train, y_test = train_test_split(
X, y, random_state=0)
grid = GridSearchCV(pipe, param_grid=param_grid, return_train_score=False, cv=5, 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 AUC: {:.2f}".format(grid.score(X_test, y_test)))
結果
Best parameters: {'classifier__C': 1, 'classifier__gamma': 0.01}
grid best score, 0.9296152371929293
Test set AUC: 0.90
Cが1,gammaが0.01のときに高スコアとなった。
#####'mean_test_score'をヒートマップ確認
xa = 'classifier__alpha'
xx = param_grid[xa]
ya = 'classifier__hidden_layer_sizes'
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")
結果
gammaは0.01のとき高スコアであるが、Cはあまり関係ないと判明。
'mean_test_score'は有効数字に四捨五入しているので、最高スコアは0.9296152371929293。