在scikit-learn中使用GridSearch确定要删除/选择的功能

时间:2019-02-05 15:55:29

标签: python machine-learning scikit-learn feature-selection

如何使用GridSearch结果确定要删除的要素/列/属性?

换句话说,如果GridSearch返回max_features应该为3,我们是否可以确定应该使用哪个EXACT 3功能?

让我们采用具有4个功能的经典Iris数据集。

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 :(得分:2)

max_features是决策树的一个超参数。 它不会在训练前删除您的任何功能,也不会发现好功能或坏功能。

您的决策树会查看所有功能,以找到最佳功能,以便根据标签拆分数据。如果在示例中将maxfeatures设置为3,则决策树仅查看三个随机特征,并采用其中的最佳特征进行拆分。这样可以使您的训练更快,并为分类器增加一些随机性(也可能有助于防止过度拟合)。

您的分类器通过标准(例如基尼系数或信息增益(1熵))确定哪个特征。因此,您可以对功能的重要性进行此类测量,也可以

  

使用属性为feature_importances _

的估算器

如@gorjan所述。

答案 1 :(得分:1)

如果您使用具有属性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,则以通俗易懂的术语表示,该模型正在努力捕获该特征中存在的信号。