機械学習における変数選択手法:BorutaShapを試してみた

機械学習でモデルを構築して、そのモデルに基づいた逆解析を行って次の実験条件を探索する、いわゆる適応的実験計画法を現在主業務としている。まずは良好な(回帰性能の高い)モデルを作成することが目標となる。そのための手法は様々であり、Kaggle等でも色々な手法が検討されている。一概に何が良いとも言い切れないところがあるが、個人的にはやはり説明変数をどう作り上げるか、というところに興味がある。Materials Infomaticsをやっている材料研究者としては、材料の物性をどう説明変数に落とし込むか、というところが専門性の見せ所と思うためだ。

説明変数としてどのようなものを作るか、という観点も重要だが、作った説明変数のどれを採用するか、との観点も同じくらい重要となる。このための説明変数の選択手法も種々のやり方が報告されている。有名なところでは、Borutaというライブラリが開発されており、過学習が起こりにくい手法とされている。

https://datadriven-rnd.com/2021-02-03-231858/

上の記事にも記載されているように、Borutaはランダムに説明変数群を入れ替えてランダムな説明変数に対してどの位優位な説明変数であるか、を基準に説明変数を選択する仕組みである。この際ランダムフォレストによる重要度(Inportance)を計算して変数選択することになる。

今回このBorutaの手法を拡張してShapley Valueを計算してShapley Valueを基準に変数選択するライブラリが開発されていることを知って、これを試してみた。名前はBorutaShapという。元々SHAPというライブラリがあり、これはゲーム理論を基にしたShapley Valueによって回帰結果に及ぼす各説明変数の寄与度を視覚化するものであった。このSHAPとBorutaを組合わせてBorutaShapということのようだ。

GitHub - Ekeany/Boruta-Shap: A Tree based feature selection tool which combines both the Boruta feature selection algorithm with shapley values.
A Tree based feature selection tool which combines both the Boruta feature selection algorithm with shapley values. - Gi...
5.10 SHAP (SHapley Additive exPlanations) | Interpretable Machine Learning
Machine learning algorithms usually operate as black boxes and it is unclear how they derived a certain decision. This b...

実際に導入して使用してみたが、幾つか気にすべきことがあったため、それを下に記載しておく。まず、BorutaShapをimportしてみると、importエラーが発生する。これはBorutaShapをインポートする際に同時にsklearnのBostonというデータを一緒にインポートしようとするが、sklearnの新しいバージョンがBostonをサポートしなくなったために発生するエラーである。BorutaShapの開発者もそれは認識しているようだが、今のところ修正するつもりはなさそうだ。このため、自分でBorutaShapのコードを少し修正する必要がある。修正する部位と修正内容は、下のIanWord氏が記載してくれているのでそのままコピペするだけでよい。

[BUG] BorutaSHAP.py load Boston Import Error · Issue #111 · Ekeany/Boruta-Shap
Describe the bug Load Boston in the Boruta.py leads to an import error. This is due to Sckit-learn version 1.2 and above...
in response to [BUG] BorutaSHAP.py load Boston Import Error #111 · IanWord/Boruta-Shap@38af879
Scikit-learn >1.2 do not support the use of the Boston dataset from sklearn.datasets. This problem was raised back in de...

それからもう1点。Borutaを実行する際に、persentile値というものがあり、この値を変更することで選択する説明変数の質を決めることができる。persentile値が小さいと多くの説明変数が選択され、この値を大きくするとより厳選した説明変数となる。通常は80~90にすることが多い。BorutaShapにおいてはこのpersentile値が100になっており、引数として渡すことができない仕様となっている。このため元々の設定で使用すると説明変数の数がかなり少なくなる。この値を修正するのも、BorutaShpaのコードの中に入って直接修正する必要がある。

実際に使用してみた感覚としては、Borutaと同じか、あるいは若干良好なモデルになるように思われる。しかし課題は計算時間で、説明変数の数によるのだろうが、1000個以上の説明変数から選択させようとすると、Borutaの3‐4倍の時間を必要とした。Shapley Valueの計算に時間がかかるということなのだろう。このため、モデルの精度に大きな違いがなければBorutaを置換するモティベーションがやや起こりにくい。逆に説明変数の数がそれほど大きくなければ、計算時間が気にならず、有効なのかもしれない。いずれにせよ、もう少し試してみる必要はある。

ちなみに、最近ではPowerShapという説明変数選択手法も出てきているようだ。こちらはまだ試していないが、計算時間が早いのが特徴であるようだ。こちらもShapley Valueを用いているようなので、Shapley Valueは最近の流行りなのかもしれない。

GitHub - predict-idlab/powershap: A power-full Shapley feature selection method.
A power-full Shapley feature selection method. . Contribute to predict-idlab/powershap development by creating an accoun...

#BorutaShap #SHAP #PowerShap

コメント

タイトルとURLをコピーしました