ご注文はリード化合物ですか?〜医薬化学録にわ〜

自分の勉強や備忘録などを兼ねて好き勝手なことを書いていくブログです。

クロスバリデーションのやり方と GBDT

初回の記事からだいぶ時間が経ってしまいました・・・。

三日坊主とかいう次元ではない。

 

最近、久々に深層学習以外の機械学習手法に時間をかけて取り組んでいるのですが、最近少し気になった内容があるので、それについて書いていきます。

 

線形重回帰など一部の手法を除いて、機械学習ではハイパーパラメーターを設定する必要があります。SVM の C だったり、ランダムフォレストの n-estimators などですね。これらのパラメーターはモデル構築前に決定する必要があるのですが、パラメーターが適切かどうか判断するのに一般に用いられているのがクロスバリデーションです。

クロスバリデーションとは、データを n 個に区切って、そのデータを評価していく方法です。例えば、SVM で回帰モデルを構築し、R2 値で評価を行うことを考えます。5-fold クロスバリデーションの場合、トレーニングデータを 5 分割し、そのうち 4 つをモデル構築用データとし、回帰モデルを構築します。残り 1 つはモデル構築に用いていないバリデーションデータとして、作ったモデルの予測性能を評価するのに用いることができます。モデル構築用データの選び方は 5 通りあり、それぞれのモデルでそれぞれのバリデーションデータの予測を行うことで、トレーニングデータの全てのデータを「モデル構築に用いていない外部データ」とみなして予測結果を得ることができます。今回の場合、5 種類の R2 値が得られるので、その平均値を R2CV 値とします。この値が高くなるようなハイパーパラメーターの組み合わせを見つけることが、ハイパーパラメーターチューニングの基本になります。尚、最終的なモデルは、トレーニングデータ全部と決定したハイパーパラメーターを用いて構築します。つまり、クロスバリデーションを行った後、一回計算を行う必要があります。

ちなみに、論文によってトレーニングデータ、バリデーションデータ、テストデータなどの用語にブレがあるので注意が必要です。

 

ここで気になるのが、勾配ブースティング(GBDT)の n-estimators の決め方です。ランダムフォレストの n-estimators はとりあえず多い方がいいですが(実務的には 500~1,000 ぐらい?)、GBDT の場合、過学習を防ぐため、early stopping で決めることが本来望ましいです。しかし、Scikit-learn の GBDT とクロスバリデーションを単純に組み合わせると、バリデーションデータを更に分割して、early stopping を行うことになります。しかも、5 回行うと、5 種類の n-estimators が得られるので、どの値を採用するかが問題となります。その上、最終的なモデルの構築では、データを全て使うので、適切な n-estimators はまた異なってくるはずですし、ここで early stopping 用のバリデーションデータを区切って用意していいものなのか・・・?

こう考えると、GBDT とクロスバリデーション、実は相性が良くないのでは?と最近少し思っています。機械学習のプロの意見を聞いてみたい・・・