Важность функции с использованием библиотеки Imbalanced-learn

Библиотека 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) 

2 ответа

Решение

Не все оценки в sklearn позволяют вам получить значения функций (например, BaggingClassifier не делает). Если оценщик делает, похоже, он должен быть просто сохранен как estimator.feature_importances_, так как imblearn подклассы пакета от sklearn классы. Я не знаю, какие оценки imblearn реализовал, поэтому я не знаю, есть ли какие-либо, которые обеспечивают feature_importances_, но в целом вы должны посмотреть на sklearn документация для соответствующего объекта, чтобы увидеть, если это так.

В этом случае вы можете посмотреть на значения функций для каждого из оценщиков в пределах 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))

Согласно документации 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_

Существует быстрый способ избежать этого, однако он не очень эффективен. BalancedBaggingClassifier использует RandomUnderSampler последовательно и соответствует оценщику сверху. Цикл for с RandomUnderSampler может быть одним из способов обхода конвейерного метода, а затем напрямую вызывать оценщик 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_
Другие вопросы по тегам