scikit-learn 中大量特征的特征选择

Posted

技术标签:

【中文标题】scikit-learn 中大量特征的特征选择【英文标题】:Feature selection in scikit-learn for large number of features 【发布时间】:2018-06-01 13:23:20 【问题描述】:

我是机器学习的初学者。我正在根据 49 个特征进行二进制分类。前 7 个特征是 float64 类型。接下来的 18 个特征是多类类型,其余的是二进制类类型,即 0 或 1。我使用以下代码进行了特征选择

model = ExtraTreesClassifier()
model.fit(x_new, y)
print(model.feature_importances_)

上面的输出是

[  1.20621145e-01   3.71627370e-02   1.82239903e-05   5.40071522e-03
   1.77431957e-02   8.40569119e-02   1.74562937e-01   5.00468692e-02
   7.60565780e-03   1.78975490e-01   4.30178009e-03   7.44005584e-03
   3.46208406e-02   1.67869557e-03   2.94863800e-02   1.97333741e-02
   2.53116233e-02   1.30663822e-02   1.14032351e-02   3.98503442e-02
   3.48701630e-02   1.93366039e-02   5.89310510e-03   3.17052801e-02
   1.47389909e-02   1.54041443e-02   4.94699885e-03   2.27428191e-03
   1.27218776e-03   7.39305898e-04   3.84357333e-03   1.59161363e-04
   1.31479740e-03   0.00000000e+00   5.24038196e-05   9.92543746e-05
   2.27356615e-04   0.00000000e+00   1.29338508e-05   4.98412036e-06
   2.97697346e-06   0.00000000e+00   0.00000000e+00   0.00000000e+00
   0.00000000e+00   1.49018368e-05   0.00000000e+00   0.00000000e+00
   0.00000000e+00]

由于它们都不重要,我在多类类型的 18 个特征的子集上进行了尝试,以下是输出

[ 0.06456545  0.01254671  0.32220959  0.00552464  0.02017919  0.07311639
  0.00716867  0.06964389  0.04797752  0.06608452  0.02915153  0.02044009
  0.05146265  0.05712569  0.09264365  0.01252251  0.01899865  0.02863864]

包含所有特征会降低每个特征在分类中的贡献,但不能消除任何一个。我应该消除分数相对较低的特征吗?以上结果的推论是什么?

将 Scikit-Learn 与 Python 3 结合使用。

【问题讨论】:

【参考方案1】:

你可以使用 sklearn.feature_selection.RFECV

model=ExtraTreesClassifier()
model=RFECV(model,cv=3)
model.fit(features_train,label_train)

这将通过交叉验证自动选择最佳特征并找出它们在分类中的重要性。

模型有属性

n_features_:经过交叉验证的选定特征的数量。

support_ : 所选特征的掩码。根据索引给出 True 和 False 数组。考虑的为真,忽略的为假

ranking_:特征排名。考虑的那些是给等级 1 和其余的值。

参考:http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFECV.html#sklearn.feature_selection.RFECV

【讨论】:

【参考方案2】:

您是说“它们都不显着”,但您从特征重要性中看到的分数不是 p 值。它基本上是在计算给定特征在拆分数据和对其进行归一化方面的有用程度,因此所有特征的重要性总和为 1。

您应该比较每个特征的相对值。考虑使用SelectFromModel 将特征选择作为管道的一部分。 http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectFromModel.html

【讨论】:

【参考方案3】:

在 sklearn 中,feature_importances_ 也称为 gini 重要性 测量如下:对于基于树的模型中的给定特征,其重要性是样本到达树中该节点的概率。

值从 0 到 1 不等。值 0 表示模型的输出完全不依赖于特征,1 表示模型的输出直接与特征相关。

对于特征选择,您可以使用名为 SelectFromModel 的 this 函数,您可以使用该函数指定阈值。将选择重要性值高于阈值的特征。

请查看this anwser,了解有关如何计算特征重要性的更多详细信息。

【讨论】:

以上是关于scikit-learn 中大量特征的特征选择的主要内容,如果未能解决你的问题,请参考以下文章

结合Scikit-learn介绍几种常用的特征选择方法

机器学习scikit-learn中的特征选择小结

scikit-learn:4.2. Feature extraction(特征提取,不是特征选择)

如何使用热门单词创建特征向量(scikit-learn中的特征选择)

干货:结合Scikit-learn介绍几种常用的特征选择方法

Scikit-learn RandomForestClassifier() 特征选择,只选择训练集?