首页 > 解决方案 > 使用指定数量的训练数据进行交叉验证?

问题描述

客观的

我想执行 k 折交叉验证,但不是使用 k-1 数据集进行训练,使用 k 数据集进行测试,而是想确定训练数据的数量,就像train_test_split's一样train_size。然后剩下的作为测试数据。

准确地说,我有二进制分类数据集,并且在进行交叉验证时我想要每个类的 10 个实例。

预期功能

假设我想做 5-fold CV:

cross_val_score(estimator=my_model, X, y, cv=5, train_size=20)

当然,在这种情况下,我的 X, y 应该有 >= 100 个实例。

我的尝试

好吧,我只是手动构建它们。我能得到的最接近的是迭代:

for _ in range (5):    
  X_tr, X_te, y_tr, y_te = train_test_split(X, y, train_size=20, stratified=y)  

但这会随机选择数据,并可能导致两个训练数据集相似,而且它不容纳 cv。

笔记

是的,这将导致某些数据集不用于训练集,但这正是我希望在当前工作中实现的目标。

是否有任何提供此功能的python函数?

标签: pythonmachine-learningscikit-learncross-validationk-fold

解决方案


您仍然可以使用KFold,但需要额外的逻辑。

确定测试数据量:test_amount = total_amount * test_size.

确定拆分的数量n_splits = total_amount // test_amount

使用 Kfolds:

kf = KFold(n_splits=n_splits)
for train_index, test_index in kf.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

推荐阅读