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



如何使用网格搜索结果确定要删除哪些要素/列/属性?

换句话说,如果 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,这意味着,通俗地说,模型正在努力捕捉该特征中存在的信号。

相关内容

  • 没有找到相关文章

最新更新