使用不平衡学习库的特征重要性

mam*_*oku 5 python classification random-forest scikit-learn 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) 
Run Code Online (Sandbox Code Playgroud)

Jer*_*bon 5

并非所有估计器都sklearn允许您获取特征重要性(例如,BaggingClassifier不允许)。如果估计器这样做,看起来它应该存储为estimator.feature_importances_,因为imblearn包是sklearn类的子类。我不知道估算器imblearn已经实现了哪些,所以我不知道是否有提供feature_importances_,但一般来说,您应该查看相应对象的sklearn 文档,看看是否有。

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

for estimator in bbc.estimators_:
    print(estimator.steps[1][1].feature_importances_)
Run Code Online (Sandbox Code Playgroud)

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

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