首页 > 解决方案 > 从 kfold、fit、score 获取分值与使用 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)

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

我错过了什么?

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

标签: pythonscikit-learncross-validation

解决方案


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

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

cross_cal_score,另一方面,返回所有k折叠的分数。它通常是可取的,但它缺少一个shuffle选项(总是建议进行混洗),因此您需要先手动混洗数据,如此处所示或者将其与cv=KFold(n_splits=k, shuffle=True).

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

的一个限制cross_val_score是它不能与多个指标一起使用,但即使在这种情况下,您也可以使用cross_validate如此线程中所示- 不必使用for + kfold.

kfold循环中的使用为既不满足也不for满足的情况提供了额外的灵活性,例如,使用 Keras 的 scikit-learn 包装器,同时在训练期间仍然获得本地 Keras 返回的所有指标,如下所示;或者如果您想将不同的折叠永久存储在单独的变量/文件中,如此处所示cross_val_scorecross_validate

简而言之:

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

推荐阅读