Hugging Face Datasets select_columns 怎样只保留训练所需字段
Hugging Face Datasets 里,select_columns 解决的是“数据集已经加载完成,但训练只需要其中几列”的问题。它会返回只保留指定字段的数据集,并同步保留这些字段对应的 features;它不负责选择 train 或 test,也不会替代分词和标签转换。实际使用时先确认字段名,再做列投影,最后检查每个 split 的结构。
最小可用写法是trimmed = dataset.select_columns(["text", "label"])。如果对象是DatasetDict,这个选择会应用到其中的各个 split;如果某个 split 没有指定列,应先修正 schema 或单独处理 split。
select_columns只保留列,不负责切换 split,也不做文本分词。- 字段名必须来自真实的
column_names,标签列是否保留要按训练入口决定。 - 对
DatasetDict做筛选前,先确认每个 split 都有同一组字段。 - 投影后检查
features和一条样本,再交给Trainer或自定义 DataLoader。
先分清 Dataset、DatasetDict 与字段集合
Dataset 表示一份数据,DatasetDict 通常把 train、validation、test 等 split 放在同一个字典式对象中。两者都能做列投影,但查看字段的方式略有区别。不要直接凭感觉写列名,先从对象读取真实 schema。
from datasets import DatasetDict, load_dataset
# 读取公开数据集;示例只用于说明字段检查,不代表本机运行结果
ds = load_dataset("rotten_tomatoes")
# DatasetDict 的字段要按 split 查看,避免把 split 名当成列名
for split_name, split_data in ds.items():
print(split_name, split_data.column_names)
print(split_data.features)
# 单个 Dataset 则直接查看这一份数据的字段
train_data = ds["train"]
print(train_data.column_names)
这里通常会看到 text 和 label。column_names 适合确认字段是否存在,features 适合确认字段类型,例如标签是否仍是整数、文本是否仍是字符串。两者都比凭经验猜字段可靠。

用 select_columns 保留训练真正需要的字段
列名确认后,把“训练输入”和“训练标签”组成显式清单。对于单个 Dataset,返回值仍是 Dataset;对于 DatasetDict,返回值仍保留原来的 split 结构。这样可以在进入分词或训练器前去掉来源、原始编号等不参与训练的元数据。
from datasets import load_dataset
dataset = load_dataset("rotten_tomatoes")
# 只保留后续训练需要的输入和监督标签
keep_columns = ["text", "label"]
trimmed = dataset.select_columns(keep_columns)
# DatasetDict 的每个 split 都只留下这两列
for split_name, split_data in trimmed.items():
print(split_name, split_data.column_names)
# 如果只处理训练集,先取 split,再对单个 Dataset 做投影
train_only = dataset["train"].select_columns(["text", "label"])
select_columns 与“先选 split”是两个不同动作:dataset["train"] 选择数据分片,select_columns 选择字段。把它们写成两行,后续排查更清楚。
| 目标 | 写法 | 结果 |
|---|---|---|
| 保留所有 split 的两列 | dataset.select_columns(["text", "label"]) | 返回 DatasetDict |
| 只处理训练集 | dataset["train"].select_columns(["text", "label"]) | 返回 Dataset |
| 只选 split 不改字段 | dataset["train"] | 保留该 split 的全部列 |

