从 kfold、fit、score 获取分值与使用 cross_val_score 有什么区别?
What is the difference between getting score value from kfold,fit,score vs using 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
,另一方面,returns 所有 k
的得分。它通常是可取的,但它缺少 shuffle
选项(洗牌总是可取的),因此您需要先手动洗牌数据,如 所示,或与 cv=KFold(n_splits=k, shuffle=True)
一起使用.
for
循环+kfold
方法的一个缺点是它是运行串行的,而cross_val_score
中的CV过程可以在多核中并行化n_jobs
参数。
cross_val_score
的一个限制是它不能与多个指标一起使用,但即使在这种情况下您也可以使用 cross_validate
, as shown in - 不必使用 for + kfold
.
在 for
循环中使用 kfold
为 cross_val_score
和 cross_validate
都不够的情况提供了额外的灵活性,例如使用 scikit-learn Keras 的包装器,同时在训练期间仍然获得原生 Keras 返回的所有指标,如图 ; or if you want to permanently store the different folds in separate variables/files, as shown .
简而言之:
- 如果您只想要单个指标的分数,请坚持使用
cross_val_score
(先洗牌并并行化)。
- 如果您想要多个指标,请使用
cross_validate
(同样,先洗牌并并行化)。
- 如果您需要对整个 CV 过程进行更大程度的控制或监控,请相应地在
for
循环中恢复使用 kfold
。
看起来很基本,但我看不出以下两种方式的区别和优缺点:
第一种方式:
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
,另一方面,returns 所有 k
的得分。它通常是可取的,但它缺少 shuffle
选项(洗牌总是可取的),因此您需要先手动洗牌数据,如 cv=KFold(n_splits=k, shuffle=True)
一起使用.
for
循环+kfold
方法的一个缺点是它是运行串行的,而cross_val_score
中的CV过程可以在多核中并行化n_jobs
参数。
cross_val_score
的一个限制是它不能与多个指标一起使用,但即使在这种情况下您也可以使用 cross_validate
, as shown in for + kfold
.
在 for
循环中使用 kfold
为 cross_val_score
和 cross_validate
都不够的情况提供了额外的灵活性,例如使用 scikit-learn Keras 的包装器,同时在训练期间仍然获得原生 Keras 返回的所有指标,如图
简而言之:
- 如果您只想要单个指标的分数,请坚持使用
cross_val_score
(先洗牌并并行化)。 - 如果您想要多个指标,请使用
cross_validate
(同样,先洗牌并并行化)。 - 如果您需要对整个 CV 过程进行更大程度的控制或监控,请相应地在
for
循环中恢复使用kfold
。