使用不平衡学习库的特征重要性
Feature Importance using Imbalanced-learn library
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)
并非 sklearn
中的所有估算器都允许您获得特征重要性(例如,BaggingClassifier
则不允许)。如果估计器这样做,它看起来应该只存储为 estimator.feature_importances_
,因为 imblearn
包 sub类 来自 sklearn
类。我不知道估计器 imblearn
实现了什么,所以我不知道是否有 any 提供 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))
这里有一个捷径,但效率不高。 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_
根据 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_
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)
并非 sklearn
中的所有估算器都允许您获得特征重要性(例如,BaggingClassifier
则不允许)。如果估计器这样做,它看起来应该只存储为 estimator.feature_importances_
,因为 imblearn
包 sub类 来自 sklearn
类。我不知道估计器 imblearn
实现了什么,所以我不知道是否有 any 提供 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))
这里有一个捷径,但效率不高。 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_
根据 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_