ysaz (ImanazaS) blog

最近はデータ分析や機械学習が中心。たまに音楽や書評。

機械学習モデルのBlendingに対する重みの最適化手法について

Kaggleなどの機械学習コンペにおいて、複数のモデルを平均等により組み合わせることで、新たな推論結果を作る手法(blendingと呼ばれる)があります。
平均を取る際にモデルの重み付けを行いますが、均等に振られることもあれば、軽重をつけることもあります。
(例えばモデルが2つであれば、前者は0.5ずつ、後者は0.7と0.3、といった具合です)

ここでは、複数のモデルに対する最適な重みを探す手法について、SciPyのminimize関数を使った例を取り上げたいと思います。

アンサンブル学習

Blendingはアンサンブル学習の一つであり、モデルがN個あれば、0〜1の値を持つN個の重みを各モデルの予測結果に掛け合わせて、最終的な予測結果を得ます。

アンサンブル学習には他にも、平均以外に多数決といった簡単な手法や、out-of-foldの予測結果を用いて高次元での学習をおこなうStackingと呼ばれる手法もあります。
英文ですが、以下の記事が有名なのでリンクを貼っておきます。

Kaggle Ensembling Guide | MLWave

日本語ですと、以下の記事でアンサンブル学習に関する紹介が少しなされています。 『Kaggle Ensembling Guide』はいいぞ【kaggle Advent Calendar 7日目】 - u++の備忘録

なお、Kaggle等の機械学習コンペでは、複数のKernelから結果(提出ファイル)だけを取ってblendしたものが高スコアkernelとして公開され、LBが掻き乱されることもしばしば生じます。

コンペ終盤でこうしたKernelが公開されると、それまでの努力が不意になってしまうこともあり、様々なコンペでその扱いについて議論がなされていることも、念のため触れておきます。

NO MORE BLENDING IN KERNALS PLEASE | Kaggle

Blendingに対する重みの最適化事例

Blendingにおける最適な重みを探すには、まず訓練データをK-Fold等の交差検証(Cross Validation)で学習させ、out-of-foldの予測結果を得る必要があります。
次にout-of-foldの予測結果を説明変数とし、目的変数に対して学習をさせて、最適な重みを探します。

具体的な最適化手法として、Kaggleでしばしば登場する、SciPyのoptimize.minimize関数を使った手法を取り上げます。

今更ながらJupyter Notebookファイルをはてなブログへ貼り付ける方法(Gistへ登録した上ではてなへ連携)を知ったので、早速活用してみます。

gistef1aac638e7dbc82bdcdc85abb208874

上記の例では評価指標にMSE(Mean Squared Error)を用いており、単一モデルではMSE = 0.33程度だったものが、5つのモデルを組み合わせることで、MSE = 0.27へと精度が向上する結果となり、Blendingの効果が見て取れます。

なお今回の実験には、適当なデータセットを用いておらず、乱数により発生させた、ランダムな説明変数(out-of-foldの予測結果を模擬)とランダムな目的変数を使っています。

一般的にBlendingは、モデル間の相関が高い場合には有効でなく、相関が低いものをたくさん組み合わせたほうが効果が出ると言われていますが、今回はこの点はあまり考慮せず、minimize関数の使い方にフォーカスしているのであしからず。

The Good, the Bad and the Blended | Kaggle

様々な最適化手法

最適化手法について、上記の例では、便宜上Kaggle Kernel上で使われていたSLSQPとL-BFGS-Bの2つを比較しました。
SciPyのドキュメントを見ると、minimizeのメソッドとして選択可能な最適化手法は他にもいくつか存在することがわかります。

ここでは、下記のブログで紹介されているものを引用する形で、簡単に触れておきます。 非線形最適化関数 — 機械学習の Python との出会い

  • 勾配ベクトルやヘシアンが不要
    • Nelder-Mead :Nelder-Mead法
    • Powell :Powell法
  • 勾配ベクトルのみが必要
    • CG :共役勾配法 (conjugate gradient method)
    • BFGS :BFGS法 (Broyden–Fletcher–Goldfarb–Shanno method)
  • 勾配ベクトルとヘシアンの両方が必要
  • パラメータの範囲に制約がある場合
  • パラメータの範囲の制約に加えて,等式・不等式制約がある場合
    • COBYLA :COBYLA法 (constrained optimization by linear approximation method)
    • SLSQP :sequential least squares programming

まとめ

SciPyのoptimize.minimize関数を使い、Blendingで用いる重みを最適化する手法についてまとめました。
黒魔術的な要素が強い手法であり、コンペでは、つい他人の褌で相撲を取りたくなってしまいます。
既存のモデルを参考にする際には、少なくともモデルの再現とout-of-foldの予測をおこなった上で、Blendingを含む高次元のアンサンブル学習に取り組んでいきたいです。