从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)

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

我错过了什么?

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

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

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

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

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

cross_val_score的一个限制是它不能与多个度量一起使用,但即使在这种情况下,您也可以使用cross_validate,如本线程所示,而不必使用for + kfold

for循环中使用kfoldcross_val_scorecross_validate都不足够的情况提供了额外的灵活性,例如,在训练期间使用Keras的scikit学习包装器,同时仍然获得本地Keras返回的所有度量,如这里所示;或者,如果您想将不同的折叠永久存储在单独的变量/文件中,如图所示。

简而言之:

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

相关内容

  • 没有找到相关文章

最新更新