0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-08-13

#前回までにやったこと
ロジスティック回帰を使用し、顧客情報から顧客が定期預金を申し込む確率を予測した
前回の結果は
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")

結果
download.png
gammaは0.01のとき高スコアであるが、Cはあまり関係ないと判明。

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

前回のスコアにはやや劣る。
次回はディープラーニングを用いる。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?