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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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