Python: Boruta による特徴量選択

UB3/informatics/python/boruta

このページの最終更新日: 2025/01/05

  1. 関連パッケージのインストール
  2. Boston housing prices を使った boruta
  3. California housing prices を使った boruta

広告

関連パッケージのインストール

Windows 11 でも試みたが、やはり Mac の方が簡単に実装できた。

まずは 文献 3 を参考に、とりあえず動くかどうか。このページが万が一消えたときのために、スクリーンショットも参考文献として保存しておく (文献 3)。

conda, pip などのインストールはターミナルで、スクリプトの実行は Spyder で。Spyder の設定 ページも参照のこと。

sklearn は、pip install scikit-learn というフルネームで実行。既にインストールされていれば、Requirement already satisfied というメッセージが出る。

boruta のインストールは、pip または conda で実行する。

# pip使用の場合
pip install boruta

# conda使用の場合
conda install -c conda-forge boruta_py

conda の場合のログ。

The following NEW packages will be INSTALLED:

boruta_py conda-forge/noarch::boruta_py-0.3-py_0
joblib conda-forge/noarch::joblib-1.2.0-pyhd8ed1ab_0
libblas conda-forge/osx-64::libblas-3.9.0-16_osx64_openblas
libcblas conda-forge/osx-64::libcblas-3.9.0-16_osx64_openblas
libgfortran conda-forge/osx-64::libgfortran-5.0.0-9_5_0_h97931a8_26
libgfortran5 conda-forge/osx-64::libgfortran5-11.3.0-h082f757_26
liblapack conda-forge/osx-64::liblapack-3.9.0-16_osx64_openblas
libopenblas conda-forge/osx-64::libopenblas-0.3.21-openmp_h429af6e_3
llvm-openmp conda-forge/osx-64::llvm-openmp-15.0.4-h61d9ccf_0
numpy conda-forge/osx-64::numpy-1.22.1-py39h9d9ce41_0
python_abi conda-forge/osx-64::python_abi-3.9-2_cp39
scikit-learn conda-forge/osx-64::scikit-learn-1.0.2-py39hd4eea88_0
scipy conda-forge/osx-64::scipy-1.8.0-py39h056f1c0_1
threadpoolctl conda-forge/noarch::threadpoolctl-3.1.0-pyh8a188c0_0
toolz conda-forge/noarch::toolz-0.12.0-pyhd8ed1ab_0

続いて以下。いくつかのパッケージは既にインストールされていたようだが、pandas, IPython などのパッケージが新規にインストールされた。

pip install pandas
pip install IPython

以上をインストールし、Qiita のサイトにあるスクリプトを test.py として実行する (python3 test.py)。これで一応変数選択ができた。ただし、

from IPython.display import display

を追加しないと display がみつからないというエラーになった。

230817 エラーログ

230817 に実行したところ、以下の 2 つのエラー。これは numpy のアップデートによるもので、1.24.0 から np.int や np.float が使えなくなったことによる。

numpy のバージョンを落とす方法もあるが、boruta_puy.py の np.int を int に、np.float を float にすべて変更することで解決。全部で 5, 6 箇所。np.bool も同様に処理したかもしれない。

AttributeError: module 'numpy' has no attribute 'int'.

`np.int` was a deprecated alias for the builtin `int`. To avoid this error in existing code, use `int` by itself. Doing this will not modify any behavior and is safe. When replacing `np.int`, you may wish to use e.g. `np.int64` or `np.int32` to specify the precision. If you wish to review your current use, check the release note link for additional information. The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations


AttributeError: module 'numpy' has no attribute 'float'.

`np.float` was a deprecated alias for the builtin `float`. To avoid this error in existing code, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here. The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations


Boston housing prices を使った boruta

このスクリプトでは boston housing prices というデータセットを例に使っているのだが、これは倫理的な問題があり、いずれ取り除かれるらしい。これが正当なのか、行き過ぎたポリコレなのかわからないが、とりあえずは 2022 年 11 月現在、私の使っているバージョンではまだ使えるようなので、まずはこれで実行する。

まず、データセットを呼び出してそれを Pandas DataFrame に格納する。

boston = load_boston()
X = pd.DataFrame(boston.data, columns=boston.feature_names)
y = pd.Series(boston.target, name='target')

boston は Bunch object というものになり、Spyder でプレビューができない。X は 506 行 x 13 列のデータフレーム、Y は R のベクターに相当する 506 個の数値である。

Sklearn boston

とくに X は Boruta の説明変数になるので、自分のデータを解析するためにこの形を記録しておく。文献 2 に詳しい説明あり。

Sklearn boston

この X と y をそのままランダムフォレストに入れることもできるが、ここは Boruta のページなので、変数選択を行う。

Boruta を実行するためには、ランダムフォレストの関数を使う必要があるようである。まず RandomForestRegressor の関数を作り、これを BorutaPy に入れ、それで X と y を fit している。


Boruta.Py 関数のオプションを表にしておく。

n_estimators

'auto' の場合は、データセットのサイズから自動で決められる。数で設定することもでき、デフォルトは 1000 である。

verbose

アウトプットの冗長性 verbosity を設定する。

random_state

two_step

True または False、デフォルトは True。Bonferroni correction のオリジナル版を使いたいときのみ False とする。

max_iter

Iteration の最大回数。デフォルトは 100。

perc

パーセンタイル。これを変更すると、選択される変数の数が変わる。文献 6 に以下の説明がある。

Boruta cannot determine the specific number of selected variables. The p-percentile in the Boruta algorithm controls the number of selected variables, and the smaller the p, the larger is the number of selected variables. In general, p = 100 in Boruta. That is, the maximum variable importance of the shuffled X is used as the standard, but the smaller the number of samples, the greater is the likelihood of the shuffled X being correlated with y accidently. Hence, when the sample size is small, there is a risk of deleting too much X. Therefore, in this study, after a large number of X was generated based on random numbers that follow the standard normal distribution, the correlation coefficients between random X and y were calculated, and 100-fold of their maximum absolute values were regarded as p. If p in this method is set with a consideration of chance correlation, the over-deletion of X when the sample size is particularly small can be prevented. This approach is called r-Boruta.

California housing prices を使った boruta

練習がてら、推奨されているデータセットにスイッチしてみる。


広告

References

  1. Scikit-learnの使い方を徹底解説!AIエンジニアにおすすめ. Link: Last access 2022/11/18.
  2. 未来の数値を予測する!?AIの回帰分析を徹底解説! Link: Last access 2022/11/25.
  3. Qiita Borutaで特徴量を選択する. Link: Last access 2022/11/26. スクリプトスクショへのリンク.
  4. Borutaによる変数選択. Link: Last access 2022/12/04.
  5. Boruta Documentation. Link: Last access 2022/12/06.
  6. Kaneko, 2021a. Examining variable selection methods for the predictive performance of regression models and the proportion of selected variables and selected random variables. Heliyon 7, e07356.
  7. ランダムフォレストと検定を用いた特徴量選択手法 Boruta. Link: Last access 2022/12/15.

コメント欄

サーバー移転のため、コメント欄は一時閉鎖中です。サイドバーから「管理人への質問」へどうぞ。