为什么sklearn.feature_selection.RFECV为每次运行提供不同的结果

时间:2017-11-19 06:24:27

标签: scikit-learn cross-validation

我尝试用$user = $this->Customer->findByPhone('8888888');进行特征选择,但每次都会给出不同的结果,交叉验证是否将样本X划分为随机块或连续的确定性块?

另外,为什么RFECVgrid_scores_的分数不同?为什么分数有时是负数?

1 个答案:

答案 0 :(得分:2)

交叉验证是否将样本X划分为随机块或连续的确定性块?

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

但是,如果y是二进制或多类(http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFECV.html),则RFECV使用sklearn.model_selection.StratifiedKFold

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

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

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

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

得分(X,y)选择最佳要素数并返回这些要素的得分。

为什么分数有时会为负?

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