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

如何将已划分好的7折数据集拆分为训练集与验证集并存储为DataFrame?

问题解决与代码修正

首先明确你的核心需求:将已划分好的7折数据,分别拆分为训练集和验证集并保存为DataFrame。先指出你之前代码的几个关键错误,再给出两种常见场景的解决方案。

你的代码错误点

  1. split()返回的是索引而非数据集:GroupShuffleSplit的split()方法生成的是数据的索引数组,不是直接的DataFrame,所以你得到的train_dataset只是一组行索引,需要用索引去筛选原数据才能得到数据集。
  2. 误用原始数据而非当前折:循环中你用了X=data(原始全量数据),但应该针对当前遍历的fold进行拆分。
  3. 未保存循环结果:循环过程中没有将每次拆分的训练/验证集存储起来,导致最后只保留了最后一次的结果。
  4. 不必要的分组拆分:如果你的数据没有分组需求(比如不需要保证同一组数据不被拆分到训练/验证集),用普通的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:20:00