scikit-learn: получить выбранные функции при использовании SelectKBest в конвейере

Я пытаюсь сделать выбор функций как часть конвейера scikit-learn, в сценарии с несколькими метками. Моя цель состоит в том, чтобы выбрать лучшие K функций, для некоторых заданных k.

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

по обычному сценарию я мог бы сделать что-то подобное:

anova_filter = SelectKBest(f_classif, k=10)

anove_filter.fit_transform(data.X, data.Y)

anova_filter.get_support()

но в сценарии с несколькими метками мои размеры меток равны #samples X #unique_labels, поэтому fit и fit_transform выдают следующее исключение: ValueError: неправильная форма ввода

что имеет смысл, потому что он ожидает метки измерения [#samples]

в сценарии с несколькими метками имеет смысл сделать что-то подобное:

clf = Pipeline([('f_classif', SelectKBest(f_classif, k=10)),('svm', LinearSVC())])

multiclf = OneVsRestClassifier(clf, n_jobs=-1)

multiclf.fit(data.X, data.Y)

но тогда объект, который я получаю, имеет тип sklearn.multiclass.OneVsRestClassifier, у которого нет функции get_support. Как получить обученную модель SelectKBest, когда она используется во время конвейера?

1 ответ

Решение

То, как вы его настроите, будет один SelectKBest для каждого класса. Это то, что вы хотели? Вы можете получить их через

multiclf.estimators_[i].named_steps['f_classif'].get_support()

Если вы хотите один выбор функций для всех моделей OvR, вы можете сделать

clf = Pipeline([('f_classif', SelectKBest(f_classif, k=10)),
                ('svm', OneVsRestClassifier(LinearSVC()))])

и получить единый выбор функции с

clf.named_steps['f_classif'].get_support()