【问题标题】:What is the difference between getting score value from kfold,fit,score vs using cross_val_score?从 kfold、fit、score 获取分值与使用 cross_val_score 有什么区别?
【发布时间】:2020-07-11 07:15:01
【问题描述】:

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

第一种方式:

    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)

看来这2种方式做的一样,第二个更短(一行)。

我错过了什么?

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

【问题讨论】:

    标签: python scikit-learn cross-validation


    【解决方案1】:

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

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

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

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

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

    for 循环中使用kfoldcross_val_scorecross_validate 都不够用的情况提供了额外的灵活性,例如,在仍返回所有指标的同时为Keras 使用scikit-learn 包装器训练时由原生 Keras 进行,如图here;或者,如果您想将不同的折叠永久存储在单独的变量/文件中,如 here 所示。

    简而言之:

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

    【讨论】:

    • cross_val_score 返回分数 - 浮点数组,shape=(len(list(cv)),) 每次交叉验证运行的估计器分数数组。不是平均分。
    • @oldwooki 哎呀,你当然是对的,我的错(尽管我在链接的答案中正确地给出了它)!现已修复,谢谢指出。
    猜你喜欢
    • 2021-10-21
    • 2021-10-12
    • 2020-12-18
    • 2016-02-12
    • 2016-04-16
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    相关资源
    最近更新 更多