如何将已划分好的7折数据集拆分为训练集与验证集并存储为DataFrame?
问题解决与代码修正
首先明确你的核心需求:将已划分好的7折数据,分别拆分为训练集和验证集并保存为DataFrame。先指出你之前代码的几个关键错误,再给出两种常见场景的解决方案。
你的代码错误点
split()返回的是索引而非数据集:GroupShuffleSplit的split()方法生成的是数据的索引数组,不是直接的DataFrame,所以你得到的train_dataset只是一组行索引,需要用索引去筛选原数据才能得到数据集。- 误用原始数据而非当前折:循环中你用了
X=data(原始全量数据),但应该针对当前遍历的fold进行拆分。 - 未保存循环结果:循环过程中没有将每次拆分的训练/验证集存储起来,导致最后只保留了最后一次的结果。
- 不必要的分组拆分:如果你的数据没有分组需求(比如不需要保证同一组数据不被拆分到训练/验证集),用普通的
train_test_split比GroupShuffleSplit更简单。
解决方案1:经典7折交叉验证(每个折作为验证集,其余合并为训练集)
这是最常用的交叉验证场景:每一轮用1个折做验证集,剩下的6个折合并成训练集。
import pandas as pd # 假设你已经通过k_folds函数得到了folds列表(7个DataFrame) cv_results = [] for fold_idx in range(len(folds)): # 当前折作为验证集 val_df = folds[fold_idx] # 合并其余所有折作为训练集 train_df = pd.concat( [folds[j] for j in range(len(folds)) if j != fold_idx], ignore_index=True ) cv_results.append({"train": train_df, "val": val_df}) # 示例:获取第1组训练/验证集 first_train = cv_results[0]["train"] first_val = cv_results[0]["val"]
解决方案2:每个折内部拆分训练/验证集(按比例拆分)
如果是要把每个折本身再拆分成独立的训练和验证子集(比如7:3比例),用train_test_split即可:
from sklearn.model_selection import train_test_split fold_splits = [] for fold in folds: # 按7:3拆分当前折,stratify参数保证y标签的分布在训练/验证集中一致(可选) train_df, val_df = train_test_split( fold, test_size=0.3, random_state=20, stratify=fold['y'] # 如果不需要分层可以去掉 ) fold_splits.append({"train": train_df, "val": val_df}) # 示例:获取第1个折的训练集 fold1_train = fold_splits[0]["train"]
优化你的k折划分函数
你自己写的k_folds函数可以用sklearn的KFold简化,更规范且保证拆分均匀:
from sklearn.model_selection import KFold import pandas as pd def k_folds(data, k): # shuffle=True保证数据随机拆分,random_state保证结果可复现 kf = KFold(n_splits=k, shuffle=True, random_state=20) folds = [] for _, val_idx in kf.split(data): fold = data.iloc[val_idx] folds.append(fold) return folds
内容的提问来源于stack exchange,提问作者DWS
相关产品推荐
相关产品推荐

