功能重要性使用Imbalanced-learn库

时间:2017-09-18 16:25:42

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

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) 

3 个答案:

答案 0 :(得分:2)

并非sklearn中的所有估算工具都允许您获取要素重要性(例如,BaggingClassifier没有)。如果估算器执行了,看起来它应该只存储为estimator.feature_importances_,因为imblearn包来自sklearn类的子类。我不知道估算器imblearn已经实现了什么,所以我不知道是否有任何提供feature_importances_,但一般来说你应该看一下{{ 1}} documentation用于查找相应的对象。

在这种情况下,您可以查看sklearn中每个估算工具的要素重要性,如下所示:

BalancedBaggingClassifier

您可以在这些估算器中打印平均重要性:

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

答案 1 :(得分:0)

这有一个捷径,但效率不高。 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_

答案 2 :(得分:0)

根据scikit学习文档,您可以对分类使用基于杂质的功能,而对于某些类型的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_