【機械学習×Python】グリッドサーチによるハイパーパラメータ最適化方法を実演・ランダムフォレストによるモデル構築

こんにちは、Kosei(@kay_diacc2)です!

本記事はPython機械学習プログラミングの解説記事です。「グリッドサーチをもとにハイパーパラメータの最適化ができるようになりたい」「ランダムフォレストでのモデル構築方法を知りたい」という方向けの内容となっています。

目次

ハイパーパラメータとは

機械学習モデルを活用したアプリケーションには、設計者・モデル構築者が設定しなければならないパラメータが多数あります。それらパラメータを「ハイパーパラメータ」と呼びます。ハイパーパラメータについて詳しく内容を知りたい方は、まずこちらの記事をご覧ください。

グリッドサーチとは

グリッドサーチとは、探索対象のパラメータ候補を列挙し、その全ての組み合わせを照らし合わせ、最適な組み合わせを見つけ出す探索手法です。本記事ではグリッドサーチというハイパーパラメータ探索手法を利用し、Pythonプログラムを構築していきます。

ランダムフォレスト(Random Forest)とは

ランダムフォレストとは、決定木による複数識別器を統合させたバギングベースのアンサンブル学習アルゴリズムです。分類(判別)・回帰(予測)両方の用途で利用可能な点も特徴的です。

アンサンブル学習とは複数の機械学習モデル組み合わせにより、高性能なモデル構築を目指した学習方法です。アンサンブル学習にはバギングとブースティングの2種類があります。バギングとは、学習データを部分的に復元抽出したデータを複数モデルで並列的に学習させ、最後に結合するというものです(上図参照)。ランダムフォレストはこのバギングをベースに分類/回帰を実行しています。

ランダムフォレストは、決定木モデルを単体で利用した場合に発現しやすい過学習問題に対応した方法の1つとして位置付けられます。復元抽出したデータで過学習した決定木を複数用意し、各決定木から得られた結果を多数決または平均値を取ることで最終結果を得ます。このような仕組みを利用することで過学習の度合いを減らそうという思想です。

今回Pythonで構築するモデルは、このランダムフォレストを採用します。

Pythonでハイパーパラメータを最適化したランダムフォレストモデルを構築

それでは実際にPythonコードを触りながらハイパーパラメーターチューニングとモデル構築を実施していきましょう!下記の手順で進めていきます。

  1. データセットの説明
  2. データの準備
  3. モデル学習・グリッドサーチによるハイパーパラメータチューニング
  4. 性能評価

データセットの説明

データセットには、機械学習のサンプルデータとして有名なIris(アヤメ)データセットを活用します。3種類のアヤメ(Iris Setosa, Iris Versicolor, Iris Virginica)があり、それぞれ50サンプルずつ(合計150サンプル)用意されているデータです。このアヤメの名前を目的変数として利用します。また、説明変数にはアヤメの計測値である萼片(sepals)と花びら(petals)の長さと幅の4つを利用します。

データの準備

まず、前述したアヤメのデータセットを準備します。上記目的変数と説明変数をPandas形式で取り扱うために、下記のコードを実行してみましょう。

"""
①データセットの準備(Sckit-learnで提供されているアヤメのデータを利用)
"""
import numpy as np
import pandas as pd
from sklearn import datasets

# データロード
iris = datasets.load_iris()

# 説明変数
X = iris.data
X = pd.DataFrame(X, columns=["Sepal Length", "Sepal Width", "Petal Length", "Petal Width"])

# 目的変数
Y = iris.target
Y = iris_target = pd.DataFrame(Y, columns = ["Species"])

後述では変数(X)を説明変数の集合体、変数(Y)を目的変数として利用していきます。今回データ加工やクレンジング、特徴量エンジニアリング等の前処理工程は割愛します。

モデル学習・グリッドサーチによるハイパーパラメータチューニング

モデル学習工程ではまず、ランダムフォレストのモデルを構築し、グリッドサーチによるハイパーパラメータ探索を実行します。続いて、得られた最適なパラメータ組み合わせを利用し、モデルの再構築を行います。下記のコードを順次実行してみましょう。

