从 kfold、fit、score 获取分值与使用 cross_val_score 有什么区别?

What is the difference between getting score value from kfold,fit,score vs using cross_val_score?

看起来很基本,但我看不出以下两种方式的区别和优缺点:

第一种方式:

    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)

这两种方式似乎做同样的事情,第二种更短(一行)。

我错过了什么?

每种方式的区别和优缺点是什么?

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

clf.score在循环中;因此,在循环执行之后,它只包含最后一次验证折叠中的分数,忘记了之前在之前 k-1 折叠中所做的一切。

cross_cal_score,另一方面,returns 所有 k 的得分。它通常是可取的,但它缺少 shuffle 选项(洗牌总是可取的),因此您需要先手动洗牌数据,如 所示,或与 cv=KFold(n_splits=k, shuffle=True) 一起使用.

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

cross_val_score 的一个限制是它不能与多个指标一起使用,但即使在这种情况下您也可以使用 cross_validate, as shown in - 不必使用 for + kfold.

for 循环中使用 kfoldcross_val_scorecross_validate 都不够的情况提供了额外的灵活性,例如使用 scikit-learn Keras 的包装器,同时在训练期间仍然获得原生 Keras 返回的所有指标,如图 ; or if you want to permanently store the different folds in separate variables/files, as shown .

简而言之:

  • 如果您只想要单个指标的分数,请坚持使用 cross_val_score(先洗牌并并行化)。
  • 如果您想要多个指标,请使用 cross_validate(同样,先洗牌并并行化)。
  • 如果您需要对整个 CV 过程进行更大程度的控制或监控,请相应地在 for 循环中恢复使用 kfold