konchangakita

KPSを一番楽しんでいたブログ 会社の看板を背負いません 転載はご自由にどうぞ

機械学習の分類モデルを実装してみる ハイパーパラメータの設定

代表的な機械学習Pythonを実装を行ってみましたが、もうちょっと踏み込みます
機械学習モデルの実装自体は、Pythonでライブラリが用意されているの簡単できちゃいましたが、人間の手で設定する必要が項目があります

前回も使用した不倫データを例として確認してみますと

f:id:konchangakita:20200211001412p:plain


データの前処理

データの数値化や欠損データを0に置き換えたり、スケーリングしてやります
このデータでは結婚期間の影響が大きかったので、スケーリングしてやるとよかったかもしれません
※結婚期間が長いと、他の数値データより影響がでかくてみんな一律不倫しちゃった


ハイパーパラメータ

機械学習モデルごとに設定するパラメータになり、人間が決める必要があります
代表的なのでいうと

ランダムフォレストであれば、決定木の数(デフォルトは10)

f:id:konchangakita:20200206152541p:plain:w400
ランダムフォレストの図

k近傍法であれば、データ何個まで範囲にするか(この図では5個)(7個に見えなくもない)

f:id:konchangakita:20200210095939p:plain:w400
k近傍法の図

でも、実際になんぼにすればよいかを探すのはなかなかに面倒な作業になるのですが、これまたpythonには便利なライブラリが用意されています


GridserchCVを用いてハイパーパラメータ最適化

いろいろなハイパーパラメータを試すのはなかなかに面倒な作業ですが、Pythonにはこれまた便利なライブラリが用意されています

使い方は、試したハイパーパラメータを配列に突っ込んで渡してやるだけです
下記の例では、1,6,11,16,,,,101(+5の等差数列)というパラメータそれぞれで学習を行います

# ランダムフォレスト
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score

randomforest = RandomForestClassifier()
param_grid = {'n_estimators':range(1,101,5)}

grid_ran = GridSearchCV(randomforest, param_grid, cv=5, scoring="accuracy", n_jobs=-1)
grid_ran.fit(x_train, y_train)

学習結果の確認方法

grid_ran_score = pd.DataFrame(grid_ran.cv_results_)
grid_ran_score

f:id:konchangakita:20200221002558p:plain
いろいろ項目はありますが、結果の中でも注目すべきは、
ハイパーパラメータ平均スコア

グラフにして分かりやすくしてみます

import matplotlib.pyplot as plt
%matplotlib inline

plt.figure(figsize=(12,8))
plt.plot(grid_ran_score.param_n_estimators, grid_ran_score.mean_test_score)
plt.xlabel("n_estimateors for RandomForest")
plt.ylabel("GridSearch Accuracy")

f:id:konchangakita:20200221003636p:plain


今回は、ランダムフォレストで試してみましたが、n近傍法などいろいろなハイパーパラメータに使えます