我正在使用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也可以识别主要功能之间的相对重要性?
如果需要,我很高兴增加树木或类似树木的数量。与此相关的是,有没有办法查看此排名的信心?
答案 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和自己进行简历也很容易实现)。
换句话说,这可能不是计算特征影响并直接查看系数的最佳方法,或者排列重要性可能会提供更多信息。