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

如何使用HuggingFace Dataset加载列集合不同的训练集与测试集?

如何使用HuggingFace Dataset加载列集合不同的训练集与测试集?

这个问题我之前处理过,核心原因是Hugging Face Datasets在一次性加载多份数据集(比如train和test)时,会默认尝试统一所有split的Schema,强行对齐列结构,这就导致了你的train集有额外列时触发类型转换错误。下面给你两个实用的解决办法:


方法一:分开加载后手动合并(最推荐)

直接分别加载训练集和测试集,这样各自的Schema会被完整保留,不会被强制对齐,最后再合并成DatasetDict方便后续使用:

from datasets import load_dataset

# 单独加载训练集与测试集,split="train"是因为单份parquet文件加载时默认只有一个split
train_dataset = load_dataset("parquet", data_files="train/*.parquet", split="train")
test_dataset = load_dataset("parquet", data_files="test/*.parquet", split="train")

# 合并为DatasetDict,和你原本的使用方式完全兼容
dataset = {"train": train_dataset, "test": test_dataset}

这样处理后,你可以正常在训练流程中使用train集的column3,test集缺失该列也不会影响加载和后续评估。

方法二:手动对齐Schema(按需使用)

如果你之后需要让train和test的Schema保持一致(比如某些训练框架要求),可以在加载后给测试集补充缺失的列,用默认值填充:

# 给测试集添加缺失的column3,这里用空列表作为默认值(匹配train集中column3的list<int32>类型)
test_dataset = test_dataset.add_column(
    "column3", 
    [[] for _ in range(len(test_dataset))]  # 按测试集长度生成对应数量的默认值
)
# 之后再合并成DatasetDict
dataset = {"train": train_dataset, "test": test_dataset}

为什么你之前的写法会报错?

当你用data_files传入包含train和test的字典时,Datasets库会自动尝试将所有split的Schema合并为统一结构,它会取所有split的列的交集,并强制转换所有数据集到这个统一Schema,这就导致了你的train集因为有额外的column3而触发CastError。

备注:内容来源于stack exchange,提问作者Ford O.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 18:13:03