はじめに
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は、どちらも保持していなかった。
おおよそ予想通りの結果となった。