scikit学习功能排名返回相同的值

时间:2019-06-04 23:43:08

标签: python machine-learning scikit-learn feature-selection

我正在使用scikit-learn的RFECV类来执行功能选择。我对确定一堆变量的相对重要性感兴趣。但是,scikit-learn对于多个变量返回相同的排名(1)。这也可以在他们的示例代码中看到:

>>> from sklearn.datasets import make_friedman1
>>> from sklearn.feature_selection import RFECV
>>> from sklearn.svm import SVR
>>> X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
>>> estimator = SVR(kernel="linear")
>>> selector = RFECV(estimator, step=1, cv=5)
>>> selector = selector.fit(X, y)
>>> selector.support_ 
array([ True,  True,  True,  True,  True, False, False, False, False,
       False])
>>> selector.ranking_
array([1, 1, 1, 1, 1, 6, 4, 3, 2, 5])

有没有办法让scikit-learn也可以识别主要功能之间的相对重要性?

如果需要,我很高兴增加树木或类似树木的数量。与此相关的是,有没有办法查看此排名的信心?

1 个答案:

答案 0 :(得分:5)

RFECV的目标是选择最佳特征数,因此它将对所选特征数进行交叉验证。 在您的情况下,它选择保留5个功能。 然后,将模型重新拟合到整个数据集,直到仅剩下5个要素。 这些不会被删除,因此不会在RFE中排名。

只需运行RFE,您就可以获得所有功能的排名

from sklearn.datasets import make_friedman1
from sklearn.feature_selection import RFE
from sklearn.svm import SVR
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
estimator = SVR(kernel="linear")
selector = RFE(estimator, step=1, n_features_to_select=1)
selector = selector.fit(X, y)
selector.ranking_
  

array([4,3,5,1,2,10,8,7,6,9])

您可能会问自己,为什么不保留交叉验证的排名,而交叉验证会计算所有要素的排名。但是,对于交叉验证中的每个拆分,要素的排名可能会有所不同。 因此,RFECV可以返回5个不同的排名,您可以对其进行比较。不过,那不是界面(但是使用RFE和自己进行简历也很容易实现)。

换句话说,这可能不是计算特征影响并直接查看系数的最佳方法,或者排列重要性可能会提供更多信息。