来自 sklearn 的 SelectFromModel 在随机森林和梯度提升分类器上提供了显着不同的特征

Posted

技术标签:

【中文标题】来自 sklearn 的 SelectFromModel 在随机森林和梯度提升分类器上提供了显着不同的特征【英文标题】:SelectFromModel from sklearn gives significantly different features on random forest and gradient boosting classifier 【发布时间】:2021-07-31 15:26:40 【问题描述】:

如标题中所述,我使用 sklearn 中的 SelectFromModel 为我的随机森林和梯度提升分类模型选择特征。

#feature selection performed on training dataset to prevent overfitting
sel = SelectFromModel(GradientBoostingClassifier(n_estimators=10, learning_rate=0.25,max_depth=1, max_features = 15, random_state=0).fit(X_train_bin, y_train))
sel.fit(X_train_bin, y_train)

#returns a boolean array to indicate which features are of importance (above the mean threshold)
sel.get_support()

#shows the names of the selected features
selected_feat= X_train_bin.columns[(sel.get_support())]
selected_feat

为随机森林和梯度提升模型返回的布尔数组完全不同。随机森林特征选择告诉我要删除额外的 4 列(从 25 个特征中),梯度提升模型上的特征选择告诉我要删除几乎所有内容。这里发生了什么?

编辑:我正在尝试比较这两个模型在我的数据集上的性能。我是否应该移动阈值,以便我至少拥有大致相同数量的要训练的特征?

【问题讨论】:

绝对没有理由它们应该相同,甚至相似。这种特征选择方法背后也没有任何理论,它们只是有时似乎有效的启发式技巧。 您能否详细说明它们的启发式性质? 恐怕在 SO 中的 cmets 不适合这样做。请注意machine-learning tag info 中的介绍和NOTE(实际上也适用于此处,尽管您没有标记您的问题)。 【参考方案1】:

他们没有理由选择相同的变量。 GradientBoostingClassifier 构建每棵树以改进上一步的错误,而RandomForestClassifier 训练与彼此的错误无关的独立树。

他们可能选择不同特征的另一个原因是criterion,这是随机森林的熵和梯度提升的弗里德曼 MSE。最后,这可能是因为两种算法在每次拆分时都会选择随机的特征子集。因此,他们并没有按照相同的顺序比较相同的变量,这自然会产生不同的重要性。

【讨论】:

以上是关于来自 sklearn 的 SelectFromModel 在随机森林和梯度提升分类器上提供了显着不同的特征的主要内容,如果未能解决你的问题,请参考以下文章

来自 sklearn.metrics.silhouette_samples 的 MemoryError

sklearn 中的 RFECV,来自 grid_scores_ 的分数

F_Regression 来自 sklearn.feature_selection

sklearn 绘制来自 SVM 分类器的结果

来自 sklearn 的 OneHotEncoder 在传递类别时会给出 ValueError

使用 MatplotLib 可视化来自 SKlearn Kmeans 的稀疏输入