Как рассчитать важность функции в каждой модели перекрестной проверки в sklearn - PullRequest
2 голосов
/ 02 апреля 2019

Я использую RandomForestClassifier() с 10 fold cross validation следующим образом.

clf=RandomForestClassifier(random_state = 42, class_weight="balanced")
k_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)
accuracy = cross_val_score(clf, X, y, cv=k_fold, scoring = 'accuracy')
print(accuracy.mean())

Я хочу определить важные функции в моем пространстве функций.Кажется, было бы просто получить значение функции для отдельной классификации следующим образом.

print("Features sorted by their score:")
feature_importances = pd.DataFrame(clf.feature_importances_,
                                   index = X_train.columns,
                                    columns=['importance']).sort_values('importance', ascending=False)
print(feature_importances)

Однако я не мог найти, как выполнить feature importance для cross validation в sklearn.

Итак, я хочу определить наиболее эффективные функции (например, с помощью average importance score) в 10-кратной перекрестной проверке.

Я с удовольствием предоставлю более подробную информацию, еслинеобходимо.

1 Ответ

2 голосов
/ 02 апреля 2019

cross_val_score() не возвращает оценки для каждой комбинации тест-сгибов.

Вам нужно использовать cross_validate() и установить return_estimator =True.

Вот рабочий пример:

from sklearn import datasets
from sklearn.model_selection import cross_validate
from sklearn.svm import LinearSVC
from sklearn.ensemble import  RandomForestClassifier
import pandas as pd

diabetes = datasets.load_diabetes()
X, y = diabetes.data, diabetes.target

clf=RandomForestClassifier(n_estimators =10, random_state = 42, class_weight="balanced")
output = cross_validate(clf, X, y, cv=2, scoring = 'accuracy', return_estimator =True)
for idx,estimator in enumerate(output['estimator']):
    print("Features sorted by their score for estimator {}:".format(idx))
    feature_importances = pd.DataFrame(estimator.feature_importances_,
                                       index = diabetes.feature_names,
                                        columns=['importance']).sort_values('importance', ascending=False)
    print(feature_importances)

Выход:

Features sorted by their score for estimator 0:
     importance
s6     0.137735
age    0.130152
s5     0.114561
s2     0.113683
s3     0.112952
bmi    0.111057
bp     0.108682
s1     0.090763
s4     0.056805
sex    0.023609
Features sorted by their score for estimator 1:
     importance
age    0.129671
bmi    0.125706
s2     0.125304
s1     0.113903
bp     0.111979
s6     0.110505
s5     0.106099
s3     0.098392
s4     0.054542
sex    0.023900
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...