ハイパーパラメータ探索

"""
②モデル学習
 ・ランダムフォレストを識別子として利用
 ・ハイパーパラメータのチューニング手法にはグリッドサーチを採用
"""

from sklearn.ensemble        import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split

# 学習データ&テストデータ分割
X_train, X_test,  Y_train, Y_test = train_test_split(X.values,Y.values,test_size=0.3, random_state=3)

# グリッドサーチによるハイパーパラメータ探索候補設定
# 今回はRandomForestClassifierのパラメータが対象(値は任意に設定)
parameters = {  
    'n_estimators': [10, 20, 30, 50, 100, 300],     # 用意する決定木モデルの数
    'max_features': ('sqrt', 'log2','auto', None),  # ランダムに指定する特徴量の数
    'max_depth':    (10, 20, 30, 40, 50, None),     # 決定木のノード深さの制限値
}

# モデルインスタンス
model = RandomForestClassifier()

# ハイパーパラメータチューニング(グリッドサーチのコンストラクタにモデルと辞書パラメータを指定)
gridsearch = GridSearchCV(estimator = model,        # モデル
                          param_grid = parameters,  # チューニングするハイパーパラメータ
                          scoring = "accuracy"      # スコアリング
                         )


# 演算実行
gridsearch.fit(X_train, Y_train)

# グリッドサーチの結果から得られた最適なパラメータ候補を確認
print('Best params: {}'.format(gridsearch.best_params_)) 
print('Best Score: {}'.format(gridsearch.best_score_))

グリッドサーチによるハイパーパラメータ探索ではGridSearchCV()というメソッドを活用します。下記のように記載することでメソッド実行が可能です。

gridsearch = GridSearchCV(estimator  = モデルを指定,             # 今回はRandomForestClassifierが対象 
                          param_grid = モデルのパラメータ指定,     # 今回はRandomForestのパラメータ(引数)が対象
                          scoring    = 基準となる評価方法を指定,   # (例) 'accuracy'(正解率),‘f1_micro’(F値) 
                          )

最適なハイパーパラメータに用いたランダムフォレストモデルの構築

# 最適なハイパーパラメータの組み合わせを用いてモデル再構築
model = RandomForestClassifier(n_estimators = gridsearch.best_params_['n_estimators'], # 用意する決定木モデルの数
                               max_features = gridsearch.best_params_['max_features'], # ランダムに指定する特徴量の数
                               max_depth    = gridsearch.best_params_['max_depth'],    # 決定木のノード深さの制限値
                               criterion='gini',                                       # 不純度評価指標の種類(ジニ係数)
                               min_samples_leaf = 1,                                   # 1ノードの深さの最小値
                               random_state = 0,                                       # 乱数シード
                              )

# モデル学習
model.fit(X_train,Y_train)

グリッドサーチにより探索された最適なパラメータはbest_params_というメソッドで確認可能です。その結果をもとにモデルを構築しています。

ランダムフォレストのモデル構築に際して、考慮すべきパラメータには下記があります。

スクロールできます
引数名重要度概要
n_estimators用意する決定木モデルの数
(N分割した学習データの数とも捉えられる)
max_featuresランダムに指定する特徴量の数
(全ての特徴量がモデル学習に活用されるわけではなく、ランダムに割り振られる)
max_depth決定木のノード深さの制限値
criterion不純度評価指標の種類
min_samples_leaf1ノードの深さの最小値

性能評価

最後に今回構築したモデルの精度を見てみましょう!正解率ベースで算出してみると、正解率約95%という結果が得られました。

from sklearn import metrics

# 評価
predicted = model.predict(X_test)
print(metrics.accuracy_score(predicted,Y_test))

AI・機械学習まとめ

最後までご覧いただきありがとうございました。当サイトでは機械学習・深層学習における理論やPythonを用いた実装方法の解説記事を多数取り扱っております。

【初学者向け】データサイエンス・人工知能(AI)開発のおすすめ学習方法も解説してます。

ディープラーニングを学ぶ上でおすすめの教材はこちらで紹介しています。

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
URLをコピーする
URLをコピーしました!
目次
閉じる