我使用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也识别出顶级特征之间的相对重要性呢?
如果需要的话,我很乐意增加树的数量或类似的操作。还有,与此相关的是,有没有办法查看这个排名的置信度?
回答:
RFECV
的目标是选择最佳的特征数量,因此它对所选特征数量进行交叉验证。在你的例子中,它选择保留5个特征。然后模型在整个数据集上重新拟合,直到只剩下5个特征。这些特征没有被移除,因此在RFE中它们没有被排名。
你可以通过运行RFE来获得所有特征的排名
from sklearn.datasets import make_friedman1from sklearn.feature_selection import RFEfrom sklearn.svm import SVRX, 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和自己做交叉验证来轻松实现)。
另外,这可能不是计算特征影响的最佳方式,直接查看系数或者也许是排列重要性可能会更有信息量。