LoginSignup
5
3

More than 3 years have passed since last update.

予測器毎のcoef_、feature_importances_属性の保持状況を調べてみた

Last updated at Posted at 2019-08-24

はじめに

scikit-learnにおいて、予測に有効な特徴量を確認したり、sklearn.feature_selection.RFE を使って特徴量選択を行う場合等に、予測器が保持する coef_ 属性または feature_importances_属性が使われる。
coef_は線形回帰モデルの係数であることや、feature_importances_はアルゴリズムによっては生成されないなど、予測器によって保持状況が異なると思われる。
そこで今回、各予測器毎にこれらの属性の保持状況を調べてみた。

環境

  • scikit-learn 0.21.2

調査した予測器

調べたものは以下のもの。XGBCRegressor、LGBRegressor、CatBoostRegressor はscikit-learnにもともと用意されている予測器ではないが、scikit-learnのインターフェースが用意されているため、合わせて調査した。また、分類器があるものは大体回帰器も用意されていることが多いため、今回回帰器のみピックアップした。

  • LinearRegression
  • Ridge
  • Lasso
  • ElasticNet
  • SGDRegressor
  • PLSRegression
  • SVR(カーネルは"linear"、"rbf"で試す)
  • RandomForestRegressor
  • ExtraTreesRegressor
  • AdaBoostRegressor
  • XGBRegressor
  • LGBMRegressor
  • CatBoostRegressor
  • MLPRegressor

コード

調査のために作成したコードは以下の通り。ポイントとしては、fit()メソッドを実行しないと、
coef_、feature_importances_属性にアクセスできないため、irisデータを使って予測モデル作成したあとにhasattr関数を使って調査した点。

RegressionFeatureImportanceCheck.py

from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet, SGDRegressor
from sklearn.cross_decomposition import PLSRegression
from sklearn.svm import SVR
from sklearn.ensemble import RandomForestRegressor, ExtraTreesRegressor, AdaBoostRegressor
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
from catboost import CatBoostRegressor
from sklearn.neural_network import MLPRegressor
from sklearn.datasets import load_iris
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)

def main():

    estimators = [LinearRegression(), Ridge(), Lasso(), ElasticNet(), SGDRegressor(), PLSRegression(),
                  SVR(kernel='linear'), SVR(kernel='rbf'), RandomForestRegressor(), 
                  ExtraTreesRegressor(), AdaBoostRegressor(), XGBRegressor(), LGBMRegressor(), 
                  CatBoostRegressor(), MLPRegressor()]

    iris = load_iris()
    y = iris.target
    X = iris.data

    for estimator in estimators:
        estimator.fit(X, y)
        print("|{0}|{1}|{2}|".format(
            estimator.__class__.__name__,
            hasattr(estimator, "coef_"),
            hasattr(estimator, "feature_importances_")
        ))

if __name__ == "__main__":
    main()

結果

結果は以下の通り

分類器 coef_ feature_importances_
LinearRegression True False
Ridge True False
Lasso True False
ElasticNet True False
SGDRegressor True False
PLSRegression True False
SVR(kernel="linear") False False
SVR(kernel="rbf") False False
RandomForestRegressor False True
ExtraTreesRegressor False True
AdaBoostRegressor False True
XGBRegressor False True
LGBMRegressor False True
CatBoostRegressor False True
MLPRegressor False False

考察

今回調べた中での結果は以下の通り。

  • coef_属性は全ての線形モデルの予測器が保持していた。逆にそれ以外は保持していなかった。
  • feature_importances_属性は、全てのアンサンブルモデルが保持していた。それ以外は保持していなかった。
  • SVR(kernel="rbf)および、MLPRegressorは、どちらも保持していなかった。

おおよそ予想通りの結果となった。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3