如何不依赖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
相关产品推荐
相关产品推荐

