scikit-learnの実装トレーニング２～様々なモデルで探索～

#前回までにやったこと
ロジスティック回帰を使用し、顧客情報から顧客が定期預金を申し込む確率を予測した
[前回](https://qiita.com/shiroino11111/items/eb1017fe053527862266)の結果は
grid best scoreが　0.938。
AUCが 0.91
だった。
##今回やること
他のモデルの利用し、前回よりも高い精度を目指す。
ランダムフォレストとサポートベクタマシンを使用する。
ディープラーニングは次回。
実装コードは[こちら](https://github.com/shiroino11111/predict_deposit.git)のbank2.py
#####パッケージのインポート(前回と少し違う)
```python
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') 
```
#####データの読み込み（前回と同じ）
```python
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を使って最適なモデルを探索
```python
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

この２つのモデルではSVCのCが０.１のときに高スコアとなった。
次に、SVCのgammaを調整して高スコアを目指す。

#####SVCの最適なC, gammaを探索
```python
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が１，gammaが0.01のときに高スコアとなった。
#####'mean_test_score'をヒートマップ確認
```python
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")

```
結果
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479337/4e373446-0af6-0c89-388e-025e174cec34.png)
gammaは0.01のとき高スコアであるが、Cはあまり関係ないと判明。

'mean_test_score'は有効数字に四捨五入しているので、最高スコアは0.9296152371929293。

[前回](https://qiita.com/shiroino11111/items/eb1017fe053527862266)のスコアにはやや劣る。
[次回](https://qiita.com/shiroino11111/items/56d34c7da87a371be6ca)はディープラーニングを用いる。