这似乎很基本,但是我看不到以下两种方式之间的区别和优点或缺点:
第一种方式:
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
,另一方面,返回所有k
弃牌的平均得分。通常比较可取,除非出于任何原因,除非要保留有关每个CV折叠中分数的详细标签,在这种情况下,您将返回到for
循环和kfold
方法,但是您需要进行分数簿记手动操作,如我详细显示的here。
for
循环+ kfold
方法的缺点是它是串行运行的,而cross_val_score
中的CV过程可以使用n_jobs
参数在多个内核中并行化。
cross_val_score
的局限性在于它不能与多个指标一起使用,但是即使在这种情况下,您也可以使用cross_validate
,如cross_validate
所示-不必使用this thread。
for + kfold
循环中kfold
的使用为for
或cross_val_score
都不足够的情况提供了更大的灵活性,例如,使用Kesras的scikit-learn包装器,同时仍获得由训练期间的本地Keras,如图cross_validate
所示;或者,如果您要将不同的折叠永久存储在单独的变量/文件中,如图here所示。
简而言之:
cross_val_score
循环中使用cross_validate
。