我是机器学习的初学者。我正在基于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]
包括所有特征会降低分类中每个特征的贡献,但不能消除任何特征。我应该消除分数相对较低的功能吗?上述结果的推断是什么?
在Python 3中使用Scikit-Learn。
你可以使用sklearn.feature_selection.RFECV
model=ExtraTreesClassifier()
model=RFECV(model,cv=3)
model.fit(features_train,label_train)
这将通过交叉验证自动选择最佳功能,并在分类中找到它们的重要性。
该模型具有属性
n_features_:具有交叉验证的所选要素的数量。
support_:所选功能的掩码。根据索引给出一个True和False数组。考虑的是真的,被忽视的是假的
ranking_:功能排名。考虑的是给予等级1并且休息其他值。
在sklearn中,feature_importances_也称为gini重要性,其测量方法如下:对于基于树的模型中的给定特征,其重要性是样本到达树中该节点的概率。
值从0到1变化。值0表示模型的输出完全不依赖于特征,1表示模型的输出与特征直接关联。
对于特征选择,您可以使用名为SelectFromModel的this函数,您可以使用该函数指定阈值。将选择具有高于阈值的重要性值的特征。
检查qazxsw poi答案,了解有关如何计算特征重要性的更多详细信息。
你说“它们都不重要”,但你从特征重要性看到的分数不是p值。它基本上计算了给定特征在分割数据和规范化数据时的有用性,因此所有特征重要性总和为1。
您应该比较每个要素的相对值。考虑使用this将特征选择作为管道的一部分。 SelectFromModel