使用Ensemble Voting分类器查找前3个功能的重要性

时间:2019-10-30 13:40:02

标签: python machine-learning scikit-learn classification ensemble-learning

我有一个分类问题,我必须找到前三个功能 使用具有PCA,xgboost,RANDOM FOREST, 物流登记册和决策树。

我是一个初学者,我不知道如何使用投票分类器来获得功能的重要性。

from sklearn.linear_model import LogisticRegression  
from sklearn.ensemble import RandomForestClassifier  
from sklearn.ensemble import GradientBoostingClassifier  
from sklearn.decomposition import PCA  
from sklearn.ensemble import VotingClassifier   

log_clf = LogisticRegression(random_state=2)

rnd_clf = RandomForestClassifier
(n_estimators=150, max_depth=3, min_samples_leaf=6, 
max_features=0.3, n_jobs=-1, random_state=2)

gbm_clf= GradientBoostingClassifier 
(n_estimators=150, max_depth=3, min_samples_leaf=3, max_features=0.3, 
learning_rate=0.05, subsample=0.4,random_state=2)`

estimators = [('lr', log_clf), ('rf', rnd_clf), ('gbm', gbm_clf)]

voting_clf = VotingClassifier(estimators=estimators,voting='hard')

voting_clf.fit(train.drop(['target'],1),train['target'])

例外:使用具有pca,xgboost,dt,rf和lr的投票分类器,应该让我知道变量的特征重要性。

2 个答案:

答案 0 :(得分:0)

您可以从voting_clf对象访问基础分类器,并提取这些特征的重要性。 例如:

for alg in voting_clf.named_estimators:
    clf = voting_clf.named_estimators[alg]
    # extract feature importance for clf
    # Note different algorithms have different 
    # methods for feature importance

由于您要组装的算法具有根本不同的“特征重要性”概念,所以我认为没有一种明确的方法可以确定哪些特征对综合结果最重要。

答案 1 :(得分:0)

我遇到了同样的问题,但是,Robert King 的方法不起作用,因为 VotingRegressor(我正在使用回归)有几个带有估算器的字段,并且在 named_estimators 字段中,它们'未安装,因此无法进行特征重要性提取。您可以在第二张图片中看到其中一个命名估算器的样子。

enter image description here

enter image description here

具有拟合估计量的正确字段是 named_estimators_,它看起来像: enter image description here

以及获取所有重要性的代码

    def __get_feature_importances(self, train_columns):
    feature_imp = dict()
    for est in self.model.estimators_:
        if type(est) == catboost.core.CatBoostRegressor:
            feature_imp['catboost'] = dict(zip(train_columns, est.feature_importances_))
        elif type(est) == lightgbm.sklearn.LGBMRegressor:
            feature_imp['lgbm'] = dict(zip(train_columns, est.feature_importances_))
        elif type(est) == xgboost.sklearn.XGBRegressor:
            feature_imp['xgboost'] = dict(zip(train_columns, est.feature_importances_))
    return feature_imp

我们必须按类型比较它们,因为 named_estimators_ 没有名称。