如何使用GridSearch的结果来确定要删除哪些特征/列/属性?
换句话说,如果GridSearch返回max_features应为3,我们能否确定应该使用哪三个确切的特征?
让我们以经典的Iris数据集为例,它有4个特征。
import numpy as npfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.model_selection import StratifiedKFold from sklearn.model_selection import GridSearchCVfrom sklearn import datasetsiris = datasets.load_iris()all_inputs = iris.dataall_labels = iris.targetdecision_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使用,还是有更简单的方法?
回答:
如果你使用了一个具有feature_importances_
属性的估计器,你可以简单地这样做:
feature_importances = grid_search.best_estimator_.feature_importances_
这将返回一个列表(n_features)
,显示每个特征对于通过网格搜索找到的最佳估计器的重要性。此外,如果你想使用比如线性分类器(逻辑回归),它没有feature_importances_
属性,你可以这样做:
# 获取最佳估计器的系数estimator_coeff = grid_search.best_estimator_.coef_# 将模型系数乘以数据的标准差coeff_magnitude = np.std(all_inputs, 0) * estimator_coeff)
这也是特征重要性的一个指示。如果一个模型的系数>> 0
或<< 0
,那意味着,用通俗的话来说,模型正在努力捕捉该特征中存在的信号。