【问题标题】:Determine what features to drop / select using GridSearch in scikit-learn在 scikit-learn 中使用 GridSearch 确定要删除/选择的功能
【发布时间】:2019-06-29 12:01:57
【问题描述】:

如何使用 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 或者有更简单的方法吗?

【问题讨论】:

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


    【解决方案1】:

    max_features 是决策树的一个超参数。 它不会在训练之前丢弃您的任何特征,也不会发现好的或坏的特征。

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

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

    使用具有属性 feature_importances_ 的估计器

    正如@gorjan 提到的那样。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢!我会测试你的建议
      • 嘿@Sint 我为您提供了更多选项,您可能想查看一下。让我知道结果。
      • 关于解释的问题:有时 GridSearch 给出 max_features 4 但 feature_importances 显示例如 [0, 0, 0.85, 0.15] 即其中两个特征根本不重要。
      • 当我执行你的代码时就是这种情况 :) 你是对的,其中两个功能根本不重要。
      猜你喜欢
      • 2018-02-22
      • 1970-01-01
      • 2020-10-24
      • 2014-05-01
      • 1970-01-01
      • 2015-12-09
      • 2017-07-10
      • 2014-11-19
      • 2015-08-13
      相关资源
      最近更新 更多