scikit-learn特征排名返回相同的值

我使用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和自己做交叉验证来轻松实现)。

另外,这可能不是计算特征影响的最佳方式,直接查看系数或者也许是排列重要性可能会更有信息量。

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注