You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不依赖sklearn编写5折交叉验证(5-fold Cross Validation)代码?

手动实现5折交叉验证(无需sklearn库)

以下实现针对你351×14的Pandas数据集dfXa编写,自动处理样本量无法被5整除的边界情况,拆分逻辑和你之前的10折逻辑一致:

实现逻辑

  • 先对数据集行索引做随机打乱,避免原始数据集自带排序导致的分布偏差
  • 将索引平均切分为5份,无法均分的多余样本会依次分配到前几折
  • 每轮迭代返回一组训练集+验证集,直接可用作后续建模

完整实现代码

import pandas as pd
import random

def five_fold_cv(df, shuffle=True, random_seed=42):
    # 获取数据集全部行索引
    indices = list(df.index)
    # 按需求打乱索引
    if shuffle:
        if random_seed is not None:
            random.seed(random_seed)
        random.shuffle(indices)
    # 计算每折基础样本数
    total_num = len(indices)
    base_fold_size = total_num // 5
    # 处理无法整除的情况,多余样本依次分到前几个折
    fold_size_list = [base_fold_size for _ in range(5)]
    for extra_idx in range(total_num % 5):
        fold_size_list[extra_idx] += 1
    # 逐折生成拆分结果
    current_pos = 0
    for size in fold_size_list:
        # 切分验证集、训练集索引
        val_idx = indices[current_pos: current_pos + size]
        train_idx = indices[:current_pos] + indices[current_pos + size:]
        # 生成对应数据集并重置索引
        df_train = df.loc[train_idx].reset_index(drop=True)
        df_val = df.loc[val_idx].reset_index(drop=True)
        current_pos += size
        yield df_train, df_val

调用方法

# 迭代获取每折的训练集、验证集
for fold_id, (dfX_train, dfX_val) in enumerate(five_fold_cv(dfXa), start=1):
    print(f"第{fold_id}折拆分结果:训练集{dfX_train.shape},验证集{dfX_val.shape}")
    # 此处写入你每折的训练、验证逻辑

运行后你会得到4折70条验证集、1折71条验证集的拆分结果,和你的351条总样本量匹配。

内容的提问来源于stack exchange,提问作者Hermi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 00:36:07