如何使用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.
相关产品推荐
相关产品推荐

