Определите, какие функции отбрасывать / выбирать, используя GridSearch в scikit-learn - PullRequest
0 голосов
/ 05 февраля 2019

Как определить, какие объекты / столбцы / атрибуты следует удалить, используя результаты GridSearch?

Другими словами, если GridSearch возвращает значение max_features, равное 3, можем ли мы определить, какие функции EXACT 3 следует использовать?

Давайте возьмем классический набор данных Iris с 4 функциями.

import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import StratifiedKFold 
from sklearn.model_selection import GridSearchCV
from sklearn import datasets

iris = datasets.load_iris()
all_inputs = iris.data
all_labels = iris.target

decision_tree_classifier = DecisionTreeClassifier()

parameter_grid = {'max_depth': [1, 2, 3, 4, 5],
              'max_features': [1, 2, 3, 4]}

cross_validation = StratifiedKFold(n_splits=10)

grid_search = GridSearchCV(decision_tree_classifier,
                       param_grid=parameter_grid,
                       cv=cross_validation)

grid_search.fit(all_inputs, all_labels)
print('Best score: {}'.format(grid_search.best_score_))
print('Best parameters: {}'.format(grid_search.best_params_))

Допустим, мы получаем, что max_features равно 3. Как узнать, какие 3 функции были наиболее подходящими здесь?

Установка max_features = 3 будет работать для подгонки, но я хочу знать, какие атрибуты были правильными.

Нужно ли самому генерировать возможный список всех комбинаций функций для подачи в GridSearch?или есть более простой способ?

Ответы [ 2 ]

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

max_features - это один гиперпараметр вашего дерева решений.он не пропускает ни одну из ваших функций перед тренировкой и не находит хороших или плохих функций.

Ваше решение принимает во внимание все функции, чтобы найти лучшую функцию для разделения ваших данных на основе ваших меток.Если вы установите maxfeatures равным 3, как в вашем примере, ваше дерево решений просто рассматривает три случайных объекта и использует лучшие из них для разделения.Это ускоряет ваше обучение и добавляет некоторую случайность вашему классификатору (может также помочь против переобучения).

Ваш классификатор определяет, какой признак является критерием (например, индекс Джини или получение информации (1-энтропия)).Таким образом, вы можете либо выполнить такое измерение важности функции, либо

использовать оценщик, имеющий атрибут feature_importances_

, как упомянуто @gorjan.

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

Если вы используете оценщик с атрибутом feature_importances_, вы можете просто сделать:

feature_importances = grid_search.best_estimator_.feature_importances_

Это вернет список (n_features) того, насколько важна каждая функция для лучшего оценщика, найденного с сеткой.поиск.Кроме того, если вы хотите использовать, скажем, линейный классификатор (логистическая регрессия), который не имеет атрибута feature_importances_, вы можете сделать следующее:

# Get the best estimator's coefficients
estimator_coeff = grid_search.best_estimator_.coef_
# Multiply the model coefficients by the standard deviation of the data
coeff_magnitude = np.std(all_inputs, 0) * estimator_coeff)

Это также является признаком функцииважность.Если коэффициент модели равен >> 0 или << 0, это означает, с точки зрения непрофессионала, что модель изо всех сил пытается уловить сигнал, присутствующий в этой функции.

...