信息速览
一九八七年,万维网还不存在。一个加州大学欧文分校的博士生把一批用于比较机器学习算法的数据文件放进一个匿名 FTP 目录,让同行自己去拖。三十多年后,这个目录变成了机器学习领域最常被写下的一句话——“数据取自 UCI Machine Learning Repository”——但它仍然保持着当初那个样子:一个由人来审、由人来标、由人来解释的数据清单,而不是一个自动抓取的搜索引擎。
理解它的关键不在"它有多大",而在"它把自己克制在多小"。收录六百八十九份东西,放在任何今天的数据平台面前都是一个笑得出来的数字;但它的每一份都有编号、有许可、有数字对象标识符(Digital Object Identifier,DOI)、有变量级的字段说明,并且经过了至少一轮人工过目。这是两条完全不同的路线之争:一条是"什么都能搜到",一条是"收进来的都为真"。
矛盾也在这里。它是一个被引用到近乎不可见的底层设施,却在引用规范上最为较真;它的头部数据集被用到了烂俗的程度,尾部数据集却几乎无人问津;它的许可在所有通用机器学习库里最宽松(统一 CC BY 4.0),但它对捐赠者的要求(去除个人身份信息、必须取得原始采集者同意)又比多数平台更硬。下文逐节拆开。一屏速览见表。
| 维度 | 内容 |
|---|---|
| 全名 | UCI Machine Learning Repository |
| 中文通称 | UCI 机器学习数据集库 |
| 官方主页 | https://archive.ics.uci.edu/ |
| 创建者 | David Aha,时为加州大学欧文分校(UC Irvine)博士生 |
| 创建时间与形态 | 1987 年,以 FTP 归档(ftp archive)形式创建 |
| 现行网站版本 | 当前版本网站于 2023 年发布 |
| 维护机构 | 加州大学欧文分校;官网致谢美国国家科学基金会(National Science Foundation, NSF)提供的经费支持 |
| 现任馆员 | Coen Adler、Saatvik Kher |
| 历任馆员 | 14 位,依次为 David Aha、Patrick Murphy、Christopher Merz、Eamonn Keogh、Cathy Blake、Seth Hettich、David Newman、Arthur Asuncion、Moshe Lichman、Dheeru Dua、Casey Graff、Kolby Nottingham、Rachel Longjohn、Markelle Kelly |
| 数据集数量 | 首页声明"目前维护 689 个数据集";API 列表接口同时返回 689 条 |
| 编号区间 | 1 至 1276(编号不连续,意味有编号未被占用或已撤下) |
| 收录内容 | 数据库(databases)、领域理论(domain theories)、数据生成器(data generators)三类 |
| 许可 | 捐赠入库的数据集按 Creative Commons Attribution 4.0 International(CC BY 4.0)许可 |
| 标识符 | 每个批准入库的数据集会被分配 DOI(若其原本没有) |
| 取数路径 | 网页浏览与筛选、静态文件直链、REST API(/api/datasets/list 与 /api/dataset?id=)、Python 包 ucimlrepo |
| Python 包 | ucimlrepo,PyPI 当前版本 0.0.7,要求 Python ≥ 3.7 |
| 推荐引用(库整体) | Markelle Kelly, Rachel Longjohn, Kolby Nottingham, The UCI Machine Learning Repository, https://archive.ics.uci.edu |
| 收录方式 | 捐赠(Donate)与外部链接(Link External)两种 |
| 联系邮箱 | ml-repository@ics.uci.edu |
| 典型用途 | 算法教学、基线对标、可复现实验、特征工程练习、跨数据集泛化测试 |
§1 它要解决的具体麻烦
1.1 麻烦的本体:实验做完,数据就没了
机器学习这门学科有一个别的学科不太有的尴尬——它的结论高度依赖数据,但它的数据一直不属于论文本身。一篇 1990 年代的分类算法论文发表时,数据集通常是"由某某实验室提供"或"可向阳明索取"。几年后实验室搬了、FTP 关了、带他的那位教授退休了,那篇论文里的数字就再也没人对得上。算法可以被重写,数据不能被重写,于是整个分支的实验部分变成不可证伪。
UCI 库 1987 年被创建时解决的正是这件事,而且用的是当时唯一可行的手段:不做检索、不做推荐、不做排行榜,只做一件事——把数据文件放稳,并给它一个几十年不变的编号。这解释了它几乎所有今天看起来奇怪的设计:为什么编号是数字而不是 slug(因为 FTP 目录里数字最好排);为什么它把力气花在持久化标识而不是下载速度上(因为二十年后的链接才是重点);为什么新的网站版本到 2023 年才换(因为换一次就断一批旧链接)。
官方自我描述写得很克制:“a collection of databases, domain theories, and data generators that are used by the machine learning community for the empirical analysis of machine learning algorithms”——一组数据库、领域理论与数据生成器的集合。注意他没有说"数据平台"或"数据门户",说的是集合,并且明确把"领域理论"和"数据生成器"也列为成员。这两类在今天的平台上几乎绝迹:领域理论是被形式化表达的一块知识(如某诊断规则集),数据生成器是可无限产出符合条件样本的程序。它们不是数据,却是当年界定机器学习 empiricism 边界的一部分。
1.2 三条常见的错误期待
第一条,期待它是"什么都能搜到的地方"。它不是一个抓取全网数据集的搜索引擎,而是一个人工征集、人工整理的清单。你要的某个细分领域数据如果不在里面,馆员不会去找——得有人捐赠。它的强项是"收进来的可信",不是"外面的都在里面"。
第二条,期待里面所有数据集都有同样的质量。馆员制度能兜住元数据的一致与许可的合规,兜不住每个数据集本身的采集质量。官页的自我描述里"由社区使用"是事实陈述,不是背书。变量表写得很细的数据集和只有一句话摘要的数据集,在同一个侧栏里挨着排。
第三条,期待所有文件都由 UCI 托管。站内有一条独立的"Link External"(外部链接)通道,政策明确要求"被链接的数据集必须是被广泛知晓且高质量的",且"下载链接在被链接页面上应当可见"。也就是说,有一部分是只登记元数据、文件在别处。把这里当 CDN 用会扑空。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 一个能用于教学、可放心当堂演示的表格数据集 | Iris(150 实例 / 4 特征),页面附变量表 | 够,且它与绝大多数库一样 |
| 一个带 DOI、可在论文里规范引用的数据集链接 | 每个入库数据集分配 DOI,页面给出 APA/MLA/Chicago/Vancouver/IEEE/BibTeX 六样式 | 够,这是它最实用的功能之一 |
| 变量级的字段说明(谁是特征、谁是目标、单位、是否含缺失值) | 变量表逐列给出 role / type / description / units / missing_values | 够,且比多数同类平台细 |
| 明确的再使用许可 | 捐赠入库的按 CC BY 4.0 | 够用于含商用在内的绝大多数场景,须署名 |
| 大体量训练语料 | 存在行数达百万级的数据集(如编号 1276 的评论计数时序表,3.06M 实例、2 特征),但属少数 | 不足以做规模训练,它从来不是为这个设计的 |
| 图像/文本/音频的原始数据文件 | 存在部分非表格数据集,但主体仍是表格 | 不够,这类数据应找领域专用库 |
| 统一编程接口对所有数据集都可用 | REST API 与 Python 包覆盖在线清单 | 不够,Python 包能否取到某份数据需在 list_available_datasets 里确认 |
| 严格的人口学代表性 | 元数据设有 demographics 字段作标记 |
不够,捐赠数据是机会主义的,不是抽样框 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你在上一门机器学习导论,需要一个当天能跑通的二分类演示 | Iris 一行 fetch_ucirepo(id=53) 即得 DataFrame 与目标列 |
用它讲清楚"先读变量表再建模"这件事,别急着讲模型 |
| 你在写一篇论文,审稿要求数据可追溯 | 数据集级 DOI + 六样式导出引用文本 | 按官方 Citation 页给的库整体引用格式,在正文注数据集 DOI |
| 你在复现一篇没有放出数据的老论文 | 1987 年起的连续归档,编号稳定不易失联 | 用 /api/datasets/list?search= 按名字检索,再读 intro_paper 字段判断是不是同一份 |
| 你在做特征工程教学,需要"有缺失值"的素材 | Adult 的 has_missing_values 为 yes,target_col 为 income |
用官方声明的缺失值口径,不要自己猜缺失符号 |
| 你在做元数据分析,需要一个有字段字典的样本 | 元数据字段固定、机器可读、有 API | 批量拉 /api/dataset?id= 组装元数据表(§5.3) |
| 你想给自己的数据集一个稳定出处 | 捐赠通道 + 自动分配 DOI | 先确认已获原始采集者同意并去除个人身份信息,再走 donate 流程 |
| 你在做一个自己推理出来的数据 | 外部链接通道 | 先读 Linking Policy,确认符合"广泛知晓且高质量" |
| 你不确定某份数据的许可能否商用 | 页面 License 区块写明 CC BY 4.0 及条款要点 | 以页面 License 原文与 CC 许可条款全文为准,文章截图不足以替代法律判断 |
1.5 一句话判断
它不是数据的仓库这一词的现代含义所指的那类东西(无限扩容、全量抓取、近似即时),它是一份可以被放进参考文献的数据目录:规模小到足以人工把关,安稳到足以三十年后还找得到。
1.6 不适合谁:四条边界
不适合当成训练语料的来源。 六百八十九份数据的总体量,与任何一个今天的主干数据供应方比都小得多。想在这里找到能喂给大模型的语料,方向就错了。
不适合当成"某领域数据必然在此"的假设。 它靠捐赠增长,而非按计划采集。某个专科、某种数据类型缺位,反映的是"没人捐",不是"没必要有"。
不适合当成质量背书。 入库意味着的是"有人愿意对它负责",不是"有第三方验过它"。摘要写得好不等于数据干净,这一点要在论文里留出余地。
不适合当成活跃维护的产品看待。 官网对 NSF 的资助用的是致谢语气,并未声明 NSF 是当前项目的长期资助方;馆员团队规模极小,某些数据集的 last_updated 停在二〇二三年。把它当作"归档"来预期长期可用性,而不是当作"服务"来预期功能演进。
§2 数据构成与规格
2.1 一个数据集在站上由哪几层组成
站上每份数据集对应一个 /dataset/<id>/<slug> 页面。以 Iris(编号 53)为例,页面自上而下由五块构成:摘要与指标条、标签块、数据集信息、变量表、文件清单与引用块。这不是排版习惯,而是合格机器学习元数据的最小集合——指标条给规模,标签块给任务类型,信息块给来源与伦理声明,变量表给字典,文件块给可执行入口。
摘要与指标条是最容易被只言一瞥的部分,而它恰好给出最关键的两个数:# Instances(实例数)与 # Features(特征数)。这两个数决定了"能不能用"的第一道门槛。标签块则依次给出 Dataset Characteristics(数据形态,如 Tabular)、Subject Area(学科领域)、Associated Tasks(适用任务)、Feature Type(特征类型)。
数据集信息块里有几个不那么显眼但更有价值的问句式字段,官方的答法是填空:
| 官方问句(页面原文措辞) | 回答性质 | 为什么重要 |
|---|---|---|
| What do the instances in this dataset represent? | 一句话说明一行数据代表什么实体 | 这是划分训练/测试的最小单位,答错会直接导致泄漏 |
| Additional Information | 自由文本摘要 | 通常藏着"这份数据与某某文献里的数据有两点不同"这类关键更正 |
| Has Missing Values? | yes / no | 决定要不要先做缺失值处理,官方口径优于自行猜测 |
| Introductory Paper | 论文标题、作者、年份、期刊、DOI | 追原始贡献的唯一入口 |
| Creators | 人名列表 | 与原论文作者不一定重合,引用清单里两者都要给 |
2.2 字段字典:API 返回的完整字段
对自动取数更有用的是 API。/api/dataset?id=53 返回一个嵌套对象,下面逐字段说明其含义与注意事项。
| 字段 | Iris 的值 | 含义 | 使用注意 |
|---|---|---|---|
uci_id |
53 | 站内数字编号 | URL 与静态路径都用它,与人可读的数据集名是两个体系 |
name |
Iris | 数据集名 | 同名的历史版本会加括号后缀,如两份 Audiology 用 (Original) / (Standardized) 区分 |
repository_url |
/dataset/53/iris | 网站页地址 | 给人看的入口 |
data_url |
/static/public/53/data.csv |
规范化后的原始 CSV 直链 | 部分多文件数据集这里给的是主表,不一定是全部文件 |
abstract |
一段话 | 摘要 | 页面上同一段话 |
area |
Biology | 学科领域 | 与页面的 Subject Area 同一值 |
tasks |
["Classification"] |
适用任务 | 数组,可多值 |
characteristics |
["Tabular"] |
数据形态 | 如 Multivariate、Sequential、Time-Series |
num_instances |
150 | 行数 | 决定能否用于你的任务规模 |
num_features |
4 | 特征列数 | 不含目标列与 ID 列 |
feature_types |
["Real"] |
特征类型 | 与 variables 里的 type 粒度不同 |
demographics |
[] |
人口学相关变量标记 | 空数组表示未标记,不等于"绝无敏感属性" |
target_col |
["class"] |
目标列名 | 数组,多目标任务会有多值 |
index_col |
null | ID 列名 | 有值时一定按它切分,不可随机打散 |
has_missing_values |
"no" |
是否含缺失值 | 字符串,不是布尔 |
missing_values_symbol |
null | 缺失值记号 | 有缺失值的数据集这里会给出,如 ? |
year_of_dataset_creation |
1936 | 数据生成年份 | 可以早于入库年份很多 |
last_updated |
Tue Sep 12 2023 |
该条元数据最后更新时间 | 不是数据最后更新时间,也不代表活跃维护 |
dataset_doi |
10.24432/C56C76 |
数据集级 DOI | 引用的首选锚点 |
creators |
["R. A. Fisher"] |
创建者 | 与 intro_paper.authors 不一定一致 |
intro_paper |
对象 | 入门论文详情 | 含 title/authors/venue/year/journal/DOI/URL 等子字段 |
variables |
数组 | 变量级字典 | 见 §2.4 |
additional_info |
对象 | 描述性自由文本 | 含 summary/purpose/funded_by/instances_represent/recommended_data_splits/sensitive_data/preprocessing_description/variable_info/citation 九个键 |
additional_info 里最容易被忽略、也最该先读的是 recommended_data_splits 与 instances_represent。前者若非空,意味着作者给出了官方划分口径,不采用要在论文里说明;后者决定了"独立样本"的单位——一条购买记录?一个病人?一次观测?单位判错的后果远大于调参。
2.3 网页字段与 API 字段的差异
同名不同值的情况不多,但有几处需要留意,否则会出现"页面上明明有、程序里取不到"的困惑。
| 信息 | 网页 | REST API | 差异处理建议 |
|---|---|---|---|
| 文件清单 | 列出每个文件名与体积 | 不列,只给 data_url |
需要全文件清单须爬静态目录或看页面 |
| 引用样式 | 给出六样式可复制文本 | 不给格式化引用,只给 dataset_doi |
用 DOI 自行套模板 |
| 被引题录 | 列出引用该数据集的论文列表 | 不在此接口 | 需要到页面上追被引文献 |
| 基准性能 | 页面有 Baseline Model Performance 区块 | 不在标准返回里 | 属页面附加信息,不要与元数据混用 |
| 浏览量 | 页面显示累计浏览量计数 | 无此字段 | 实时计数,随时间增长,不作定论依据 |
| 缺失值 | 页面为 yes / no 问句 | has_missing_values 为字符串 |
比较时按字符串处理 |
需要强调:网页上的" Papers Citing this Dataset"列表由系统自动关联生成,存在同名误挂与漏挂,用它做文献计量会失真;用它找一篇入门读物是可以的。
2.4 一份数据集的完整解剖
以 Iris 为例把五层平面串起来。
第一层,指标条。 页面显示 150 Instances、4 Features、Real 特征类型、Tabular 形态、Biology 领域、Classification 任务。这六个值就是它的全部体量画像,一句话能说完。
第二层,标签与创造者。 Creators 写 R. A. Fisher;DOI 写 10.24432/C56C76;创作年份 1936。DOI 对应的机构前缀 10.24432 是全站统一的,后面六位字符才是每份数据的独立后缀。
第三层,信息块。 “What do the instances in this dataset represent?” 的答案是 “Each instance is a plant”——一行代表一株植物,因此同一植株的多条测量若存在,切分时须归入同一组。Additional Information 里有一句极易漏读的更正:“This data differs from the data presented in Fisher’s article”,并逐条指出第 35 号与第 38 号样本的具体数值错误。这类更正正是"一个人工维护的目录"相对"一堆镜像文件"的价值所在。
第四层,变量表。 五列字典如下(Iris 的完整变量表):
| Variable Name | Role | Type | Description | Units | Missing Values |
|---|---|---|---|---|---|
| sepal length | Feature | Continuous | — | cm | no |
| sepal width | Feature | Continuous | — | cm | no |
| petal length | Feature | Continuous | — | cm | no |
| petal width | Feature | Continuous | — | cm | no |
| class | Target | Categorical | class of iris plant: Iris Setosa, Iris Versicolour, or Iris Virginica | — | no |
这一段值得单独说:role 只有 ID / Feature / Target 三种取值,type 区分 Continuous / Categorical / Integer 等,units 只对非类别变量有意义,missing_values 是逐列的而不是整表的。把这四个字段用到位,就能自动判断"哪些列能进模型、目标是谁、要不要先做 one-hot、单位要不要统一"。这是全站元数据设计里最省力的一处。
第五层,文件清单。 Iris 在站上挂了四个文件:bezdekIris.data 4.4 KB、iris.data 4.4 KB、iris.names 2.9 KB、Index 105 Bytes。注意这里出现两个同名不同内容的 .data——一个是原始版,一个是后续流传中被更正过的版本;Index 是几十字节的说明;.names 是历史遗留的字段说明文本。如果你以为"每个数据集就是一个 CSV",在这里就错了:文件层是历史沉积层,官方提供的 data_url 只是其中经过规范化的一份。
2.5 文件面:静态路径与压缩包
除 /dataset/<id>/<slug> 的页面之外,所有文件都挂在一条固定规律的静态路径下:
https://archive.ics.uci.edu/static/public/<uci_id>/data.csv #-- 规范化主表
https://archive.ics.uci.edu/static/public/<uci_id>/<slug>.zip #-- 该数据集的打包文件
uci_id 就是 API 里的数字编号。Iris 的 data.csv 首两行是表头加一行 5.1,3.5,1.4,0.2,Iris-setosa,即 列名采用带空格的原始写法(sepal length 而不是 sepal_length)。这一点直接决定了读进 pandas 之后的列名处理:read_csv 之后列名带空格,很多链式调用会报错或被静默忽略。
打包文件也确实存在:/static/public/53/iris.zip 返回 200,/static/public/1/abalone.zip 返回 200 且体积 55357 字节。但 <slug>.zip 的 slug 拼写规则并不统一(大小写、加号编码、+ 对空格的替换都能在页面地址里见到),所以批量下载时不建议拼 URL,应当先从 /api/datasets/list?filter=python 拿到带 url 字段的清单。
2.6 与通用数据仓储的字段差异
同样是"数据保存在一个机构",UCI 库与 Dryad 一类的论文附录仓储、与各机构开放数据门户,在字段层面的重心完全不同。
| 比较项 | UCI 机器学习数据集库 | 通用附录仓储(以 Dryad 型为代表) | 领域门户 |
|---|---|---|---|
| 收录单元 | 一个"数据集",自成一个可被引用的工作单元 | 一篇论文的附件,依附于论文 | 一个项目下的一批样本或一批文件 |
| 主标识符 | 数据集级 DOI | 附件级 DOI,常与论文 DOI 并挂 | 项目/样本级编号,DOI 不常见 |
| 核心元数据 | 实例数、特征数、任务类型、特征类型、目标列 | 文件格式、文件数、体积、与论文的对应关系 | 平台规范(如组学平台、测序策略) |
| 粒度最细处 | 变量级:role / type / units / missing_values / demographic | 文件级 | 样本级或序列级 |
| 许可 | 统一 CC BY 4.0 | 作者自选,常见 CC0 或 CC BY | 因门户而异,常见自定义条款 |
| 许可能否商用 | 官方页面写明"允许为任何目的共享与改编,前提是给予适当署名" | 取决于作者选择的条款 | 需逐个门户确认 |
| 是否有取舍指令(推荐切分) | recommended_data_splits 字段 |
通常无 | 通常无 |
| 是否要求去除个人身份信息 | 捐赠政策明确要求 | 各有政策 | 受控访问居多 |
一句话概括这张表:UCI 库是为"算法评测"设计的元数据,通用仓储是为"论文可复现"设计的元数据,领域门户是为"样本可回溯"设计的元数据。 三者都叫"数据仓库",字段却几乎不重叠。
§3 它是谁的数据
3.1 三种角色不要混为一谈
站上的每一份数据涉及至少三种人,官方区分得很清楚,用混了会在引用传播里出事故。
| 角色 | 官方用语 | 职责 | 引用时如何处理 |
|---|---|---|---|
| 捐赠者与创建者 | donors and creators of the databases and data generators | 产出并提供数据 | 官方称"最应感谢的是他们";放在被引用的第一顺位 |
| 馆员 | past librarians / current librarians | 整理元数据、把收入库、维护编号与许可 | 不出现在单数据集引用里;在引用"库整体"时出现 |
| 机构维护方 | 由 UCI 与 NSF 支持的项目 | 提供托管与持久访问 | 写在致谢或脚注里 |
第三行说的是机构方:加州大学欧文分校提供机构归属,美国国家科学基金会提供经费。官方原话是 “Funding support from the National Science Foundation is gratefully acknowledged”——请注意这是致谢性质的表述,官页并没有声称 NSF 是当前项目的唯一或长期资助方。写基金号时应另行核实,不要从这句话里推。
3.2 时间线
官方 About 页给出的历史节点只有三个,但每个都够重。
| 年份 | 事件 | 依据 |
|---|---|---|
| 1987 | 由 UCI 博士生 David Aha 以 FTP 归档形式创建 | About 页原文 |
| 1987 之后三十余年 | 历任 14 位馆员接力整理,名单在 About 页逐位列出 | About 页原文 |
| 至今 | 现任馆员为 Coen Adler 与 Saatvik Kher | About 页原文 |
| 2023 | 当前版本的网站发布 | About 页原文 |
| 具体数据年份 | 由各自 year_of_dataset_creation 给出,如 Iris 为 1936、Adult 为 1996 |
/api/dataset?id= 返回 |
注意最后一行的含义:数据年份可以比入库年份早几十年。Iris 是 1936 年的观测数据,被收进一个 1987 年创建的归档里,元数据最后一次更新在 2023 年 9 月 12 日。三个时间分属三个不同的世系,混淆它们会闹出"这个数据是 UCI 采集的"这种说法——UCI 从来不负责采集,只负责收存与描述。
3.3 收录场景:捐赠与外部链接
两条入口的政策并排写在站上,差别很大。
捐赠入口(Donate a Dataset)。 政策原文给出三条硬要求:其一,你必须明确有权把该数据集公开;若你不是原始采集者,原始采集者应当知情并同意。其二,若数据集包含个人身份信息(Personally Identifiable Information, PII),须在捐赠前去除,使得任何个人都无法被识别。其三,批准入库的数据集会被分配 DOI(若原本没有),并按 CC BY 4.0 许可。三条里第二条最值钱——它意味着"入库"这个动作本身包含了第一道隐私预处理,但预处理是由捐赠者而不是由库方完成的,库方无法也不承诺替你验证。
外部链接入口(Link External)。 政策原文只有两条:数据集必须"被广泛知晓且高质量"才会被接受;下载链接应当在被链接页面上可见。这一条通道的作用是让建筑物不必扩建也能挂更多的牌——代价是可持续性和可用性由第三方决定。 目录上写着某个外部数据集,实际能不能下载下来,取决于对面的服务器。
3.4 来源层次
把上面几节叠起来,可以得到一条清晰的三层结构:
| 层次 | 内容 | 可核验程度 |
|---|---|---|
| 第一层:原始数据 | 捐赠者提供的文件,或外部链接指向的远端文件 | 数据集页面 Download 区块;外部的需要到对面确认 |
| 第二层:官方整理元数据 | 变量表、实例数、特征数、任务标签、许可、DOI、recommended_data_splits |
网页 + REST API,机器可读,可逐条比对 |
| 第三层:关联文献 | intro_paper 字段、 Papers Citing this Dataset 列表、Baseline Model Performance |
题录自动关联,存在同名误挂与漏挂 |
第一层和第二层是本库真正的常年积累;第三层应当视为便利功能,不作为事实来源。写论文时把第三层当作事实来源(例如说"该数据集在某论文中被用于 X"),风险在于关联算法并不理解上下文。
§4 它最独特的东西
4.1 稀缺的不是数据,是"可被严肃引用的元数据"
六百八十九份数据的体量在今天是小数;但"每份都配了 DOI、都有变量级字典、都有统一的宽松许可、都有承接它的馆员署名"这条组合,找不出第二个面向通用机器学习的地方。别的地方可以做大规模,做不到这种逐条人工担保。
这条担保具体落在三个可核验的点上:其一,页面上由谁整理可由馆员名单追溯;其二,每个数据资源的许可只有一个值(CC BY 4.0),不用逐个翻条款;其三,DOI 在学术引用体系里能被持久解析。把这三点拿走,它就只是一个文件目录。
4.2 差异化证据:三处小设计定下了它的性格
第一处,多文件保留原貌。 Iris 页同时挂 iris.data 与 bezdekIris.data,并在 Additional Information 里说明网上流传版本与 Fisher 原文存在两处差异。它选择保留两个版本并写下差异,而不是偷偷整合成一份"正确的数据"。 这个取舍说明它把自己定位为"归档"而不是"清洗服务"。
第二处,has_missing_values 与 missing_values_symbol 分开。 很多平台只写"有缺失值",至于缺失是用什么符号表示的(空格、?、NaN、还是某个魔法数字),要自己去猜。这里把它做成了两个字段,并且在 API 里明示 has_missing_values 是字符串而非布尔。这个细节对自动管线是分水岭:布尔要写 if has_missing,字符串要写 if has_missing == 'yes',写错不会报错,会静默把所有数据集判成"有缺失"或"没有"。
第三处,instances_represent 与 recommended_data_splits 这两个问句。 前者逼着捐赠者回答"一行代表什么",后者记录作者给出的官方划分。这两个字段在很多数据集上是空的,但它们的存在本身就是在提示:切分单位与推荐划分是数据集属性的一部分,而不是使用者可以随意定的东西。
4.3 三个案例:一头一尾与中间
| 案例 | 编号 | 关键值 | 用它说明什么 |
|---|---|---|---|
| Iris | 53 | 150 实例、4 特征、1936 年、DOI 10.24432/C56C76、has_missing_values 为 no |
最小的那头:四个特征、三类别,适合讲解而不适合评测 |
| Adult | 2 | 48842 实例、14 特征、1996 年、DOI 10.24432/C5XW20、has_missing_values 为 yes、target_col 为 income、特征类型 Categorical + Integer |
中间:仍为表格,但规模、混合类型与缺失值三者同时出现,才是真实表格数据的常态 |
| Amazon Product and Google Locations Reviews | 1276 | 3.06M 实例、2 特征、 Regression 任务、出现在首页 New Datasets 区块 | 最新的那头:编号已排到 1276,仍有新数据进入,体量不在同一个量级 |
三个案例加起来说明的是"跨度"而不是"平均"。编号从最早的 Iris 排到当下的 1276,中间隔着 1936 年的观测数据、有 1996 年的普查数据、也有按小时统计评论条数的时序表。把它理解为"一批同类数据的集合"是错的,它是一条三十余年的沉积带。
4.4 元数据的粒度:变量表是最值得考古的一层
变量表只有六个字段(name / role / type / description / units / missing_values),但它是全站最能反映"人真的看过这份数据"的地方。判断方法很简单:翻几份数据,看 description 是否为空、是否为机械重复列名、units 是否真的填了单位。
这个字段同时也是不同数据集之间元数据质量不齐的最直观证据:description 有写满一句的,也有整份数据全部为空的。所以在用它自动构建特征字典时,空 description 应当显式写成"官方未提供",不要用列名去填充——那会把"官方没说"伪装成"官方说了"。
demographic 字段单独说一句。它是一个布尔式标记,标明该变量是否代表人口学信息。它的价值在于让你能在建模前把性别、年龄、族裔一类的敏感列单独挑出来做公平性检查;它的局限在于它只在有人标记时才有效,未标记不等于不存在敏感属性。
4.5 边界条件:什么情况下它不再适用
当你的数据不止一个文件时。 它的文件面是"一个数据集一组文件",适合表格与小规模多媒体;遇到需要按分片存储、需要对象存储直读、需要版本化增量拉取的场景,它的静态路径接不上。
当你的许可要求超过 CC BY 4.0 时。 比如需要"不许改编"或"必须 copyleft",这里的统一条款反而成了限制。但要认清这是"统一"这件事的代价,而不是可以谈的条款:官方政策写的是入库即 CC BY 4.0,不提供逐份谈判。
当你要的是细分专业的领域数据。 它靠捐赠增长,既不做学科规划也不做主动采集。某一个细分临床专科的数据要么恰好有人捐了,要么没有,不存在第三种情况。
当你依赖具体到各个样本的 provenance 时。 元数据到变量级就停了,没有逐样本的 provenance 链(谁在何时用何设备产生这条记录)。要逐样本溯源,请找自带 provenance 的领域库。
§5 怎么拿到
5.1 三条取数路径与各自代价
| 路径 | 入口 | 适合 | 代价 |
|---|---|---|---|
| 网页浏览 | /datasets 带 facets 面板 |
找数据、读元数据与许可 | 不能批量,只能手工 |
| 静态文件直链 | /static/public/<id>/data.csv 与 <slug>.zip |
单个数据集的稳定拉取、放进 Makefile | slug 拼写不统一,批量需先拿清单 |
| REST API | /api/datasets/list、/api/dataset?id= |
元数据批处理、搭你自己的检索 | 拿到的是元数据,文件面仍要另取 |
| Python 包 | pip install ucimlrepo |
笔记本里一行拿到 DataFrame | 覆盖范围需先用 list_available_datasets 确认 |
网页 facets 面板给出的九个筛选维度是:Keywords、Attributes、Data Type、Subject Area、Task、# Instances、# Features、Feature Type、Python。排序维度六个:# Views、Name、# Instances、# Features、Date Donated、Relevance。其中名为 Python 的这一项,其确切语义(是不是"可被 ucimlrepo 导入")在官页上没有给出定义,本篇不作断言(见 §10 未核验内容)。
5.2 批量下载:先拿清单再拼 URL
BASE="https://archive.ics.uci.edu"
#-- 1) 取全清单,含 id、name、url 三个字段
curl -sL "$BASE/api/datasets/list?filter=python" -o list.json
#-- 2) 由清单取出编号 1 到 10 的十个数据集直链
for i in $(seq 1 10); do
curl -sL "$BASE/static/public/$i/data.csv" -o "uci_$i.csv"
echo "fetched $i"
done
#-- 3) 整包下载(slug 拼写以 /dataset/<id>/<slug> 页面为准)
curl -sL "$BASE/static/public/53/iris.zip" -o iris.zip
注意第 2 步用的是数字编号而不是 slug,正是为了绕开 §2.5 说的拼写问题。如果某个编号的数据集没有 data.csv,请求会返回 404 或空体——这个编号的存在不代表该编号有规范化的 CSV(多文件数据集尤其如此)。
5.3 REST API:把站上的元数据拉成本地表
import json, time, urllib.request, urllib.parse
BASE = "https://archive.ics.uci.edu"
def get(url):
#-- 官方接口返回 JSON 包装:{status, statusText, data}
with urllib.request.urlopen(url, timeout=30) as r:
return json.loads(r.read().decode("utf-8"))
#-- 全清单:689 条 {id, name}
listing = get(f"{BASE}/api/datasets/list")["data"]
#-- 逐条取详情,组装元数据表
rows = []
for item in listing[:20]:
d = get(f"{BASE}/api/dataset?id={item['id']}")
if not d.get("data"):
continue
x = d["data"]
rows.append({
"uci_id": x.get("uci_id"),
"name": x.get("name"),
"area": x.get("area"),
"instances": x.get("num_instances"),
"features": x.get("num_features"),
"has_missing": x.get("has_missing_values"),
"missing_sym": x.get("missing_values_symbol"),
"target_col": x.get("target_col"),
"doi": x.get("dataset_doi"),
"created_year": x.get("year_of_dataset_creation"),
})
time.sleep(0.2) #-- 六百余次请求,留出间隔
上面这段代码的价值在于把站上的元数据变成一张可连接的本地表。两个容易踩的点:其一,has_missing_values 是字符串,按布尔处理会全错;其二,全站拉取是对 /api/dataset?id= 发起六百余次请求,必须加间隔并在失败时重试,否则会被判为滥用。
5.4 Python 包:最短路径
官方维护的 ucimlrepo 把上面三步合成一行。PyPI 上的当前版本是 0.0.7,要求 Python ≥ 3.7,仓库在 github.com/uci-ml-repo/ucimlrepo。
pip install -U ucimlrepo
from ucimlrepo import fetch_ucirepo, list_available_datasets
#-- 先看哪些数据集可被导入(空参打印全清单);filter 目前文档给出的有效值是 'aim-ahead'
list_available_datasets()
#-- 按编号取(也可按名字取,二者只能传其一)
iris = fetch_ucirepo(id=53)
#-- 等价写法:fetch_ucirepo(name='Iris')
#-- 三个数据面:原始全表 / 特征 / 目标
df_all = iris.data.original
X = iris.data.features
y = iris.data.targets
#-- 元数据与变量字典
print(iris.metadata.uci_id, iris.metadata.num_instances, iris.metadata.dataset_doi)
print(iris.variables)
返回对象的三个部分分工清楚:data 给 pandas 表(含 ids / features / targets / original / headers),metadata 给与 API 同名的字段,variables 给变量级字典。要注意 list_available_datasets 这个函数存在本身就说明覆盖范围不是全集——清单里没有的数据集,这个包装不进来。写生产管线时不要假设"所有 UCI 数据集都能被这个包装进来"。
5.5 转成通用表结构
让它落到表格这一步没有难度,难度在列名。规范化 CSV 的列名是带空格的原始写法,进 DuckDB、Spark、SQL 之前要先处理:
import pandas as pd
#-- 静态直链同样可读,列名为 'sepal length' 这类带空格写法
df = pd.read_csv("https://archive.ics.uci.edu/static/public/53/data.csv")
print(df.columns.tolist()) #-- ['sepal length', 'sepal width', ...]
#-- 统一成下划划线命名,避免后续链式调用出错
df.columns = [c.strip().lower().replace(" ", "_") for c in df.columns]
反过来,若你把 data.csv 再转成 parquet 或写进数仓,要把 variables 表一起存下来:列名可以推,单位、缺失值记号、谁是目标列推不出来。丢掉 variables 表等于丢掉一半元数据,而且丢掉的恰好是官方人工整理过的那半。
5.6 五个最容易出错的地方
其一,把编号当成总数。 ID 从 1 排到 1276,清单却有 689 条。编号不连续,可能是历史上撤下的、可能是预留的。写"它有 1276 个数据集"是错的;写"689 个"才与首页及 API 一致。
其二,把 data.csv 当成该数据集的全部文件。 Iris 有四个文件,规范化 CSV 只是其中之一;多子集、多版本、附带说明文本的数据集尤其如此。
其三,把 has_missing_values 当布尔。 它是字符串 "no" / "yes";Python 里非空字符串恒为真,写成 if has_missing: 会把 "no" 判成真。
其四,把 CC BY 4.0 理解成"库方替你担了责"。 许可只约束再使用时如何署名,不担保数据内容不侵权、不含未发现的个人信息。捐赠政策里去除 PII 的义务主体是捐赠者。
其五,把浏览计数当成使用量指标。 页面上的计数是实时累计值,随时间单调增长;它没有去重口径说明,也没有时间窗,不能拿来比较两份数据的"热度"。
§6 与库内其他数据集的关系
6.1 关系图谱
在千方医数集里,与本词汇同层的不是某个具体数据集,而是另外一批"数据存放在哪里"的角色。它们分成三圈:
| 圈层 | 代表 | 与本库的关系 |
|---|---|---|
| 同为通用数据仓储 | Dryad、ECRIN MDR | 收录逻辑不同(论文附录 / 试验元数据 vs 算法评测数据),可互补 |
| 同为门户与索引 | HealthData.gov、ICGC、NMDC | 做「去哪里找」的替代答案:它们是检索的第一站,本库是被写进参考文献时的那一站 |
| 领域专用数据仓库 | PRIDE、EMPIAR、Qiita、DANDI Archive | 当你需要平台级规范与逐样本溯源时,应转向这些 |
| 从本库流入再整理的版本 | UCI HAR、UCI CTG | 同一份数据经第三方再加工后的版本,字段口径可能已变 |
最后一行格外要小心:一个以 uci- 开头的数据集词条,往往是本库中某份数据被第三方或平台二次整理后的结果,而不是本库本身。 引用时两者要分清——二次整理版不等于原站的规范版本。
6.2 检索路径
想在本库里确认"某个健康问题的数据是否存在",顺序应该是:
- 先在
/datasets用 Keywords 与 Subject Area 筛,看 Subject Area 里有没有对应学科; - 用
/api/datasets/list?search=<关键词>做名字级匹配,取回编号列表; - 对候选编号逐个查
/api/dataset?id=,读area、tasks、additional_info.sensitive_data三项; - 命中后再看
additional_info.summary判断是不是同一份,最后才用data_url拉文件。
第三条里的 additional_info.sensitive_data 常被跳过。它若非空,说明官方对这个数据集的敏感性有话要说——在涉及人的数据上,这一项应当优先于一切方便性考虑。
6.3 分工判据
| 判断条件 | 走向 |
|---|---|
| 你要的是教学演示、基线对标、表格特征工程 | 用它,√ |
| 你要的是逐样本 provenance 与平台级规范 | 走领域专用库(如 PRIDE、EMPIAR、DANDI Archive) |
| 你要的是论文附录数据的保存 | 走 Dryad 型附录仓储 |
| 你要的是试验的方案与元数据登记 | 走 ECRIN MDR |
| 你要的是一个国家/机构的公开数据总入口 | 走 HealthData.gov、NMDC 这类门户 |
| 你要的是某个已有 UCI 数据的站外整理版 | 找对应的词条(如 UCI HAR、UCI CTG),但要回原站核对口径 |
| 你要的是大体量非表格语料 | 都不是,应该去找专门的原始语种/影像/时序库 |
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
评估一个数据目录的质量与评估一份数据的质量是两件事,用的尺子不同。一份数据可以有完美的采集设计却配了糟糕的元数据;一个目录可以元数据做得极细却里面既有干净数据也有粗糙数据。本节评的是后者——这个"目录"本身的可靠性,不涉及任何一个具体数据集的内容质量。混起来评会得出两个方向的错误结论。
7.1 五维评分
| 维度 | 评价 | 依据 |
|---|---|---|
| 元数据完备度 | 高 | 每份都有摘要、指标条、标签块、变量表;additional_info 九个键覆盖目的、资助、实例含义、推荐切分、敏感性 |
| 许可清晰度 | 高 | 全站单一许可 CC BY 4.0,页面 License 区块写明要点与条款链接 |
| 可追溯性 | 高 | 数据集级 DOI + 六样式导出 + intro_paper 字段 |
| 数据内容质量一致性 | 中 | 靠捐赠增长,多文件保留原貌而不统一清洗;多版本并存由使用者自辨 |
| 规模与覆盖 | 低 | 首页声明 689 份,编号至 1276;不足以充当通用语料来源 |
概括起来:它的强项是"第二层元数据",弱项是"第一层数据一致性"。把你的期待放在正确的那一层上,就能用它用得很顺;放错了层,就会在"为什么他们不把文件清洗统一"上反复失望。
7.2 元数据质量的两层
第一层,结构与命名的一致性:好。 字段名固定、API 返回结构稳定、num_instances 与页面上 # Instances 同源。这一层可靠,可以写进自动管线而不需要人工兜底。
第二层,字段内容是否被填满:不齐。 最直观的对照是同一份 Iris,variables 里 class 有完整描述而四个特征的 description 全为空;additional_info 里 purpose 的值为 N/A、recommended_data_splits 与 sensitive_data 均为空。也就是说,字段存在不等于字段有值,且"官方未提供"与"官方确认不存在"在数据上无法区分(都是空值)。任何自动构建的数据字典都必须把这两种空分开显示。
7.3 已知的、可枚举的偏差
| 偏差 | 机制 | 影响 |
|---|---|---|
| 捐赠偏差 | 靠自愿捐赠增长,而非按计划采集 | 冷门领域、难公开发布的领域系统性缺位 |
| 语言与地域偏差 | 捐赠者群体本身不均 | 非英语世界、北美以外场景的数据代表性不确定 |
| 版本并存偏差 | 多版本文件同时在页面挂着 | 不同论文引用"同一份 Iris"可能用了不同文件 |
| 时代偏差 | 数据年份可早至 1936,元数据更新至 2023 | 老数据的采集口径与当代标准不同,纵向上不可比 |
| 引用关联偏差 | Papers Citing 列表为自动关联 | 同名误挂、漏挂,不能作为文献计量依据 |
| 计数偏差 | 页面浏览量为无去重口径的实时累计值 | 不可用于横向比较 |
7.4 外部验证
对一个"书目型"实体,外部验证要问的是:别人是否真的按它声明的方式在用。可核验的两条如下:其一,官方 Citation 页明确区分了两种引用(引用某个特定数据集请用它页面上的 Cite 按钮;引用库整体用给出的那条 citation),这说明该目录是作为一个可引用对象而非仅仅一个下载站存在;其二,doi.org 前缀 10.24432 是全站统一的数字对象标识符前缀,每份后缀独立——DOI 的存在本身把"某位同事拷给我的 iris.data"升级为"doi:10.24432/C56C76"。
不可核验、本篇也不作断言的部分包括:各数据集的实际被引次数分布、全站累计下载量、以及各学科领域的覆盖构成。这些需要文献计量方法或全站拉取后的聚合,属于自行计算的分布性统计,超出本文允许的写法。
7.5 它为何能持续:稀缺的不是数据量,是那个组合
一个 1987 年的 FTP 归档能在 2026 年还被当作默认起点,靠的不是任何单点优势。规模上它远小于任何现代平台;功能上它没有搜索、没有推荐、没有版本控制、没有在线 notebook 环境。它持续的原因在于三个东西同时成立且互相加固:编号与 DOI 让它可被持久引用;统一的宽松许可让使用无需逐份谈判;人工整理元数据让"这一行代表什么"有据可查。三者缺一,它就会退化成一个文件目录——而今天已经有太多更小的替代品。
同时也要注意反面:这三样能持续的前提,是它把自己克制在六百八十九份的规模上。把同样的馆员制度放到六万份数据上,元数据的第二层(内容是否被填满)会先崩掉。它的可持续性与它的小是同一件事的两面。
§8 生态位与历史
8.1 历史沿革
官方 About 页给出的历史极短,短到几乎不带任何过渡:1987 年 David Aha 建立 FTP 归档;此后被广泛使用;一批又一批馆员接力;如今由 Coen Adler 与 Saatvik Kher 维护;当前版本网站于 2023 年发布;NSF 的经费支持被郑重重申感谢。
这段叙述里最值得记住的是连续性没有被中断过——历任馆员名单能一路列出 14 位,从 David Aha 到 Markelle Kelly,再到现任两人。这意味着这里的元数据规范不是某一版系统强加的,而是三十多年里逐步沉积下来的。好处是它非常稳定,代价是它保留了很多历史层积:正是这个原因,Iris 页才会同时挂着 iris.data 与 bezdekIris.data 两个版本。
8.2 与挑战赛
关于它与各类机器学习挑战赛、公开评测的正式配套关系,官方 About 页与 Citation 页均未给出声明,因此本篇不作断言。可以确定的只有一件事:站内每个数据集页面都带有一个 Baseline Model Performance(基线模型性能)区块,页面上给出 Accuracy 与 Precision 两个指标名——这说明它确实按"给定一个可直接比较的基准"的思路被使用着,但这不等于它与哪一个具体赛事绑定。
对使用者的含义很清楚:页面上的基线分数是该数据集自身的一套参考数字,可以拿来核对自己的管线是否明显跑偏,不适合拿来当作排行榜名次的依据。榜单是赛事方维护的东西,这里提供的是参照点。
8.3 生态位:编目层而不是算力层
如果给数据基础设施分层,最底下是存储(对象桶、文件系统),中间是分发(CDN、数据湖、注册表),再上面是加载与版本层(如各类 datasets 库与 Hub),最上面才是编目层:“这个东西叫什么、谁做的、能不能引用”。UCI 库在最后这一层的入口位置。它不提供存储可靠性 SLA,不提供高速下载,不提供数据加载器,但它提供把这三者串起来的那个名字与那个 DOI。
这个位置决定了它被人想起的时机:不是在开始训练的时候,而是在写论文参考文献的时候。 这既是它不可被替代的原因,也解释了为什么它在工程圈的存在感远低于它的学术圈存在感。
8.4 谁在用它
| 使用角色 | 典型动作 | 从它这里拿走的东西 |
|---|---|---|
| 机器学习教师 | 课堂演示与作业布置 | 一份几分钟能跑完、结果与教科书一致的表格数据 |
| 算法研究者 | 新方法与老方法的同题对比 | 尺寸小、坐标系公开、可被别人重复复用的一批数据集 |
| 可复现性工程人员 | 把论文里的"数据取自某某"固定下来 | 数据集级 DOI 与规范引用文本 |
| 特征工程学习者 | 练习缺失值、类别编码、混合类型处理 | 变量表 + has_missing_values 的真实例子 |
| 数据捐赠者 | 为自己的数据找长期出处 | 统一的许可条款与自动分配的 DOI |
| 平台整合方 | 把 UCI 数据导入自己的数据平台 | /api/datasets/list 与静态直链 |
§9 使用指引
9.1 三种角色的路径
| 角色 | 第一条命令 | 第二件事 | 要避开的坑 |
|---|---|---|---|
| 教师 / 学生 | fetch_ucirepo(id=53) |
读 iris.variables,讲清"为什么这一列是 Target" |
把 Iris 当成"机器学习数据集的普遍形态",其实它是极小一端 |
| 研究者 | /api/datasets/list?search=<关键词> |
读 additional_info.instances_represent 与 recommended_data_splits |
编号当总数、data.csv 当全集 |
| 工程整合方 | /api/datasets/list?filter=python |
拿带 url 的清单做增量拉取 |
拼 slug URL;无节制地全站轮询 |
9.2 一条最短的可用流程
from ucimlrepo import fetch_ucirepo
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
#-- 1) 取数据与元数据
ds = fetch_ucirepo(id=53)
X, y = ds.data.features, ds.data.targets
#-- 2) 先看变量字典,而不是先看准确率
print(ds.variables[["name", "role", "type", "missing_values"]])
print("target:", ds.metadata.target_col, "| n:", ds.metadata.num_instances)
#-- 3) 有 index_col 或推荐切分就按其办理,没有才随机划分
idx = ds.metadata.index_col
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, random_state=0)
#-- 4) 训练与评估
acc = accuracy_score(yte, LogisticRegression(max_iter=200).fit(Xtr, ytr).predict(Xte))
print("acc:", round(acc, 4))
这段代码里真正重要的不是第 4 步,而是第 3 步前面的判据:先看有没有 index_col、有没有 recommended_data_splits、一行代表什么。Iris 恰好这三样都干净(无 index 列、无推荐切分、一行一株植株),所以随机划分安全;换一份 index_col 非空或 recommended_data_splits 非空的数据集,同样的写法就会造成泄漏或与官方口径不一致。
9.3 引用方式
官方 Citation 页把引用分成两种情形,不要混用:
| 情形 | 官方给出的做法 |
|---|---|
| 引用某一个具体数据集 | 用该数据集页面上的 Cite 按钮,导出所需样式 |
| 引用库整体(例如一次引用多个数据集) | Markelle Kelly, Rachel Longjohn, Kolby Nottingham, The UCI Machine Learning Repository, https://archive.ics.uci.edu |
单个数据集的导出样式共六种:APA、MLA、Chicago、Vancouver、IEEE、BibTeX。以 Iris 的 APA 为例,官方生成的文本是 Fisher, R. (1936). Iris [Dataset]. UCI Machine Learning Repository. https://doi.org/10.24432/C56C76.——注意 [Dataset] 标记与 DOI 的写法都是官方模板的一部分,自行手抄时容易漏。
本页自身的永久地址为 https://www.qianfanghub.com/ai-ready-dataset/uci-ml-repository/1813 ,其中的编号由发布系统注入。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,编辑把关结构与事实 |
| 数字来源 | 规模、结构、边界三类数字来自官方首页、About 页、Citation 页、捐赠与链接政策页、数据集页与 REST API 返回 |
| 文件核验 | /api/datasets/list、/api/dataset?id=53、/api/dataset?id=2、/static/public/53/data.csv、/static/public/53/iris.zip、/static/public/1/abalone.zip 经直接访问确认 |
| 版本与时点 | 核验时点 2026 年 10 月 29 日;首页与 API 口径下的总数为 689;ucimlrepo 当时 PyPI 版本 0.0.7 |
| 不一致说明 | 编号上界 1276 与总数 689 不等,原因是编号不连续而非计数误差; §5.6 第一项说明此事 |
| 未核验内容 | 名为 Python 的筛选条件的确切语义;各数据集被引次数与浏览量以外的采用度量; |
| 图像 | 无配图;封面为生成式提示词,不含任何真实数据集文件画面 |
| 免责 | 数据使用须遵守 CC BY 4.0 的署名要求;许可全文以 Creative Commons 官方条款为准 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「它有一千二百七十六个数据集」 | 689 个;1276 只是编号上界 | 首页原文;API 列表长度 |
| 「每个数据集就是一个 CSV」 | Iris 挂了四个文件,规范化 CSV 只是其中之一 | 数据集页文件清单 |
| 「数据都是 UCI 采集的」 | UCI 只收存与描述;采集者是 donors and creators | About 页表述 |
「has_missing_values 是布尔值」 |
是字符串 "yes" / "no" |
/api/dataset?id= 返回类型 |
| 「所有数据集都能用 Python 包装进来」 | 覆盖范围须用 list_available_datasets 确认 |
ucimlrepo 文档 |
| 「入库即代表质量被第三方验过」 | 入库意味着"有人愿为此负责",不是外部验证 | 收录政策只约束许可与 PII |
| 「CC BY 4.0 意味着可以随便用、不用署名」 | 允许为任何目的共享与改编,条件是给予适当署名 | 页面 License 区块 |
| 「外部链接的数据由本库托管」 | 只登记元数据,文件在第三方站点 | Linking Policy |
| 「PII 由库方负责去除」 | 去除 PII 的义务主体是捐赠者 | Donation Policy 第二条 |
| 「浏览量可以比较两份数据的热度」 | 无去重口径的实时累计计数 | 页面计数无口径说明 |
| 「引用时写个网址就够了」 | 单数据集用其 DOI,库整体用官方给定的那条 citation | Citation 页区分两种情形 |
FAQ
Q1:UCI 机器学习数据集库到底是什么,一句话怎么说?
一句话:它是一个 1987 年由 UCI 博士生 David Aha 建立的 FTP 归档,如今由 UC Irvine 维护,收录六百八十九个用于机器学习算法实证分析的数据集、领域理论与数据生成器,每份配 DOI、按 CC BY 4.0 许可。它不是一个搜索引擎,也不是一个云计算平台,它是一个可被严肃引用的数据目录。
Q2:为什么编号到 1276,总数却只有 689?
编号是在入库时顺序分配的,而清单是当下实际存在的集合。两者相差是因为编号不连续——有些编号可能历史上下架了、预留了或未被使用。计数请以首页声明与 /api/datasets/list 的返回长度为准,不要用编号上界推算。
Q3:能商用吗?
官方政策写的是:捐赠入库的数据集按 Creative Commons Attribution 4.0 International 许可,允许为任何目的共享与改编,前提是给予适当署名。因此含商用在内的绝大多数场景是允许的。真正的义务是署名,而不是付费或申请。条款全文以 Creative Commons 官方页面为准。
Q4:每个数据集都有 DOI 吗?
捐赠政策说"批准入库的数据集会被分配 DOI(若原本没有)"。所以捐赠入库的应当都有;通过外部链接方式登记的,情况取决于该记录本身。判断方法是看页面上的 DOI 区块或 API 的 dataset_doi 字段是否有值。
Q5:我应该怎么引用它?
分两种情形。引用某一个具体数据集,用该数据集页面上的 Cite 按钮导出所需样式(六种可选);引用库整体——例如你的论文一次用了多份数据——用官方给定的那条:Markelle Kelly, Rachel Longjohn, Kolby Nottingham, The UCI Machine Learning Repository, https://archive.ics.uci.edu。
Q6:fetch_ucirepo 取不到我要的数据集怎么办?
先跑 list_available_datasets() 确认它在可被导入的清单里。不在的话,回到网页取静态直链(/static/public/<id>/data.csv)或用 zip 包。这个包的价值在于省事,它的覆盖不是全集,生产管线不要假设全覆盖。
Q7:改个 slusset239 行为会不会影响下游/这样的话这种便利+约束之间的合理权衡。
data.csv 的列名采用原始带空格写法(如 sepal length)。把它读进 pandas 之后,链式调用与 SQL 下推都会受影响。稳妥做法是读完后立刻统一命名,并把 variables 表一起存档——单位、缺失记号、目标列这些推不出来,只能从 variables 里拿。
Q8:里面的数据干净吗?
不保证。它能保证的是元数据规范、许可明确、标识符持久。多版本并存时不作统一清洗(Iris 同时挂两个 .data 就是例子),版本差异写在 Additional Information 里由你自己读。
Q9:我想把自己的数据放上去,需要做什么?
先确认两件事:你有权把它公开(若你不是原始采集者,须让原始采集者知情并同意);数据中若含个人身份信息,须在捐赠前去除。然后走捐赠流程,入库后会被分配 DOI 并按 CC BY 4.0 许可。若你的数据已经在别处公开且广为人知,也可以走外部链接通道。
Q10:它和其他数据门户该选哪个?
看你要的那一层。要教学演示与基线对标,用它;要逐样本溯源与平台级规范,走领域专用仓库;要论文附录数据的保存,走附录型仓储;要某个国家机构的公开数据总入口,走门户。判据是"你缺的是可被引用的名字,还是可溯源的数据体"。
术语表
| 术语 | 解释 |
|---|---|
| UCI Machine Learning Repository | 加州大学欧文分校机器学习数据集库,1987 年创建 |
| FTP 归档 | 通过文件传输协议对外提供的目录式存档,网页时代之前的常见分发方式 |
| 馆员(librarian) | 本站负责整理元数据、把关入库与维护编号的角色 |
| 捐赠者(donor) | 把自己的数据提交入库的人或机构 |
| DOI | 数字对象标识符,持久可解析的对象标识,本站为每个数据集分配一个 |
| CC BY 4.0 | Creative Commons Attribution 4.0 International,署名即可自由使用与改编的许可 |
| PII | Personally Identifiable Information,个人身份信息,捐赠前须去除 |
| faceted search | 在多个维度(facet)上同时筛选的检索方式 |
| 实例(instance) | 表中的一行,对应一个观测单位 |
| 变量表(variables table) | 逐列给出角色、类型、描述、单位、是否含缺失值的字段字典 |
| Target / Feature / ID | 变量角色:目标列 / 特征列 / 标识列 |
has_missing_values |
API 字段名,标明数据集是否含缺失值,取值为字符串 |
missing_values_symbol |
API 字段名,标明缺失值用什么符号表示 |
instances_represent |
元数据问句的回答,说明一行代表什么实体 |
recommended_data_splits |
元数据字段,记录作者给出的推荐训练/测试划分 |
intro_paper |
该数据集的入门论文信息对象 |
| Tabular / Multivariate / Sequential / Time-Series | 本站 characteristics 的常见取值,描述数据形态 |
ucimlrepo |
官方维护的 Python 包,用于一行把数据集读成 DataFrame |
| REST API | 以 HTTP 请求获取 JSON 结果的程序接口 |
| NSF | National Science Foundation,美国国家科学基金会,本站致谢的资助方 |
| 外部链接(Link External) | 只登记元数据、文件托管在第三方站点的收录方式 |
附录 A:核心数字核对表
| 项 | 值 | 出处 | 层级 |
|---|---|---|---|
| 数据集总数 | 689 | 首页原文;/api/datasets/list 返回长度 |
官方页面 + 官方文件 |
| 编号上界 | 1276 | /api/datasets/list 中最大 id |
官方文件 |
| 创建年份 | 1987 | About 页 | 官方页面 |
| 现任馆员人数 | 2 | About 页列出 Coen Adler、Saatvik Kher | 官方页面 |
| 历任馆员人数 | 14 | About 页逐位列出 | 官方页面 |
| 现行网站版本年份 | 2023 | About 页原文 | 官方页面 |
| Iris 实例数 | 150 | 数据集页 / num_instances |
官方页面 + 官方文件 |
| Iris 特征数 | 4 | 数据集页 / num_features |
官方页面 + 官方文件 |
| Iris 数据年份 | 1936 | year_of_dataset_creation |
官方文件 |
| Iris DOI | 10.24432/C56C76 | 数据集页 / dataset_doi |
官方页面 + 官方文件 |
| Iris 文件数 | 4 | 数据集页文件清单 | 官方页面 |
| Adult 实例数 | 48842 | num_instances |
官方文件 |
| Adult 特征数 | 14 | num_features |
官方文件 |
| Adult 缺失值 | yes | has_missing_values |
官方文件 |
| Adult DOI | 10.24432/C5XW20 | dataset_doi |
官方文件 |
ucimlrepo 版本 |
0.0.7 | PyPI 元数据 | 官方文件 |
ucimlrepo Python 要求 |
≥ 3.7 | PyPI 元数据 | 官方文件 |
| 许可 | CC BY 4.0 | 捐赠政策页 + 数据集页 License 区块 | 官方页面 |
| 引用样式数 | 6 | 数据集页 Cite 面板 | 官方页面 |
| 网页筛选维度数 | 9 | /datasets 页 facets 面板 |
官方页面 |
| 网页排序维度数 | 6 | /datasets 页排序下拉 |
官方页面 |
附录 B:数字的来源分层
第一层:官方页面与官方接口。 数据集总数、创建年份、馆员名单、网站版本年份、许可以及各具体数据集的规模与 DOI。这些来自首页、About 页、Citation 页、捐赠与链接政策页、数据集详情页,以及 /api/datasets/list 与 /api/dataset?id= 的返回。凡是本文给出的规模类数字,追到这里为止。
第二层:官方文件。 静态文件路径与打包文件的可访问性、data.csv 的列名写法,由直接请求确认;ucimlrepo 的版本与 Python 要求来自 PyPI 元数据;该包的用法来自官方仓库的文档。
第三层:未核实。 名为 Python 的筛选条件的确切语义;各数据集被引次数的整体情况;全站下载量;各学科领域的覆盖构成。需要说明的是,第三层的前三项即使能取到也属于自行聚合的分布性统计,按本文的数字纪律不予给出,此处列出只是标明边界。
附录 C:参考文献
| 编号 | 文献 | 链接 | 用途 |
|---|---|---|---|
| 1 | UCI Machine Learning Repository 首页 | https://archive.ics.uci.edu/ | 总数 689、入口与导航结构 |
| 2 | About 页 | https://archive.ics.uci.edu/about | 创建者、创建年份、馆员名单、版本年份、资助致谢 |
| 3 | Citation 页 | https://archive.ics.uci.edu/citation | 官方推荐的库整体引用格式 |
| 4 | 捐赠政策页 | https://archive.ics.uci.edu/contribute/donation | PII 要求、DOI 分配、CC BY 4.0 |
| 5 | 外部链接政策页 | https://archive.ics.uci.edu/contribute/linking | 外部登记的准入条件 |
| 6 | Iris 数据集页 | https://archive.ics.uci.edu/dataset/53/iris | 文件清单、变量表、DOI、许可区块、引用样式 |
| 7 | 数据集列表 API | https://archive.ics.uci.edu/api/datasets/list | 总数与编号区间 |
| 8 | 单数据集 API(Iris / Adult) | https://archive.ics.uci.edu/api/dataset?id=53 | 元数据字段字典 |
| 9 | 规范化 CSV 直链 | https://archive.ics.uci.edu/static/public/53/data.csv | 列名写法与静态路径规律 |
| 10 | ucimlrepo 官方仓库 |
https://github.com/uci-ml-repo/ucimlrepo | Python 包用法与覆盖范围说明 |
| 11 | ucimlrepo 包元数据 |
https://pypi.org/pypi/ucimlrepo/json | 版本号与 Python 要求 |
附录 D:任务代码
任务一:核对某一数据集能不能贴合你的切分口径
from ucimlrepo import fetch_ucirepo
def split_guard(uci_id):
#-- 元数据里的三个字段决定能不能随机切分
ds = fetch_ucirepo(id=uci_id)
m = ds.metadata
idx = getattr(m, "index_col", None)
rec = m.additional_info.recommended_data_splits
unit = m.additional_info.instances_represent
return {"index_col": idx, "recommended": rec, "unit": unit}
for i in (53, 2, 45):
print(i, split_guard(i))
任务二:批量拉取并保留变量字典
import json, time, urllib.request
BASE = "https://archive.ics.uci.edu"
def get_json(url):
with urllib.request.urlopen(url, timeout=30) as r:
return json.loads(r.read().decode("utf-8"))
listing = get_json(f"{BASE}/api/datasets/list")["data"]
out = {}
for it in listing[:10]:
d = get_json(f"{BASE}/api/dataset?id={it['id']}").get("data")
if not d:
continue
#-- variables 必须与 CSV 一起存,否则丢掉一半元数据
out[d["uci_id"]] = {
"name": d["name"],
"doi": d["dataset_doi"],
"missing": d["has_missing_values"],
"missing_symbol": d["missing_values_symbol"],
"variables": d["variables"],
}
time.sleep(0.2)
print(out[53]["variables"])
第二段代码给的是"元数据先行"的最小实现。它的用途不是下载数据,而是先把字典固定下来:列名可以推,单位、缺失记号、谁是目标列推不出来。把这一步做成流程的一部分,后面换数据集版本的时候才知道自己动了什么。
附录 E:如果只记五件事
| 序号 | 记住什么 | 为什么 |
|---|---|---|
| 1 | 689 个数据集,编号至 1276,1987 年起 | 这四个数字定义了一切预期:它是小而稳定的,不是大而全的 |
| 2 | 它的价值在第二层元数据,不在第一层数据体积 | 若期待它提供统一清洗服务就会失望 |
| 3 | 统一 CC BY 4.0,义务是署名 | 许可是通用机器学习库里最宽松的一档,但不是无条件的 |
| 4 | 单数据集用其 DOI,库整体用官方给定的 citation | 官方明确区分了这两种情形,混用是常见硬伤 |
| 5 | 先看 index_col 与 recommended_data_splits 再切分 |
这两项决定会不会泄漏,比换模型重要 |
编辑说明
本文的核验时间为 2026 年 10 月 29 日。核对方式为直接访问 UCI 机器学习数据集库的首页、About 页、Citation 页、捐赠政策页与外部链接政策页,并调用 /api/datasets/list、/api/dataset?id=53、/api/dataset?id=2 两个接口,静态路径下请求了 data.csv、iris.zip 与 abalone.zip 以确认可下载性。总数 689 在首页文字与 API 返回长度两处取得一致;编号上界 1276 取自 API 返回的最大 id,两者不等的原因是编号不连续而非计数误差,这一点在 §5.6 与 FAQ 第 2 问各说明一次。未覆盖的内容包括:名为 Python 的筛选条件的确切语义、各数据集被引次数与下载量的整体情况、各学科领域的覆盖构成,以及各外部链接数据集当下的第三方可用性。这些需要全站拉取并逐条验证,本文按要求只写规模、结构、边界三类数字,凡涉及分布性聚合的一律不予给出。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- openml — 共享标签:机器学习 / 评测基准
- alma-archive — 共享标签:评测基准
- i2b2-n2c2-nlp — 共享标签:评测基准
- cblue — 共享标签:评测基准
- blurb — 共享标签:评测基准
- tus-rec — 共享标签:评测基准
- biosses — 共享标签:评测基准
- tg3k — 共享标签:评测基准
- qmugs — 共享标签:评测基准
- openpros — 共享标签:评测基准
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

