【问题标题】:why is sklearn.feature_selection.RFECV giving different results for each run为什么 sklearn.feature_selection.RFECV 每次运行都会给出不同的结果
【发布时间】:2018-05-02 14:58:23
【问题描述】:

我尝试使用RFECV 进行特征选择,但每次都给出不同的结果,交叉验证是将样本 X 划分为随机块还是连续确定性块?

另外,为什么grid_scores_score(X,y) 的分数不同?为什么有时分数是负数?

【问题讨论】:

  • 请分享您的代码,以便我们专门回答这些问题。

标签: scikit-learn cross-validation


【解决方案1】:

交叉验证是将样本 X 分成随机块还是连续确定性块?

CV 默认将数据划分为确定性的块。您可以通过将 shuffle 参数设置为 True 来更改此行为。

但是,如果 y 是二进制或多类,RFECV 使用 sklearn.model_selection.StratifiedKFold

这意味着它将拆分数据,使每个折叠具有相同的(或几乎相同的类比率)。为了做到这一点,每个折叠中的确切数据可以在 CV 的不同迭代中略有变化。但是,这不应导致数据发生重大变化。

如果您使用 cv 参数传递 CV 迭代器,则可以通过指定随机状态来修复拆分。随机状态与算法做出的随机决策相关联。每次使用相同的随机状态将确保相同的行为。

另外,为什么 grid_scores_ 和 score(X,y) 的分数不同?

grid_scores_ 是一个交叉验证分数数组。 grid_scores_[i] 是第 i 次迭代的交叉验证分数。这意味着第一个分数是所有特征的分数,第二个是删除一组特征时的分数,依此类推。每个中删除的特征数等于 step 参数的值。默认为 = 1。

score(X, y) 选择最优数量的特征并返回这些特征的分数。

为什么有时分数是负数?

这取决于您使用的估算器和记分器。如果您没有设置评分器,RFECV 将使用默认评分函数作为估算器。通常,这是准确性,但在您的特定情况下,可能会返回负值。

【讨论】:

  • 请同时添加StratifiedKFold中的random_state参数,可用于修复分裂
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2021-02-12
相关资源
最近更新 更多