使用 scikit-learn 中的 GridSearch 确定要删除的功能/select
Determine what features to drop / select using GridSearch in scikit-learn
如何使用 GridSearch 结果确定 features/columns/attributes 删除什么?
换句话说,如果 GridSearch returns 那 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,或者是否有更简单的方法?
如果您使用具有属性 feature_importances_
的估算器,您可以简单地执行以下操作:
feature_importances = grid_search.best_estimator_.feature_importances_
这将 return 列出 (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
,通俗地说,这意味着该模型正在努力捕获该特征中存在的信号。
max_features 是决策树的一个超参数。
它不会在训练前丢弃您的任何特征,也不会发现好的或坏的特征。
您的决策树会查看所有特征以找到最佳特征以根据您的标签拆分数据。如果您像示例中那样将 maxfeatures 设置为 3,则您的决策树只会查看三个随机特征并采用其中的最佳特征进行拆分。这使您的训练速度更快,并为您的分类器增加了一些随机性(也可能有助于防止过度拟合)。
您的分类器根据标准(如基尼系数或信息增益 (1-熵))确定哪个是特征。因此,您可以对特征重要性进行这样的测量,或者
use an estimator that has the attribute feature_importances_
如@gorjan 所述。
如何使用 GridSearch 结果确定 features/columns/attributes 删除什么?
换句话说,如果 GridSearch returns 那 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,或者是否有更简单的方法?
如果您使用具有属性 feature_importances_
的估算器,您可以简单地执行以下操作:
feature_importances = grid_search.best_estimator_.feature_importances_
这将 return 列出 (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
,通俗地说,这意味着该模型正在努力捕获该特征中存在的信号。
max_features 是决策树的一个超参数。 它不会在训练前丢弃您的任何特征,也不会发现好的或坏的特征。
您的决策树会查看所有特征以找到最佳特征以根据您的标签拆分数据。如果您像示例中那样将 maxfeatures 设置为 3,则您的决策树只会查看三个随机特征并采用其中的最佳特征进行拆分。这使您的训练速度更快,并为您的分类器增加了一些随机性(也可能有助于防止过度拟合)。
您的分类器根据标准(如基尼系数或信息增益 (1-熵))确定哪个是特征。因此,您可以对特征重要性进行这样的测量,或者
use an estimator that has the attribute feature_importances_
如@gorjan 所述。