【问题标题】:Feature Importance using Imbalanced-learn library使用不平衡学习库的特征重要性
【发布时间】:2018-02-27 06:35:54
【问题描述】:

imblearn 库是用于不平衡分类的库。它允许您使用scikit-learn 估计器,同时使用从欠采样到过采样再到集成的各种方法来平衡类。

但是,我的问题是,在使用 BalancedBaggingClassifier 或 imblearn 的任何其他采样方法后,如何获得估计器的特征重要性?

from collections import Counter
from sklearn.datasets import make_classification
from sklearn.cross_validation import train_test_split
from sklearn.metrics import confusion_matrix
from imblearn.ensemble import BalancedBaggingClassifier 
from sklearn.tree import DecisionTreeClassifier
X, y = make_classification(n_classes=2, class_sep=2,weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0, n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10)
print('Original dataset shape {}'.format(Counter(y)))
X_train, X_test, y_train, y_test = train_test_split(X, y,random_state=0)
bbc = BalancedBaggingClassifier(random_state=42,base_estimator=DecisionTreeClassifier(criterion=criteria_,max_features='sqrt',random_state=1),n_estimators=2000)
bbc.fit(X_train,y_train) 

【问题讨论】:

    标签: python scikit-learn classification random-forest imblearn


    【解决方案1】:

    并非sklearn 中的所有估算器都允许您获取特征重要性(例如,BaggingClassifier 不允许)。如果估计器这样做,它看起来应该只存储为estimator.feature_importances_,因为imblearn 包子类来自sklearn 类。我不知道imblearn 实现了哪些估算器,所以我不知道是否有任何 提供feature_importances_,但总的来说你应该看看sklearn documentation让对应的对象看看有没有。

    在这种情况下,您可以查看BalancedBaggingClassifier 中每个估计器的特征重要性,如下所示:

    for estimator in bbc.estimators_:
        print(estimator.steps[1][1].feature_importances_)
    

    您可以像这样打印估算器的平均重要性:

    print(np.mean([est.steps[1][1].feature_importances_ for est in bbc.estimators_], axis=0))
    

    【讨论】:

    • 感谢您的回复,但即使使用 feature_importance_ 功能也无法迭代估算器。它会导致以下错误:Pipeline' object has no attribute 'feature_importances_
    • 我已经修复了解决方案来解决这个问题并对其进行了测试——它现在应该可以工作了!
    【解决方案2】:

    有一个捷径可以解决这个问题,但是效率不高。 BalancedBaggingClassifier 连续使用RandomUnderSampler 并将估计器放在顶部。带有 RandomUnderSampler 的 for 循环可以是绕过管道方法的一种方式,然后直接调用 Scikit-learn 估计器。这也将允许查看 feature_importance:

    from imblearn.under_sampling import RandomUnderSampler
    rus=RandomUnderSampler(random_state=1)
    
    my_list=[]
    for i in range(0,10): #random under sampling 10 times
        X_pl,y_pl=rus.sample(X_train,y_train,)
        my_list.append((X_pl,y_pl)) #forming tuples from samples
    
    X_pl=[]
    Y_pl=[]
    for num in range(0,len(my_list)): #Creating the dataframes for input/output
        X_pl.append(pd.DataFrame(my_list[num][0]))
        Y_pl.append(pd.DataFrame(my_list[num][1]))
    
    X_pl_=pd.concat(X_pl) #Concatenating the DataFrames
    Y_pl_=pd.concat(Y_pl)
    
    RF=RandomForestClassifier(n_estimators=2000,criterion='gini',max_features=25,random_state=1)
    RF.fit(X_pl_,Y_pl_) 
    RF.feature_importances_
    

    【讨论】:

      【解决方案3】:

      根据 scikit learn 文档,您可以在分类上使用基于杂质的特征重要性,这些分类没有自己的使用某种ForestClassifier。 这里我的classifier没有feature_importances_,我直接加了。

      classifier.fit(x_train, y_train)
      
      ...
      ...
      
      forest = ExtraTreesClassifier(n_estimators=classifier.n_estimators,
                                    random_state=classifier.random_state)
      
      forest.fit(x_train, y_train)
      classifier.feature_importances_ = forest.feature_importances_
      

      【讨论】:

        猜你喜欢
        • 2016-11-26
        • 1970-01-01
        • 2014-03-11
        • 2020-04-11
        • 2013-08-15
        • 2020-10-07
        • 2019-11-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多