从kfold,fit,score和使用cross_val_score获得分数之间有什么区别?

问题描述 投票:1回答:1

这似乎很基本,但是我看不到以下两种方式之间的区别和优点或缺点:

第一种方式:

    kf = KFold(n_splits=2)
    for train_index, test_index in kf.split(X):
        X_train, X_test = X.iloc[train_index], X.iloc[test_index]
        y_train, y_test = y.iloc[train_index], y.iloc[test_index]
        clf.fit(X_train, y_train)
        clf.score(X_test, y_test)

第二种方式:

cross_val_score(clf, X, y, cv=2)

[似乎这两种方法做相同的事情,而第二种方法更短(一行)。

我想念什么?

每种方法有什么区别和优点或缺点?

python scikit-learn cross-validation
1个回答
1
投票

可以说,看到这种差异的最佳方法是进行实验,尽管在这种情况下很容易辨别:

clf.score处于循环中;因此,在循环执行之后,它仅包含最后一次验证折叠中的分数,而忘记了先前k-1折叠中之前已完成的所有操作。

cross_cal_score,另一方面,返回所有k弃牌的平均得分。通常比较可取,除非出于任何原因,除非要保留​​有关每个CV折叠中分数的详细标签,在这种情况下,您将返回到for循环和kfold方法,但是您需要进行分数簿记手动操作,如我详细显示的here

for循环+ kfold方法的缺点是它是串行运行的,而cross_val_score中的CV过程可以使用n_jobs参数在多个内核中并行化。

cross_val_score的局限性在于它不能与多个指标一起使用,但是即使在这种情况下,您也可以使用cross_validate,如cross_validate所示-不必使用this thread

for + kfold循环中kfold的使用为forcross_val_score都不足够的情况提供了更大的灵活性,例如,使用Kesras的scikit-learn包装器,同时仍获得由训练期间的本地Keras,如图cross_validate所示;或者,如果您要将不同的折叠永久存储在单独的变量/文件中,如图here所示。

简而言之:

  • [如果只想获取单个指标的平均分数,请坚持[C0​​]。
  • 如果要使用多个指标,请使用here
  • 如果需要对整个CV过程进行更大程度的控制或监视,请相应地恢复为在cross_val_score循环中使用cross_validate
© www.soinside.com 2019 - 2024. All rights reserved.