Могу ли я показать важность функции для MultiOutputClassifier? - PullRequest
0 голосов
/ 06 февраля 2019

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

Модель MultiOutput не показывает никаких проблем:

import numpy as np
import pandas as pd
import sklearn
from sklearn.datasets import make_multilabel_classification
from sklearn.datasets import make_classification
from sklearn.multioutput import MultiOutputClassifier
from sklearn.ensemble import RandomForestClassifier

## Generate data
x, y = make_multilabel_classification(n_samples=1000, 
                                      n_features=15, 
                                      n_labels = 5, 
                                      n_classes=3, 
                                      random_state=12, 
                                      allow_unlabeled = True)
x_train = x[:700,:]
x_test  = x[701:,:]
y_train = y[:700,:]
y_test  = y[701:,:]

## Generate model
forest = RandomForestClassifier(n_estimators = 100, random_state = 1)
multi_forest = MultiOutputClassifier(forest, n_jobs = -1).fit(x_train, y_train)

## Make prediction
dfOutput_multi_forest = multi_forest.predict_proba(x_test)

Предсказание dfOutput_multi_forest делаетне показывать никаких проблем, но я хочу восстановить важность функции multi_forest для интерпретации выходных данных.

Использование multi_forest.feature_importance_ выдает следующее сообщение об ошибке: AttributeError: 'MultiOutputClassifier' object has no attribute 'feature_importance_'

Кто-нибудь знаетКак восстановить значение функции?Я использую Scikit v0.20.2

1 Ответ

0 голосов
/ 07 февраля 2019

Действительно, не похоже, что MultiOutputClassifier от Sklearn имеет атрибут, который содержит некое объединение важных значений всех оценок (в вашем случае, всех классификаторов RandomForest), используемых в модели..

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

Объекты MultiOutputClassifier имеютатрибут с именем estimators_.Если вы запустите multi_forest.estimators_, вы получите список, содержащий объект для каждого из ваших классификаторов RandomForest.

Для каждого из этих объектов классификатора RandomForest вы можете получить доступ к его значениям функций через атрибут feature_importances_.

Чтобы собрать все воедино, это был мой подход:

feat_impts = [] 
for clf in multi_forest.estimators_:
    feat_impts.append(clf.feature_importances_)

np.mean(feat_impts, axis=0)

Я запустил пример кода, который вы вставили в свой вопрос, а затем запустил вышеуказанный блок кода, чтобы вывести списокследующие 15 средних значений:

array([0.09830467, 0.0912088 , 0.05738045, 0.1211305 , 0.03901933,
       0.05429491, 0.06929378, 0.06404416, 0.05676634, 0.04919717,
       0.05244265, 0.0509295 , 0.05615341, 0.09202444, 0.04780991])

. Содержит среднее значение каждой из 15 функций для каждого из 3-х случайных классификаторов леса, используемых в MultiOutputClassifier.

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

...