字段缺失或 split 不一致时怎样定位
如果传入不存在的字段,问题不在训练器,而在列清单与当前 schema 不一致。DatasetDict 还要额外注意:不同 split 可能来自不同文件或不同预处理阶段,字段不一定完全相同。先逐个 split 检查,再决定统一补字段、改清单,还是只处理字段完整的 split。
def check_columns(dataset, required):
"""检查每个 split 是否都包含训练所需字段。"""
required = set(required)
for split_name, split_data in dataset.items():
actual = set(split_data.column_names)
missing = required - actual
if missing:
# 让错误带上 split 名,避免只看到模糊的 KeyError
raise ValueError(f"{split_name} 缺少字段: {sorted(missing)}")
check_columns(dataset, ["text", "label"])
trimmed = dataset.select_columns(["text", "label"])
如果训练数据的输入列叫 sentence,就应该先明确重命名或修改清单,不能把 text 当作通用保留名。列投影不会自动推断语义,也不会把 sentence 映射成模型需要的 input_ids。
交给 Trainer 前做一次最小核对
完成列投影后,建议只做三项检查:字段集合是否准确、标签类型是否符合损失函数、样本是否仍包含后续预处理需要的原始文本。若下一步要调用 tokenizer,就必须保留文本列;若已经完成 tokenization,则应保留训练器读取的 input_ids、attention_mask 和标签列。
# 投影后先看字段和第一条样本,再连接后续训练流程 print(trimmed["train"].column_names) print(trimmed["train"].features) print(trimmed["train"][0]) # 用一条样本确认键名没有被误删
这一步的重点不是验证训练效果,而是确认数据接口没有断裂。select_columns 只做字段层面的收敛,分词、标签编码、批处理和张量格式仍应由各自的步骤负责。
常见问题
select_columns 会改变原始 Dataset 吗?
应把返回值当作新的数据集对象使用,并显式赋给变量,例如 trimmed = dataset.select_columns(...)。不要依赖原变量已经自动变成筛选后的结构。
DatasetDict 的每个 split 必须有完全相同的字段吗?
如果一次对整个 DatasetDict 使用同一组列名,实践上应先确认所有 split 都包含这些列。字段不一致时,可以修正上游 schema,或先取出字段完整的 split 分别处理。
select_columns 能代替 remove_columns 吗?
两者目标相反:select_columns 给出要保留的白名单,适合训练字段明确的场景;remove_columns 给出要删除的黑名单,适合只排除少量已知元数据的场景。训练入口更建议白名单思路。
筛选后为什么仍然没有 input_ids?
因为列投影不会执行 tokenizer。保留 text 后,还需要单独调用分词函数;如果已经完成分词,则在投影清单中保留 input_ids 等训练字段。
BitsAndBytesConfig 怎样查看 4bit 量化参数
- 上一篇
- BitsAndBytesConfig 怎样查看 4bit 量化参数
- 下一篇
- Hugging Face Tokenizers 怎样保存自定义词表
-
- 科技周边 · 人工智能 | 58分钟前 | API · 人工智能 · vLLM max_tokens 推理服务
- vLLM 怎样为在线服务设置请求最大 Token 数
- 326浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 | 人工智能 · 评估指标 MLFlow 模型版本 Model Registry 机器学习实验
- MLflow 怎样记录模型版本和评估指标
- 313浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 | 人工智能 · Profiling ONNX Runtime 算子耗时 推理性能 JSON trace
- ONNX Runtime 怎样生成算子级延迟 profiling JSON
- 178浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 |
- LlamaIndex 怎样把元数据加入向量检索过滤
- 334浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 |
- LangChain 怎样为工具调用保留中间消息
- 450浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 | 自定义词表 tokenizer Hugging Face Tokenizers tokenizer.json
- Hugging Face Tokenizers 怎样保存自定义词表
- 311浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 | Transformers bitsandbytes BitsAndBytesConfig 4bit量化
- BitsAndBytesConfig 怎样查看 4bit 量化参数
- 205浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 | 缓存 · snapshot_download Hugging Face Hub hf_hub_download revision
- Hugging Face Hub 怎样下载指定提交版本的模型文件
- 415浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 |
- Hugging Face Hub 怎样为私有模型配置访问令牌
- 127浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 |
- OpenAI API 流式响应怎样按事件类型更新界面
- 228浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 |
- scikit-learn ColumnTransformer 怎样让数值与类别特征分别预处理
- 459浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 |
- scikit-learn DummyClassifier 怎样建立分类基线
- 189浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 764次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 760次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 842次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 813次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 641次使用
-
- LoRA 微调数据集里为什么要保留一致的对话格式
- 2026-09-09 426浏览
-
- 结构化输出失败怎么配置或排查
- 2026-09-13 447浏览
-
- 提示词缓存动态字段怎么配置或排查
- 2026-09-13 397浏览
-
- Transformers Chat Template 怎么避免角色格式不一致
- 2026-09-27 477浏览

