python - 从 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)
似乎这两种方式做同样的事情,而第二种方式更短(一条线)。
我错过了什么?
每种方式有什么区别和优点或缺点?
解决方案
可以说,看到这种差异的最好方法是进行实验,尽管这里的情况很容易辨别:
clf.score
处于循环中;因此,在循环执行之后,它只包含最后一个验证折叠中的分数,忘记了之前k-1
折叠中所做的所有事情。
cross_cal_score
,另一方面,返回所有k
折叠的分数。它通常是可取的,但它缺少一个shuffle
选项(总是建议进行混洗),因此您需要先手动混洗数据,如此处所示,或者将其与cv=KFold(n_splits=k, shuffle=True)
.
for
loop +方法的一个缺点kfold
是它是串行运行的,而 CV 过程cross_val_score
可以通过n_jobs
参数在多个内核中并行化。
的一个限制cross_val_score
是它不能与多个指标一起使用,但即使在这种情况下,您也可以使用cross_validate
,如此线程中所示- 不必使用for + kfold
.
kfold
循环中的使用为既不满足也不for
满足的情况提供了额外的灵活性,例如,使用 Keras 的 scikit-learn 包装器,同时在训练期间仍然获得本地 Keras 返回的所有指标,如下所示;或者如果您想将不同的折叠永久存储在单独的变量/文件中,如此处所示。cross_val_score
cross_validate
简而言之:
- 如果您只想要单个指标的分数,请坚持
cross_val_score
(先洗牌并并行化)。 - 如果您想要多个指标,请使用
cross_validate
(再次,先随机播放并并行化)。 - 如果您需要对整个 CV 过程进行更大程度的控制或监控,请相应地恢复为
kfold
在for
循环中使用。
推荐阅读
- c++ - 为什么在创建矩阵时使用“** int A”而不是“int A”(c++)
- c - 我收到错误“未指定与字符串文字的比较结果(改用 strncmp)”
- python - 如何处理此类列表输入?
- javascript - 向 Riot API 发送 ajax 请求时遇到问题
- flutter - 如何在应用启动时初始化变量?
- sql - sql关系表
- javascript - 为什么 d3 在我的 React 应用程序的 Chrome 控制台中未定义?
- c# - 如何在引用 .Net 标准库项目的 Xamarin Android 应用程序中进行调试和错误处理
- c# - .NET-Core 3 MVC 控制器 Url.Action 返回 null
- python - 是否可以优化此 Python 代码?