Help us understand the problem. What is going on with this article?

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

はじめに

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は、どちらも保持していなかった。

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away