这看起来很基本,但我看不出以下两种方法之间的区别和优缺点:
第一种方式:
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.score
0参数在多个核中并行化。
cross_val_score
的一个限制是它不能与多个度量一起使用,但即使在这种情况下,您也可以使用cross_validate
,如本线程所示,而不必使用for + kfold
。
在for
循环中使用kfold
为cross_val_score
和cross_validate
都不足够的情况提供了额外的灵活性,例如,在训练期间使用Keras的scikit学习包装器,同时仍然获得本地Keras返回的所有度量,如这里所示;或者,如果您想将不同的折叠永久存储在单独的变量/文件中,如图所示。
简而言之:
- 如果您只想要单个度量的分数,请坚持使用
cross_val_score
(先洗牌并并行( - 如果需要多个度量,请使用
cross_validate
(同样,先混洗并并行化( - 如果您需要对整个CV过程进行更大程度的控制或监控,请相应地在
for
循环中恢复使用kfold