如何使用网格搜索结果确定要删除哪些要素/列/属性?
换句话说,如果 GridSearch 返回max_features应该是 3,我们是否可以确定应该使用哪些 EXACT 3 特征?
让我们以具有 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 或有更简单的方法?
max_features是决策树的一个超参数。它不会在训练前删除您的任何功能,也不会发现好的或坏的功能。
您的决策树会查看所有要素,以找到根据标签拆分数据的最佳要素。如果像示例中那样将最大特征设置为 3,则决策树仅查看三个随机特征,并采用其中的最佳特征进行拆分。这会加快训练速度,并为分类器增加一些随机性(也可能有助于防止过度拟合(。
您的分类器通过标准(如基尼指数或信息增益(1-熵((确定哪个是特征。因此,您可以对特征重要性进行此类测量,或者
使用具有属性feature_importances_的估算器
正如@gorjan提到的。
如果您使用具有属性的估计器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
,这意味着,通俗地说,模型正在努力捕捉该特征中存在的信号。