信息速览
一篇机器学习论文里最难被别人复用的部分,往往不是方法,而是那个方法被如何 evaluated:用了哪份数据、怎么切的训练与测试、哪一列是目标、指标怎么算的、那个看起来很漂亮的分数是在什么依赖版本下跑出来的。这四样东西在论文里通常挤在一段实验设置里,用半句话带过;等到第二年有人想接着做,数据链接失效、切分口径不明、库版本早已升级,同一套代码也跑不回同一个数。算法能被重写,实验不能被重写——这是机器学习长期存在但很少被正面解决的问题。
OpenML 走的不是"把文件传上去"这条路,而是"把实验本身做成一个对象"这条路。它把一次实验拆成四层:数据集(Dataset)、任务(Task)、流程(Flow)、运行(Run)。数据集是数据加元数据;任务是在数据集之上加"IQ: target 列是谁、用什么评估方案(十折交叉验证之类)、用哪些评估指标”;流程是一条可被序列化、能在特定库里重新实例化的模型管线;运行则是某条流程在某个任务上的一次完整执行结果,含逐折逐实例的预测。这四层各自有平台分配的整数 ID,彼此用 ID 互指,于是"A 用 B 的数据在 C 折上跑出了 D 这个分数"这句话第一次有了机器可读、可下载、可比对的形式。
它的取舍同样锋利。它的数据量在今天的数据平台里算小的(本次通过 REST 接口逐页枚举到 6697 个数据集),但它的运行数量是另一个量级(同一方式可枚举到 800 万次以上);它不做统一的内容清洗,也不给全站数据套一个统一许可——每个数据集的 licence 字段由上传者自己填,理论上是可以写"Public"也可以写"BSD (from scikit-learn)"的自由文本。下文按重要程度逐节拆开。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | OpenML(文档站在页面标题处写作 Open Machine Learning) |
| 官方主页 | https://www.openml.org/ |
| 官方文档站 | https://docs.openml.org/ |
| 一句话定位 | 开放机器学习平台:共享数据集、算法与实验,并把它们组织成在线可查的网络 |
| 创始人 | Joaquin Vanschoren(埃因霍温理工大学副教授),站内标注为 Founder of OpenML |
| 联合创始人 | Jan N. van Rijn(莱顿大学助理教授),站内标注为 co-founder 与多个组件的main developer |
| 治理结构 | 贡献者 → 核心贡献者(core members)→ 指导委员会(Steering Committee, SC)→ 开放机器学习基金会(Open Machine Learning Foundation) |
| 代码许可 | 全部项目代码按 BSD-3 Clause 条款开放(About 页原文) |
| 数据集数量 | REST data/list 端点枚举得到 6697 条,末条记录 did 为 47589 |
| 任务数量 | REST task/list 端点枚举得到 48892 条,边界处 task_id 为 363811 |
| 流程数量 | REST flow/list 端点枚举得到 123742 条,边界处 flow id 为 126576 |
| 运行数量 | REST run/list 端点可枚举至 800 万行以上;更深的偏移在核验当次返回网关超时,故只给下界 |
| 任务类型 | 8 类(Supervised Classification、Supervised Regression、Learning Curve、Supervised Data Stream Classification、Clustering、Machine Learning Challenge、Survival Analysis、Subgroup Discovery) |
| 评估指标 | evaluationmeasure/list 返回 71 个度量名,含 accuracy、AUC、RMSE 与多种时间/内存开销度量 |
| 数据后端 | 统一转存 Parquet,存放于 S3 对象存储,每个数据集一个桶;单数据集当前上限 200GB |
| 对外文件格式 | 历史 ARFF 下载直链(/data/v1/download/<did>/<name>.arff)与新的 parquet_url 并列提供 |
| 客户端 | Python openml 0.15.1(要求 Python ≥ 3.8)、R mlr3oml 0.12.0、Java OpenmlConnector(Maven Central)、Julia OpenML.jl |
| REST 接口形态 | https://www.openml.org/api/v1/json/<实体>/list/limit/<N>/offset/<N>,返回 JSON;旧接口无日落时间表 |
| 典型用途 | 基准评测、跨算法比对、元学习与超参重要性研究、AutoML 搜索、结果可追溯 |
§1 它要解决的具体麻烦
1.1 麻烦的本体:论文里的数字无法被继承
这就是 OpenML 开放机器学习平台要接的那个缺口:把一句"我们的模型拿了零点九三"换成一份可继承、可比对、可追溯的实验对象。
机器学习的结论高度依赖实验,而实验在传统发表形态里几乎只剩下结果表。一篇 2020 年的论文说"在某某数据上我们的模型取得 0.93",读者拿到的信息是一个浮点数;至于这是十折平均还是留出法、用的是哪一批.csv 还是清洗后的版本、随机种子是多少、.predict_proba 用了哪个 sklearn 版本,全部不在传递范围内。第二年有人想做改进,最现实的做法往往是在自己手里重跑一遍基线——而重跑出来的基线通常比论文低,于是又花一轮争论去确认到底哪里不一样。损耗发生在这里:不是算法不够好,是实验没有可继承的载体。
OpenML 的解法是把四件各自独立的东西分别对象化,并给它们编号。数据集解决"用的是哪份数据"——版本是服务器自动递增的整数字段,不是文件名里的 v2_final_final。任务解决"比的是什么"——它不是数据集的同义词,而是"数据集 + 目标列 + 评估方案 + 评估指标"的容器,因此同一份数据可以同时存在多个不同任务。流程解决"用的是什么算法"——它被定义为特定库中可序列化、可反序列化的模型或管线,记录依赖版本与全部超参。运行解决"结果从哪来"——它把预测、评分、时间戳与前述三者绑在一起。于是"A 在 B 上比 C 好"这句判断第一次有了可下载的物证。
1.2 三条常见的错误期待
第一条,期待它是"一个更大的 UCI"。它不是另一个数据仓库,尽管它确实存数据。区别在于两者的关注点不同:UCI 的价值在于人工把关后的元数据与统一许可;OpenML 的价值在于数据、任务、实验三者之间的链接。如果你的需求只是"找一份干净的表格数据",在它这里会很快撞上"每个数据集质量参差、许可逐个不同"的现实。
第二条,期待它的许可整齐划一。平台上每个数据集的 licence 字段由上传者填写,是长度上限 64 的自由文本;官方的数据结构说明书(XSD)明确写着:该字段缺失时的默认解释是"公有领域,或上传者不知道/不在乎"。也就是说,它不做统一许可担保,只提供记录位置。
第三条,期待"只要 ID 不变,结果就可完全复现"。官方文档在 Runs 概念的 Note 里自己写明:虽然平台尽力提高可复现性,但数值计算库、操作系统与硬件的变化可能让完全相同的重组结果无法复现。重建一条流还需要与之匹配的库版本——文档明示"你可能需要完全相同的库版本才能重建流"。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 一行代码取到某份经典表格数据并连同目标列元数据 | get_dataset(61) 即返回 Iris 的数据结构、目标列 class、md5 与 parquet 直链 |
够,且自带特征字典与属性语义(数值/名义) |
| 与别人在同一切分口径下比 A/B 两个模型 | 任务携带评估方案与切分,运行随之绑定该任务 | 够,这是它的核心能力 |
| 拿到别人跑过的结果,而不是自己重跑基线 | 评测结果可整体批量下载;运行含逐折预测与服务端重算的分数 | 够,且比自己重跑便宜得多 |
| 拿来训练大模型、凑语料规模 | 全站 6697 个数据集,单个上限 200GB,主体仍是中小规模表格 | 不够,它从来不是为语料规模化设计的 |
| 非表格模态(图像、音频、视频)的原始数据本体 | 支持——但不是在同一份文件里集中存放像素,而是在数据框里放文件路径列,外加一个同结构的媒体文件目录 | 可做,取文件要按路径自行搬运 |
| 一份带 DOI、可被引用的官方背书数据 | 它有 citation 与 paper_url 字段,但平台不签发 DOI |
不够,需回到原始来源自己取持久标识 |
| 直接在浏览器里完成全部建模 | 网页提供检索、下载与分析看板,模型训练在客户端完成 | 不够,它不是计算平台 |
| 上传受控或涉密数据 | 使用条款明确"不得上传敏感或保密数据" | 明确禁止,别绕 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你要给新算法找一组有历史基线的 benechmark | OpenML-CC18 给出 72 个筛选过的分类数据集与对应任务 | 用 get_suite("OpenML-CC18") 取任务清单,先对齐 evaluation 口径再谈提升 |
| 你想知道某个超参在不同数据上重不重要 | 平台上同一任务的大量运行 + 自动提取的超参 元数据,支撑参数重要性分析 | 用 list_evaluations 按任务批量取评测表,注意尽量同 execution engine 版本的数据 |
| 你在做 AutoML,需要搜索空间的先验 | 官网列出 auto-sklearn、GAMA 等工具使用它的搜索结果做 warm start | 先确定你要的是"上一次的最优配置"还是"跨数据集的默认配置" |
| 你要在自己的数据上复刻某个已知流程 | 运行可被反序列化重建为同类库对象 | 按 flow 声明的依赖版本锁环境,版本不符时按官方提示处理 |
| 你在写综述,需要证明某类方法在若干数据上普遍有效 | 平台把同一个任务上的全部运行聚合成一处 | 按 task_id 聚合,别按数据集名聚合——同名数据可能有多个任务 |
| 你想公开自己的数据集,但不想自建服务 | 一行 create_dataset(...).publish() |
先确定 licence 字段填什么,这是你唯一能对外声明的权利形态 |
1.5 一句话判断
它不是"又一处下载数据的地方",而是"把『谁在什么时候用什么配置跑出了多少分』这件事做成了一份可查询、可下载的公共账本"。
1.6 不适合谁:四条边界
不适合当作统一质量的数据源。 只要 account 就能上传,自动化管线只做格式转换与元数据计算,不做内容正确性审查。同一检索结果里相邻两条数据的采集质量可能差两个数量级。
不适合当作许可证担保人。 权利风险落在下载者身上:licence 字段只是上传者的自述,平台不提供签署环节,也不对其真实性负责。
不适合当作 bit-level 可复现的执行环境。 官方文档明确写了浮点库、操作系统与硬件都可能导致重算出不同结果,Java/文档站也未承诺版本冻结。
不适合当作私有数据的落地地点。 使用条款直接写明不得上传敏感或保密数据;目前的共享粒度只有公开与仅自己可见两档,"分享给指定小圈子"仍在建设中。
§2 数据构成与规格
2.1 四层对象与它们的编号体系
平台上所有东西都靠整数 ID 指路:数据集在网页与接口里写作 did,本来这也是 URL 短路径 /d/61 的那一段;任务同理用 /t/59;流程用 /f/18998;运行用 /r/10591758。这种「一物一整数」的设计带来一个直接后果:同一份 iris 数据并不是一个孤立文件,而是被若干任务引用,而这些任务又被若干运行引用——编号让引用关系不必靠文件名匹配。
| 层级 | 英文原名 | 平台上的定义 | 数量(本次 REST 枚举) | 谁负责生成 |
|---|---|---|---|---|
| 数据集 | Dataset | 行(instance)与列(feature)组成的自包含表,附 .csv 式的特征字典与补充说明 |
6697 | 上传者上传,服务端做一次自动分析与格式转换 |
| 任务 | Task | 数据集 + 机器学习任务类型 + 评估方案 + 评估指标 + 目标列 | 48892 | 可由网页或接口创建,也可随基准套件批量生成 |
| 流程 | Flow | 某库中可序列化/反序列化的模型或管线,含依赖与全部可设超参 | 123742 | 多由客户端在发布结果时后台自动提取上传 |
| 运行 | Run | 某条流程在某个任务上、带某一组超参的一次完整评测 | 800 万以上 | 客户端 publish() 时提交,服务端随即重算评分 |
| 集合 | Collection / Study | 任务或运行的编组,用于发布基准套件与基准研究 | 以 OpenML-CC18(id 99)为代表 | 人工编组后发布 |
需要注意的角色差异:任务是消除歧义的那一层。同一个 mnist_784 可以有"原始像素十折分类"“降到二维后聚类”“改成学习曲线分析"等多个任务。论文里说"我们在 mnist 上评测”,落到 OpenML 上必须追问是哪一个 task_id;这一句话的差异能让两个 supposedly 可比的结果完全不可比。
2.2 数据集字段字典
以 Iris(did 61)的接口返回为例,data_set_description 里的字段如下。这些字段同时由上载用的 XSD 约束,因此它既是下载时能读到的元数据,也是上传时必须照填的规格。
| 字段 | Iris 的值 | 含义 | 使用注意 |
|---|---|---|---|
id |
61 | 数据集整数 ID | 服务端生成,上传时忽略;URL 短路径 /d/61 用这个值 |
name |
iris | 数据集名 | 必须唯一,长度不超过 128,只允许字母数字与 _ - . ( ) , |
version |
1 | 服务端自动递增的版本号 | 同名再传自动 +1,不是人工编号 |
version_label |
1 | 上传者自填的版本标记 | 可写日期、哈希或任意字符串,与 version 是两套体系 |
description |
一段 Markdown 文本 | 数据集说明 | 上限 16384 字符,多数iris级的老数据集把来源与引用写在里面 |
format |
ARFF | 原始上传格式 | XSD 注释写明"目前一律小写 arff,无点号" |
creator |
R.A. Fisher | 原始采集者 | 与上传者可不是一个人,写引用时要分开 |
contributor |
— | 对本版本有贡献的人 | 例如负责重新格式化的人 |
collection_date |
1936 | 原始采集日期,由上传者填写 | 是字符串,不是标准日期类型 |
upload_date |
2014-04-06T23:23:39 | 服务端记录的上传时间 | 现行后端最早的记录集中在这一天附近 |
language |
English | 数据表示语言 | XSD 要求首字母大写 |
licence |
Public | 数据许可 | 自由文本,上限 64;缺失的默认解释是"公有领域或不在乎" |
url |
/data/v1/download/61/iris.arff |
ARFF 下载直链 | 历史快照入口,新建数据集由服务端补填 |
parquet_url |
https://data.openml.org/datasets/0000/0061/dataset_61.pq |
Parquet 直链 | 路径按 did 补零分层,可直接按需的部分列读取 |
file_id |
61 | 服务端文件编号 | 服务端统一分配的文件编号,一般无需关心 |
default_target_attribute |
class | 默认目标列 | 可被任务覆盖;多目标任务可逗号分隔多值 |
row_id_attribute |
无 | 行标识列 | 未设置时,工具会生成 0…n-1 的字符串行号,并在切分时复用它 |
md5_checksum |
ad484452702105cbf3d30f8deaba39a9 | 下载完整性校验 | 机械 ACSII 校验和,下载后应先比对 |
tag |
Botany / uci / study_1 等 | 标签列表 | 既是主题分类,也是 study_* 形式的基准归属标记 |
visibility |
public | 可见性 | 取值包含 Everyone / All my friends / Only me 等 |
status |
active | 检核状态 | in_preparation → active(verified);严重问题者被置为 deactivated |
original_data_url |
UCI 原页 | 原始出处 | 对二次搬运的数据集,这是追责与引用的唯一入口 |
paper_url |
Adelaide 电子文库链接 | 原始论文链接 | 有则建议一并引用;没有时该字段缺席 |
citation |
UCI 引用政策页 | 上传者指定的引用文本 | 平台不代生成引用格式 |
processing_date |
2020-11-20 19:02:18 | 服务端处理时间 | 与该数据集最近一次服务端处理批次有关 |
2.3 自动计算的质量度量(qualities)
只要数据集被受理,服务端会跑一遍自动分析,把结果写成一组名/值对挂在 quality 数组上。Iris 一次返回十项,正好构成"这份数据能不能用"的第一道判断材料。
| quality 名 | 含义 | 读它的意义 |
|---|---|---|
NumberOfInstances |
行数 | 决定能不能喂给你想用的模型 |
NumberOfFeatures |
列数(不含目标列) | 与 NumberOfClasses 一起构成任务规模判断 |
NumberOfClasses |
类别数 | 分类任务的基本形态 |
MajorityClassSize / MinorityClassSize |
最大/最小类的样本数 | 判断类别不平衡的粗粒度依据 |
MaxNominalAttDistinctValues |
名义型属性的最大取值数 | 决定 one-hot 后的列扩张量级 |
NumberOfNumericFeatures / NumberOfSymbolicFeatures |
数值列/符号列计数 | 决定预处理管线要怎么写 |
NumberOfMissingValues |
缺失值总数 | 平台只给计数,不给成因 |
NumberOfInstancesWithMissingValues |
含至少一个缺失值的行数 | 决定删行还是插补的第一手判断 |
注意这里的纪律:这些数是服务端算好的单值标量,可以直接引用;平台没有提供也无从推断的部分(比如某列与另一列的联合分布)不写。缺什么只能自己去看原始文件。
2.4 一次任务的结构
任务的接口返回不算复杂,含糊的地方全在 input 数组里。以 task 2(anneal 的监督分类任务)为例,task/list 返回 task_id、task_type_id、task_type(Supervised Classification)、did、name、status、format,外加一组 input:
| input 名 | task 2 的值 | 含义 |
|---|---|---|
estimation_procedure |
1 | 评估方案编号,决定划分方式(十折交叉验证等)与 repeats/folds 参数 |
evaluation_measures |
predictive_accuracy | 该任务采用的主指标 |
source_data |
2 | 所引用的 dataset did |
target_feature |
class | 目标列 |
四个字段缺一不可,而它们恰恰是论文里最容易含糊的四个点。把这四項固定下来之后,“同一个 任务上的所有运行才可以用同一把尺子量的”—这是评测可比性的物理基础,也是这个平台最难以替代的能力。
任务的 HTTP GET 形态:
https://www.openml.org/api/v1/json/task/list/limit/2/offset/0
https://www.openml.org/api/v1/json/task/59
2.5 一次运行的解剖
run/list 返回的字段极简,真正的内容在从属文件里:
| 字段 | 样例值 | 含义 |
|---|---|---|
run_id |
62 | 运行 ID,短路径 /r/62 |
task_id |
1 | 引用哪个任务 |
setup_id |
17 | 流程 + 具体超参组合的编号,同参运行共享同一 setup |
flow_id |
76 | 引用哪条流程 |
uploader |
1 | 上传者 |
upload_time |
2014-04-06 23:57:45 | 上传时间 |
error_message |
空 | 服务端处理时是否报错 |
run_details |
空 | 附加说明 |
服务端做的那一件关键事是"独立评测":文档写明,对多数任务而言,一次运行包含全部训练/测试划分上、全部实例上的预测与类别置信度;一旦上传,服务端就用一整套评估指标自动重算,并把本地算出的指标与耗时一并存档。这就是为什么同一 task 的运行可以横向比——分数不是按 uploader 各自的脚本算的。更进一步,文档还说新指标可以之后加入评估引擎,再对历史运行补算。
2.6 格式:ARFF 的旧入口与 Parquet 的新主体
老入口是没有退休的。把 did 填进去就能拿到 ARFF 快照:
https://openml.org/data/v1/download/61/iris.arff #-- ARFF 快照,历史以来的默认直链
https://data.openml.org/datasets/0000/0061/dataset_61.pq #-- Parquet 主体,按 did 补零分层
文档站的说法是:OpenML 会把数据集转换为基于 Parquet 的统一格式,存放在 S3 兼容的对象存储里,一个数据集一个桶;单数据集当前上限 200GB。用户通常感知不到这件事,因为客户端负责把 Parquet 转成目标语言的原生数据结构。非表格模态(图像、音频)不在表里塞二进制,而是在数据框里放指向同目录媒体文件的路径列。换句话说,Parquet 是存储形态,ARFF 是兼容形态,你的语言里的数据结构是交付形态,三者由客户端串起来。
import openml
#-- 三种入口都能到手:ID、名字、基准套件
ds = openml.datasets.get_dataset(61)
X, y, categorical_indicator, attribute_names = ds.get_data(target="class")
task = openml.tasks.get_task(59)
train_idx, test_idx = task.get_train_test_split_indices(fold=0)
suite = openml.study.get_suite("OpenML-CC18")
print(len(suite.tasks), ds.dataset_id, ds.md5_checksum)
§3 它是谁的成果:谁在往里放东西
3.1 贡献者不是"一群匿名网友",而是绑定了 ID 的上传者
每条记录都带 uploader 字段——一个用户整数 ID。Iris 这样的数据集是团队早期导入的(did 61 的 upload_date 是 2014-04-06),而许多新数据集背后是具体课题组。这一点带来两条有用的推论:其一,同一 uploader 的一批数据往往共享命名风格与说明习惯,检索时按 uploader 过滤比按关键词过滤更稳;其二,credit 是明确的,你要找某份数据的原作者,看 creator 字段而不是 uploader。
| 角色 | 字段位置 | 谁 | 意味着什么 |
|---|---|---|---|
| 创始人 | About 页署名 | Joaquin Vanschoren(埃因霍温理工大学) | 项目发起人,兼 superconductor 兼 strategy 责任人 |
| 联合创始人 | About 页署名 | Jan N. van Rijn(莱顿大学) | 平台多个自动驾驶组件与插件的main developer |
| 核心贡献者 | 同上 | Bernd Bischl、Matthias Feurer、Giuseppe Casalicchio、Pieter Gijsbers、Andreas Mueller 等 | R 接口、Python API、算法设施的主要维护者 |
creator |
元数据字段 | 原始数据的采集者 | 可能是几十年前的个人或机构,与上传者无关 |
contributor |
元数据字段 | 对本版本有贡献的人 | 重新格式化、修错的人 |
uploader |
元数据字段 | 把数据传到平台上的账号 ID | 你对数据有疑问时的第一联系人 |
3.2 时间线:一条被论文标记的 Roadmap
| 时间 | 事件 | 出处 |
|---|---|---|
| 1936 | Iris 的原始采集年份(这莱 datasets 的 collection_date 可以早于平台本身几十年) |
did 61 的 collection_date 字段 |
| 2013 | 首篇系统论文《OpenML: Networked Science in Machine Learning》发表于 SIGKDD Explorations 15(2):49-60 | 官方 Terms 页引用的 doi:10.1145/2641190.2641198 |
| 2014-04-06 | 现行后端里可见的最早记录:Iris 的 upload_date 与最早的 run 记录的 upload_time 都落在这一天 |
REST data/61、run/list 首条 |
| 2017 | R 接口论文发表:OpenML: An R Package to Connect to the Machine Learning Platform OpenML,Computational Statistics | 官方 Terms 页引用,doi:10.1007/s00180-017-0742-2 |
| 2019-02-21T18:47:13 | OpenML-CC18 基准套件(study id 99)创建 | REST study/99 的 creation_date |
| 2019 / 2021 | 基准套件论文:arXiv:1708.03731v2 与 NeurIPS 2021 版本 | 套件描述中的引用段;Terms 页列出 NeurIPS 2021 |
| 2021 | OpenML-Python 论文发表:JMLR 22(100):1-5 | 官方 Terms 页与 openml-python 仓库 README |
| 2024-10 | 新版 Python 服务端 REST API 文档上线,明确"旧接口无计划日落时间" | https://docs.openml.org/apiv2/ |
| 2025 | 十年综述《OpenML: Insights from 10 years and more than a thousand papers》,Patterns 6(7):101317 | 官方 Terms 页引用 |
3.3 数据从哪里来:三条进料路径
| 路径 | 典型样子 | 元数据留下的痕迹 |
|---|---|---|
| 面向 Rather than 经典数据集的早期批量导入 | iris、anneal、kr-vs-kp 等 UCI 常客 | tag 里带 uci;original_data_url 指向原始可能一个 UCI 页;creator 是几十年前的原作者 |
| 研究者上传自己做的数据 | 研究者自己采集的实验数据、业务数据 | upload_date 较新,description 通常是 drawn Markdown 的亲自写法 |
| 机器学习库「顺手」把数据放上来 | 深度学习 fashion datasets(Fashion-MNIST、SVHN、CIFAR_10 等) | 同一批 uploader 集中上传(did 40923 以后的一段连续区块),各自带 opensml 风格标签 |
这里有一个容易忽略的结论:这些路径混在同一个检索结果里。平台上没有一个字段写着"这是二手数据",只有 original_data_url 与 tag 间接提示。如果你要做跨数据集的元分析,二手与一手混用会在标注习惯上带来系统性偏差。
3.4 层次:不要指望所有数据都在服务器上
data/61 的 url 字段是服务端自己的下载链接,而 XSD 对 url 的定义是"指向实际数据文件的有效 URL,可以在 OpenML 服务器上,也可以在另一个数据集仓库上"。也就是说,登记与托管不是一回事:在平台允许的登记模式下,数据本体可以在别处。配合 CONCEPT texto 层到帐をお願い当做金句用:同一份名字背后至少有"平台托管 / 外部引用 / 二手搬运"三种可能性,url、parquet_url、original_data_url 三个字段就是区分它们的唯一线索。
§4 它最独特的东西
4.1 运行(Run)是一等公民
绝大多数数据平台止步于数据;OpenML 多走一步,把"某次评测"当成可以检索、可以下载、可以引用的对象。一次运行记录的不是一句结论,而是可重放的材料:某条流程在某个任务上的配置是什么、服务端独立重算的分数是多少、逐折逐实例的预测在哪。这让三件事第一次变得可操作:不必自己重跑基线;可以检查自己的实现对不对得上别人公布的逐实例预测;可以在别人的超参分布上做统计分析。
4.2 任务(Task)消掉了"同名不同义"
两个都说"我在 adult 上做了分类"的研究,可能压根不是在回答同一问题:一个用的是留出法,一个用的是十折;一个目标列是收入是否超过 50K,一个是原始收入区间。任务的四元 input(评估方案、评估指标、源数据、目标列)把这些差异显式化。这也是为什么不推荐按数据集名聚合评测结果——聚合键应当是 task_id。
4.3 基准套件:以 OpenML-CC18 为样本看它的策展标准
OpenML-CC18 不是"一堆数据的最小公共倍数",它带着一张写死的入选清单:
| 属性 | 数值 / 内容 |
|---|---|
| study id / 别名 | 99 / OpenML-CC18 |
| 名称 | OpenML-CC18 Curated Classification benchmark |
| 主实体类型 | task |
| 规模 | 72 个数据集、72 个任务 |
| 创建时间 | 2019-02-21T18:47:13 |
| 可见性 / 状态 | public / active |
| 技术要求 | 稠密数据上的分类任务、观测独立 |
| 类别约束 | 类别数 ≥ 2;每类至少 20 个观测;少数类与多数类之比需超过 5% |
| 规模约束 | 观测数在 500 到 100000 之间;one-hot 编码后特征数小于 5000 |
| 排除项 | 人工合成数据;更大数据集的子集;其他数据集的二值化版本;单特征或简单决策树就能完美预测的数据 |
| 其他要求 | 有来源或参考文献可用 |
| 引用要求 | 套件描述内指定 arXiv:1708.03731v2(NeurIPS 2021 版本见 Terms 页) |
这张表值得读完而不是跳过:它说明"策展"在 OpenML 里是可用机器读取的条件清单,而不是编辑的一句话背书。欲想建自己的套件时,可以直接沿用这套标准——这也是这一平台之上能长出大量 AutoML 基准的原因。
4.4 把"别人的实验"变成自己的搜索空间
官网把自己的定位写得很直白:站在巨人的肩上(Stand on the shoulders of giants),并对 AutoML 工具友好——列举包含 auto-sklearn、SageMaker AutoML、Azure AutoML、GAMA。当足够多的运行被结构化地攒在同一个任务空间里,“哪个超参重要”(parameter importance)、“默认情况下该怎么设”(symbolic defaults)这类问题就不再是拍脑袋,而是可以用历史数据回答的统计问题。这是它与普通数据平台的根本分野:普通平台给你训练样本,OpenML 还给你关于算法本身的样本。
4.5 边界条件:复现的极限在哪
这样一套结构有一个明确的失效点,官方把它写在 Runs 概念的 Note 里:即使尽力最大化可复现性,数值计算库、操作系统与硬件的变化也可能让结果无法完全一致;重建 flow 还往往需要完全相同的库版本。把它当成可逐位对齐的执行环境是不行的,当成统一评测口径的公证处才是恰当的。用它比较高下可以,用它逐比特对齐不行。
§5 怎么拿到
5.1 三条入口与其代价
| 入口 | 适合谁 | 能做什么 | 做不到什么 |
|---|---|---|---|
网页检索(/search?type=data 等) |
先看一眼的人 | 浏览、按属性过滤、看自动生成的分析看板、导出 Croissant/JSON/XML 描述 | 批量取数、自动化跑实验 |
| REST API | 需要脚本的人 | 按 limit/offset 分页枚举全部数据集/任务/流程/运行,按 ID 取单个对象的完整描述 |
需要自己解析返回的 JSON 结构;深层分页会触发网关超时 |
| 客户端(Python 等) | 要跑实验的人 | 一行取到语言原生数据结构;跑完直接把结果发布到服务端,由服务端统一重算评分 | 需要装包并配置 API key(上传时) |
网页上的数据集页面除了常规信息,还能直接下载 Croissant(ML Commons 的数据集元数据描述规范)版本的元数据 JSON;这一点对要把 OpenML 数据接入外部 ML 流水线的团队很实用——元数据不必再从 HTML 抓。
5.2 REST 接口的 URL 语法
接口沿用了"资源 + 过滤段"的路径式写法,不需要请求体,直接 GET 即可:
https://www.openml.org/api/v1/json/data/list/limit/2/offset/0 #-- 数据集列表,返回含 quality 数组
https://www.openml.org/api/v1/json/data/61 #-- 单个数据集的完整描述
https://www.openml.org/api/v1/json/data/features/61 #-- 特征(列)级字典
https://www.openml.org/api/v1/json/data/qualities/61 #-- 该数据集的质量度量
https://www.openml.org/api/v1/json/task/list/limit/2/offset/0 #-- 任务列表
https://www.openml.org/api/v1/json/tasktype/list #-- 8 类任务类型的定义
https://www.openml.org/api/v1/json/flow/list/limit/1/offset/0 #-- 流程列表
https://www.openml.org/api/v1/json/run/list/limit/1/offset/0 #-- 运行列表
https://www.openml.org/api/v1/json/evaluationmeasure/list #-- 71 个可用评估度量名
limit 与 offset 的组合就是分页:把它当作游标用,配合返回体为空(或错误码 “No results”)作为终止条件即可从头到尾枚举。需要注意的是 deep offset 的代价——服务端要跳过前面所有行,偏移到几百万量级时开始出现超时,因此"先按 limit 分批取、别一次拉到穿透",这是实际使用时必须接受的限制。
5.3 Python 客户端的最短路径
安装与第一次取数:
python -m pip install openml #-- PyPI 当前版本 0.15.1,要求 Python ≥ 3.8
import openml
#-- 1) 按名字或 ID 取数;返回对象自带特征语义与目标列信息
ds = openml.datasets.get_dataset("credit-g") #-- 也可用 get_dataset(31)
X, y, categorical_indicator, attribute_names = ds.get_data(target="class")
#-- 2) 取任务,拿到与所有人完全一致的切分
task = openml.tasks.get_task(31)
train_idx, test_idx = task.get_train_test_split_indices(fold=0)
#-- 3) 跑模型并发布;服务端会独立重算各项指标
from sklearn import pipeline, impute, tree
clf = pipeline.Pipeline(steps=[("imputer", impute.SimpleImputer()),
("estimator", tree.DecisionTreeClassifier())])
run = openml.runs.run_model_on_task(clf, task)
run.publish() #-- 需要 ~/.openml/config 里配好 apikey
#-- 4) 批量拉 task-level 评测表做横向比较
#-- evaluations 的筛选项支持 function(度量名)与 tasks(任务 ID 列表)
df = openml.evaluations.list_evaluations(function="predictive_accuracy",
task=[31], output_format="dataframe")
5.4 其他语言的客户端
| 语言 | 客户端 | 获取方式 | 备注 |
|---|---|---|---|
| Python | OpenML-Python(openml) |
PyPI,pip install openml | 0.15.1;当前仓库 README 标注支持 Python 3.10–3.14 |
| R | mlr3oml |
CRAN | 版本 0.12.0;list_oml_data() 可按特征数、行数、类别数筛选 |
| Java | OpenML Java API(OpenmlConnector) |
Maven Central 上的 jar 包 | new OpenmlConnector("api_key") 后调用 dataGet / dataUpload 等 |
| Julia | OpenML.jl | Julia 的包管理器 | OpenML.list_datasets(output_format=DataFrame) |
| 网页 | 站内 /search?type=data 等检索页 |
直接访问 | 可导出 Croissant / JSON / XML 描述 |
5.5 认证、缓存与本地落盘
下载不需要账号,这一点写在 Concepts/Authentication 页的开头:想要公开数据不需要建账号。上传必须注册并取 API key,落到 ~/.openml/config 里一行 apikey=MYKEY,且该文件必须在导入 openml 模块之前就绪。下载的全部对象会在本地做缓存,默认目录是 ~/.openml/cache,可以用 openml.config.cache_directory 改到别处。若要换 CPU/GPU 机器的 scratch 目录或减少重复下载,这是第一个该调的开关。
5.6 五个坑
第一个坑:把数据名当主键。 名字不保证唯一(同名会被后来者抢占或被服务端加后标区分),§5.2 接口返回的 did 才是稳定锚点。
第二个坑:默认搜不到全部数据。 检索默认只返回 active 状态的数据集;in_preparation 与 deactivated 的数据要靠显式指定 status 才能拿到。只扫默认视图的脚本会系统性少掉一部分对象。
第三个坑:把 quality 数当清洗结果。 NumberOfMissingValues 只是计数,既不说明缺失机制,也不说明缺失在哪几列,更不帮你处理。处理策略要自己定。
第四个坑:忽略 row_id_attribute。 若数据集设了行标识列而建模时没排除它,模型会直接学到行号。按 XSD 的写法:未设置该字段时由工具生成 0 到 n-1 的字符串行号并在切分时复用,这意味着同一行的标识在不同任务里是稳定的。
第五个坑:引用别人的 flow 却忘记锁版本。 重建 flow 依赖原始库版本,文档明示"你可能需要完全相同的库版本"。跨环境复现时先按 flow 声明的依赖锁好环境,否则差异来源说不清。
§6 与库内其他资源的关系
6.1 关系图谱
| 站内资源 | 与 OpenML 的关系 | 什么情况下先去找它 |
|---|---|---|
| UCI 机器学习数据集库 | OpenML 早期内容的来源之一;两者是两种治理哲学:UCI 人工把关 + 统一 CC BY 4.0,OpenML 自动化接管 + 逐集自填许可 | 你需要统一许可与人工整理过的小而稳的数据时 |
| GLUE | 同样是"任务集合"形态,但 GLUE 只服务于自然语言理解评测,且不含历史运行结果 | 你做 NLU 模型评测,且要看排行榜而非历史配置时 |
| COCO | 大型图像标注数据的代表;与 OpenML 的非表格模态(路径列引用)形成对照 | 需要带密集标注的图像数据本体时 |
| Common Voice | 大体量语音语料的代表,自有许可版本体系 | 需要原始音频与说话人 metadata 时 |
| Dryad | 论文附录数据的长期保存地,与 CV 领域的 years scale 相反 | 追某篇论文原始数据包时 |
| HealthData.gov | 政府开放数据门户,元数据口径是政务口径 | 找美国联邦公共卫生统计时 |
| OpenOximetry | 领域专库的例子:把一种信号做深做透 | 明确需要血氧波形与对照测量时 |
| mcPHASES | 小而深的多模态生理 longitudinal 数据,与 OpenML 的表格主导形成对照 | 要逐日逐人的激素与 wearable signal 时 |
| Kepler | 单一观测计划的长序列,代表"一大份持续数据"的思路 | 要长时间基线的光变曲线时 |
| SDSS DR20 | 巡天光谱档案,数据维度远超这里的常见规模 | 要 spectroscopic redshift survey 数据时 |
6.2 检索路径
先在 OpenML 里做两件事才算完成检索:一是用 /data/list 的过滤条件把候选缩到几十条(按 NumberOfInstances、NumberOfFeatures、NumberOfClasses 之类的服务端已算好的标量最有效);二是回到单个候选,核对三个字段——original_data_url、status、licence。第一个告诉你数据的原始出处,第二个说明它有没有被维护者自己标记为停用,第三个决定这条数据能不能进你的产品线。跳过这三步就直接下载的人,往往在第三步才发现问题。
6.3 分工判据
判据只有一句:你要的是"可比的分数",还是"可靠的数据"。 要可比分数,先用 OpenML——它把评估方案、切分、指标服务端化,这是别处买不到的东西;要可靠数据,先去找领域专库或 UCI——它们把人工审查当作主要工序。两者可以同时使用:在 OpenML 里选定任务口径,再回到原始来源取原始数据与正式许可文本。
§7 质量评估与局限性
7.0 前置校正:评估对象不是"一份数据"
把它当成一份数据集来评审会评错方向。它是在数据之上架起来的一层登记与评测设施:单纯托管文件的平台并不稀缺,真正稀缺的是「这四层对象是否完整、评测口径是否可信」。因此下面五维全部针对平台本身,而不是某一个具体数据集。
7.1 五维评分(相对同类开放资源的定性判断)
| 维度 | 判断 | 依据 |
|---|---|---|
| 规模(横向) | 中 | 6697 个数据集远少于单一大语料的体量,却多于多数领域专库的覆盖面 |
| 结构(机器可读性) | 强 | 四层对象 + 8 类任务 + 71 个评估度量,全部配套 REST 端点 |
| 边界(权利清晰度) | 弱 | licence 由上传者自填,缺失即默认为"公有领域或不在乎",无统一承诺 |
| 元数据一致性 | 强于人工库、弱于专库 | 数量/类型/缺失等标量自动算;语义依赖自由文本 description |
| 可持续性 | 中 | 有基金会与指导委员会的公开治理结构;全部代码 BSD-3;旧 API 无日落时间表 |
7.2 元数据有两层,别混为一谈
| 层 | 谁写的 | 可信度 | 例子 |
|---|---|---|---|
| 服务端自动算出的 quality | 平台的服务端自动分析管线 | 同口径、可大规模复用 | NumberOfInstances、NumberOfClasses、NumberOfMissingValues |
| 上传者填写的 description / licence /creator | 人 | 取决于认真程度 | licence = “Public”、“BSD (from scikit-learn)” 这类自述 |
| 服务端流水 (upload_date / processing_date / md5) | 平台 | 客观但不评价质量 | 只说明时间与完整性,不说明内容对错 |
这一区分决定了用法:能写在方法节里作为筛选依据的,只有第一层;第二层必须回到 original_data_url 找到出处核实后,才能写进对外结论。
7.3 可枚举的偏差来源
第一,任务口径造成的集中:同一个数据集可以有多个任务,但真正被反复使用的往往是创建早、切分默认的那个任务,而晚近新建的任务在运行数上从零开始,数量分布并不均匀。
第二,来源集中:早期内容是 UCI 等来源的批量导入,这些来源本身就是教科书式数据集的集合,因此经典小表被系统性偏重。
第三,模态偏差:虽然支持图像/音频,但非表格数据的本体以文件路径列引用,实际下载链路比纯表格麻烦,因此实际被使用的仍然以表格为主。
第四,状态漏斗:默认只返回 active,大量 in_preparation 与 deactivated 的对象不在默认视野内——凡声称"把平台上全部 N 条都跑了一遍"的说法,都要注明自己用的是默认视图还是全部状态。
7.4 外部验证
平台的外部回应来自两条线:其一是官方引用的十年综述标题所述"超过一千篇论文"量级的外界使用;其二是 AutoML 生态直接使用它——官网列出 auto-sklearn、SageMaker AutoML、Azure AutoML、GAMA 均以它为搜索或评测来源。这证明的是"被广泛当作基础设施使用",不是"其上每一份数据都被第三方验过"。
7.5 它为什么会继续存在
三个结构性的理由。第一,替代品少:把"度量 + 切分 + 预测 + 配置"四件事一起标准化成对象的地方并不多。第二,治理是公开的:贡献者→核心贡献者→指导委员会→开放机器学习基金会的层级写在官网与 Governance 文档里,代码许可也明确。第三,沉淀成本高:十余年积累下来的运行记录一旦迁移,成本高于继续维护,这是最现实也最朴素的理由。
§8 生态位与历史
8.1 沿革:从一篇立意 paper 到一层基础设施
| 阶段 | 平台形态 | 标志 |
|---|---|---|
| 2013 | 概念与原型 | 《OpenML: Networked Science in Machine Learning》发表于 SIGKDD Explorations 15(2):49-60 |
| 2014 | 现行后端开始沉淀数据与实验 | Iris 的 upload_date 与最早一批 run 记录都落在 2014-04-06 |
| 2015 | 任务类型定型 | JMLR Workshop 论文《Taking machine learning research online with OpenML》记录服务端已支持分类、回归、聚类、数据流分类、学习曲线与生存分析 |
| 2017 | R 语言接口成型 | OpenML R 包论文,Computational Statistics |
| 2019 | 基准套件化 | OpenML-CC18 编选成型的任务包;套件论文 arXiv:1708.03731v2 |
| 2021 | Python 接口成型 | OpenML-Python 论文,JMLR 22(100):1-5 |
| 2024 | 存储换轨、服务端重写 | 文档说明数据统一转 Parquet 并存放 S3 对象存储;新版 Python 服务端 REST 文档上线 |
| 2025 | 十年节点 | 《Insights from 10 years and more than a thousand papers》,Patterns 6(7):101317 |
这条时间线有一个清晰的方向:先把词汇表立起来(数据集→任务→流程→运行),再把便利做上去(Parquet、S3、新 API、更多客户端)。 顺序很重要——先有统一的评测口径,才有后来跨人跨任务的运行可比性;如果先做大存储,今天只会是又一个文件服务器。
8.2 与挑战赛的关系
平台上专门有一类任务叫 Machine Learning Challenge,说明它并不回避"竞赛"这种形式,但两者逻辑相反:传统竞赛是一次性、有截止时间、以排行榜为终点的封闭事件;OpenML 的任务没有截止日,别人今天提交的新运行仍然会加到你昨天看过的那条 Leaderboard 上。这也是官方文档把任务称作"实时协作的基准"的原因——同一份任务上的榜单不是终点排名,而是持续累积的证据。
8.3 生态位:夹在三种角色之间
| 对比对象 | 它的核心卖点 | OpenML 相对位置 |
|---|---|---|
| 通用数据仓库(UCI 等) | 人工把关、统一许可、详细的变量表 | OpenML 用自动化接管元数据,但把评审判断留给使用者自己 |
| 大型 hosting 平台与竞赛站点 | 体量、算力、社区活跃度 | OpenML 不提供计算,也不做虚拟货币扶贫排名,赢在 machine-readable 的实验语义 |
| 领域专库(影像/语音/天文等) | 采集与标注深度 | OpenML 不做采集,只提供一层标准化的交接格式 |
| 论文附录仓储(Dryad 等) | 与单篇论文的绑定与长期保存 | OpenML 与论文是标签式弱关联,不对数据本体作长期保存承诺 |
8.4 谁在用
四类使用者最为常见:想省掉基线重跑的算法研究者;做 AutoML、需要搜索空间先验的工程团队;做元学习与参数重要性分析、需要大量历史结果作为样本的研究者;以及需要同一份数据配固定任务做可复现作业的教学场景。他们的共同点是:要的不是「再一份数据」,而是「别人做过的实验记录」。
§9 使用指引
9.1 三种角色的最短路径
| 角色 | 该做的第一件事 | 该看的字段 | 该躲开的坑 |
|---|---|---|---|
| 算法研究者 | 找与自己任务同类型的 task_id,直接按任务跑 | task_type_id、estimation_procedure、evaluation_measures |
按数据集名而非 task_id 聚合,导致评测口径混淆 |
| AutoML / 工具开发者 | 用 get_suite("OpenML-CC18") 拿到任务清单做批量评测 |
套件 data_id 与 task_id 清单 |
忽略 NumberOfInstances 上限与 one-hot 后列数,导致内存爆掉 |
| 数据 Owner | 用 create_dataset(...).publish() 发布,并认真填 licence 与 citation |
licence、visibility、original_data_url |
上传含敏感字段的数据(条款明令禁止) |
9.2 最短流程
第一步,pip install openml;第二步,用 openml.datasets.list_datasets(output_format="dataframe") 或在网页上按服务端已算好的规模标量筛出候选;第三步,取对应 task 并用 get_train_test_split_indices 拿到与别人一致的切分;第四步,跑模型、run.publish();第五步,用 list_evaluations 把自己的分数跟同一任务上的历史结果放在一起看。这五步里最容易省错的是第三步——自己用 sklearn 的 train_test_split 随手切一把,等于放弃了全平台唯一不可替代的那部分价值。
9.3 引用方式
官方 Terms 页把引用拆成三档,写论文时应该照用:
| 场景 | 引用对象 | 文献 |
|---|---|---|
| 用了整个平台或大量其结果 | OpenML 整体 | Bischl 等,《OpenML: Insights from 10 years and more than a thousand papers》,Patterns 6(7):101317, 2025 |
| 用了 OpenML-Python | Python 客户端 | Feurer 等,《OpenML-Python: an extensible Python API for OpenML》,JMLR 22(100):1-5, 2021 |
| 用了 R 接口 | R 客户端 | Casalicchio 等,《OpenML: An R Package to Connect to the Machine Learning Platform OpenML》,Computational Statistics 32(3):1-15, 2017 |
| 用了某个基准套件 | OpenML-CC18 | Bischl 等,《OpenML Benchmarking Suites》,arXiv:1708.03731v2(NeurIPS 2021 版本见 Terms 页) |
| 用了具体某份数据 | 该数据集自身 | 读它的 citation 与 paper_url 字段,按作者要求的格式写 |
平台上单个数据集不签发 DOI,这是与 UCI 机器学习数据集库 不同的地方:那里每个入库数据集都有 DOI,这里只有作者自填的引用文本。论文里需要引用时,按该数据集的 citation 字段书写,并在必要时回到 original_data_url 核对原始出处。
§10 AI 使用声明
| 项目 | 说明 |
|---|---|
| 文本生成 | 全文由 AI 起草,依据公开网页与官方 REST 接口返回整理,未经人工逐句润色 |
| 数字来源 | 规模类数字来自官方 REST 接口在核验时刻(2026-10-29)的分页枚举结果;治理与许可表述来自官网 About / Terms 页与 docs.openml.org 文档原文 |
| 文件核验 | 通过命令行请求 https://www.openml.org/api/v1/json/... 各接口核验;Iris(did 61)的元数据取自 data/61 返回 |
| 不一致说明 | 官网自述为"数以千计的数据集"与"数以百万计的实验",与此处枚举到的 6697 个数据集、800 万次以上运行在量级上一致;前者是官方声称口径,后者是接口分页枚举口径,本文以后者为准 |
| 论文信息 | 所有被引文献见 §9.3,均取自官方 Terms 页与套件描述原文 |
| 未核验内容 | 全部学科覆盖构成、各任务类型的运行数量分布、每条 flow 当前是否仍可在主流版本中重建、deactivated 数据的具体清单 |
| 图像 | 封面图为 AI 生成的示意图,非官方素材,不含任何官方标识 |
| 免责声明 | 本文不构成法律意见;数据再利用的权利边界以每个数据集自身 licence 字段与原始来源的正式声明为准 |
常见误读
| 说法 | 实际 | 证据 |
|---|---|---|
| 「它是一个 Kaggle 那样的竞赛平台」 | 任务是协作式基准,没有截止日、没有奖金,也没有托管算力 | 官方文档把任务描述为实时协作的基准,八类任务类型中有一类名为 Machine Learning Challenge |
| 「它只是一个下载站点」 | 它有四类客户端与一套 REST 接口,网页只是入口之一 | /apis 页列举 Python / R / Java / Julia 客户端 |
| 「平台上的数据都被审查过」 | 自动分析只覆盖格式与标量统计,内容正确性归上传者 | 数据集 XSD 中 creator、licence 都是自由文本;Terms 页写明提交者自负其责 |
| 「所有数据都是 CC BY 4.0」 | licence 由上传者自填,常见值含 Public、BSD (from scikit-learn) |
data/61 返回 licence 为 Public;XSD 注明缺省解释为公有领域或不在乎 |
| 「默认检索看到的就是全部」 | 默认只返回已核验状态;待处理与停用对象要显式指定状态 | 文档站 Dataset status 小节 |
| 「有 ID 就等于结果可完美复现」 | 数值库、操作系统与硬件的差异仍可能造成偏差 | Concepts/Runs 页的 Note |
| 「重建一条 flow 不需要原环境」 | 文档写明可能需要完全相同的库版本 | Concepts/Flows 页的 Note |
| 「每个数据集都有 Parquet 直链」 | Parquet 是后端形态,ARFF 直链并存,图像类数据靠路径列引用 | data/61 同时返回 url 与 parquet_url |
| 「这里的数据够训练大模型」 | 单个上限 200GB,主体是中小规模表格 | 文档站 Technical specifications |
| 「换个 Average precision friendly 语言也能对齐别人的分数」 | 对齐的前提是复用同一个 task_id 与同一套估计规程 | task input 四元组:源数据 / 目标列 / 评估方案 / 评估指标 |
FAQ
Q1:OpenML 到底是什么,一句话怎么说?
它是把「数据集—任务—流程—运行」四层都做成机器可读对象的开放机器学习平台。论文里一句话带过的那个分数,在这里被拆成四个可下载的对象:数据集 d/61、任务 t/59、流程 f/18998、运行 r/10591758。创办人是埃因霍温理工大学的 Joaquin Vanschoren,联合创始人包括莱顿大学的 Jan N. van Rijn,全部代码按 BSD-3 条款开放。
Q2:为什么接口只枚举出 6697 个数据集,而最大编号是 47589?
did 是单调分配的整数,退役、删除与预留都会留下空号,核验时刻实际存在的记录是 6697 条。结论很简单:数量以 data/list 分页枚举的返回条数为准,不要用编号上界推算存量——两者相差一个数量级并不奇怪。
Q3:能不能商用?
平台层面不存在统一商业许可,每个数据集的 licence 字段才是权利人自己的声明,而且存在填 Public、填 BSD (from scikit-learn)、留空三种情况。因此「平台让我商用」这种推论不成立;要考虑商用,就得逐个数据集读 licence,必要时回到 original_data_url 找正式声明。这与 UCI 那种全库统一 CC BY 4.0 的做法是两种制度。
Q4:怎么省掉「把别人的基线重跑一遍」这件事?
这恰好是它最擅长的场景。取你关心的 task_id,用 openml.evaluations.list_evaluations 一次拉下该任务的历史评测表即可;这些分数由服务端用统一实现重算,比各自在本地跑出来的数字更适合横向比较。前提是接受 FAQ 第一条的前提差异:比较要在同一任务内做,跨图书馆版本的差异仍然可能存在。
Q5:我把自己的数据传上去会发生什么?
服务端做格式转换与自动分析,补上一组 quality 标量,先进入 in_preparation,通过后转为 active;若发现严重问题会被置为 deactivated。上传时要认真填 licence、citation 与 default_target_attribute,后续虽可在网页改,但下游往往已经引用了旧值。另外,条款禁止上传敏感或保密数据。
术语表
| 术语 | 解释 |
|---|---|
| OpenML | 开放机器学习平台,文档站标题写作 Open Machine Learning |
| 数据集(Dataset) | 由行(instance)与列(feature)组成的自包含表,附标准化元数据 |
| 实例(instance) | 表中的一行,即一个观测单位 |
| 任务(Task) | 数据集 + 任务类型 + 评估方案 + 评估指标 + 目标列构成的容器 |
| 流程(Flow) | 可序列化、可在特定库中重建的模型或管线,含依赖版本与全部可设超参 |
| 运行(Run) | 某流程在某任务上的一次完整评测,含服务端重算的分数与逐预测结果 |
| 集合 / 基准套件(Collection / Suite) | 一组任务的公开编组,如 OpenML-CC18 |
| 基准研究(Study) | 一组运行的公开编组,用于一次性发布大规模结果 |
| estimation_procedure | 估计规程,决定训练与测试如何划分与重复,例如十折交叉验证 |
| evaluation measure | 评估度量,接口返回 71 个可用名称 |
| quality | 服务端自动算出的标量特征值,如 NumberOfInstances |
| ARFF | WEKA 生态的传统表格格式,仍是数据集的下载形态之一 |
| Parquet | 列式存储格式,平台的后端统一形态,存放于 S3 兼容对象存储 |
| Croissant | ML Commons 的数据集元数据描述规范,网页可导出该格式 JSON |
| apikey | 上传所需的身份凭证,写在 ~/.openml/config 中 |
| BSD-3 Clause | 平台全部代码采用的开源许可条款 |
| Open Machine Learning Foundation | 开放机器学习基金会,项目运行的支撑主体 |
| status | 对象状态:待处理 / 已核验 / 已停用 |
附录 A:核心数字核对表
| 项 | 值 | 出处 | 层级 |
|---|---|---|---|
| 官方全称 | OpenML / Open Machine Learning | 官网首页与文档站 | 官方页面 |
| 创始人 | Joaquin Vanschoren(埃因霍温理工大学) | About 页署名 | 官方页面 |
| 联合创始人 | Jan N. van Rijn(莱顿大学) | About 页署名 | 官方页面 |
| 治理结构 | 贡献者→核心贡献者→指导委员会→开放机器学习基金会 | About 页与 Governance 文档 | 官方页面 |
| 代码许可 | BSD-3 Clause | About 页原文 | 官方页面 |
| 数据集数量 | 6697(边界 did 为 47589) | data/list 分页枚举 |
官方接口 |
| 任务数量 | 48892(边界 task_id 为 363811) | task/list 分页枚举 |
官方接口 |
| 流程数量 | 123742(边界 id 为 126576) | flow/list 分页枚举 |
官方接口 |
| 运行数量 | 800 万以上(下界,更深处请求超时) | run/list 分页枚举 |
官方接口 |
| 任务类型数 | 8 | tasktype/list 返回 |
官方接口 |
| 评估度量数 | 71 | evaluationmeasure/list 返回 |
官方接口 |
| Iris 的 did 与目标列 | 61 / class | data/61 返回 |
官方接口 |
| Iris 的规模 | 150 行、4 个特征列、3 个类别 | data/list 中 quality 数组 |
官方接口 |
| Iris 的上传时间与原始采集年份 | 2014-04-06T23:23:39 / 1936 | data/61 的 upload_date 与 collection_date |
官方接口 |
| 单个数据集上限 | 200GB | 文档站 Technical specifications | 官方页面 |
| OpenML-CC18 编号与别名 | 99 / OpenML-CC18 | study/99 返回 |
官方接口 |
| OpenML-CC18 规模 | 72 个数据集、72 个任务 | study/99 的 data_id 与 task_id 数组长度 |
官方接口 |
| OpenML-CC18 创建时间 | 2019-02-21T18:47:13 | study/99 的 creation_date |
官方接口 |
| Python 客户端版本 | openml 0.15.1,要求 Python ≥ 3.8 | PyPI 元数据 | 官方文件 |
| R 客户端版本 | mlr3oml 0.12.0 | CRAN 元数据 | 官方文件 |
| 首篇论文 | SIGKDD Explorations 15(2):49-60 | Terms 页引用的 doi:10.1145/2641190.2641198 | 官方页面 |
| 十年综述 | Patterns 6(7):101317 | Terms 页引用 | 官方页面 |
附录 B:数字的来源分层
第一层:官方接口返回。 6697、48892、123742、800 万以上这四个规模数字,Iris 的全部字段值,以及 OpenML-CC18 的成员清单,都来自 https://www.openml.org/api/v1/json/... 在核验时刻的实际返回;错位分页以「返回体上报告 No results」为终止依据。
第二层:官方页面与文档。 治理结构、代码许可、licence 字段的默认解释、Parquet 存储形态与 200GB 上限,均来自官网 About 页、Terms 页、docs.openml.org 的 Concepts 与 Technical specifications 页面。
第三层:第三方登记。 客户端版本号与 Python 版本要求取自 PyPI 与 CRAN 的权威注册信息。
第四层:未核实。 全站学科构成、各任务类型的运行数量分布、每条 flow 当前能否在主流版本中成功重建、停用对象的具体清单。前三项即使能取到也属于自行聚合的分布性统计,按要求不予给出。
附录 C:参考文献
| 编号 | 文献 | 链接 | 用途 |
|---|---|---|---|
| 1 | OpenML 首页 | https://www.openml.org/ | 定位描述、四条取数路径、AutoML 生态名单 |
| 2 | About 页 | https://www.openml.org/about | 创始人与核心贡献者、BSD-3 许可、治理结构 |
| 3 | Terms 页 | https://www.openml.org/terms | 官方推荐引用文献、荣誉准则与使用条款 |
| 4 | Concepts 文档 | https://docs.openml.org/concepts/ | 四层对象定义、服务端独立评测、可复现性限制 |
| 5 | Technical specifications | https://docs.openml.org/data/specs/ | Parquet 与对象存储、200GB 上限、版本与状态机制 |
| 6 | Server API 文档 | https://docs.openml.org/apiv2/ | 新服务端进展与旧接口无日落时间表 |
| 7 | 数据集列表接口 | https://www.openml.org/api/v1/json/data/list | 数据集计数与自动质量度量 |
| 8 | 单数据集接口(Iris) | https://www.openml.org/api/v1/json/data/61 | 数据集字段字典 |
| 9 | 任务类型接口 | https://www.openml.org/api/v1/json/tasktype/list | 八类任务类型 |
| 10 | 评估度量接口 | https://www.openml.org/api/v1/json/evaluationmeasure/list | 71 个度量名清单 |
| 11 | 基准套件接口 | https://www.openml.org/api/v1/json/study/99 | 成员清单与入选标准 |
| 12 | openml-python 仓库 | https://github.com/openml/openml-python | 安装方式、最短示例、引用格式 |
附录 D:任务代码
任务一:把数据集列表从头翻到尾,只留服务端算好的标量
import json, time, urllib.request
BASE = "https://www.openml.org/api/v1/json"
STEP = 500
def fetch(url):
req = urllib.request.Request(url, headers={"User-Agent": "qf-checker/1.0"})
with urllib.request.urlopen(req, timeout=60) as r:
return json.loads(r.read().decode("utf-8", "replace"))
rows, offset = [], 0
while True:
batch = fetch(BASE + "/data/list/limit/" + str(STEP) + "/offset/" + str(offset))["data"]["dataset"]
if not batch:
break #-- 返回空列表即到达末尾
for it in batch:
q = {x["name"]: x["value"] for x in it.get("quality", [])}
rows.append((it["did"], it["name"], it.get("status"), q.get("NumberOfInstances")))
offset += STEP
time.sleep(0.3) #-- 深分页要给服务端留余量
print(len(rows), rows[0], rows[-1])
任务二:先看元数据,再决定是否下载
import openml
ds = openml.datasets.get_dataset(61)
print(ds.version, ds.dataset_id, ds.md5_checksum)
print(ds.qualities) #-- 服务端自动算出的标量,可直接作为方法节依据
X, y, cat, names = ds.get_data(target="class")
print(len(X), len(names), sum(cat)) #-- 最后一项是类别型列的个数
这段想说的不是「怎么加载」,而是「先读什么」。出问题的情形几乎都发生在跳过字段检查就开跑:拿到的是别人的旧版本,或者忘记排除 “row_id_attribute” 所指的列。
附录 E:如果只记五件事
| 序号 | 记住什么 | 为什么 |
|---|---|---|
| 1 | 数据集 6697、任务 48892、流程 123742、运行 800 万以上 | 这四个数定义了它的外形:数据不算多,实验记录极多 |
| 2 | 任务才是聚合键 | 同名数据集可以对应多个任务,按名字比分数等于比两个不同的东西 |
| 3 | 许可逐个看 | licence 是上传者自填的自由文本,平台不提供统一担保 |
| 4 | 服务端重算让历史结果可比 | 同一任务上的分数由统一实现评分,省下重跑基线的成本 |
| 5 | 可复现有上限 | 数值库、操作系统与硬件的差异仍在,跨环境比较先锁版本 |
编辑说明
核验时间为 2026 年 10 月 29 日。方式为命令行请求官网与文档站页面,并逐段分页调用 data/list、task/list、flow/list、run/list、tasktype/list、evaluationmeasure/list、data/61、study/99 等 REST 接口。四个规模数字均以「分页到返回体报无结果」为终止条件,其中运行数量因服务端在更深的偏移量上返回网关超时而只给下界。
未覆盖的部分包括:全站学科构成、各任务类型上的运行数量分布、每条 flow 在当前主流版本中能否顺利重建、被停用对象的清单。前三项即使能取得也属于自行聚合的分布性统计,按本文的数字纪律不予给出,此处列出只为标明边界。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- uci-ml-repository — 共享标签:机器学习 / 评测基准
- alma-archive — 共享标签:评测基准
- i2b2-n2c2-nlp — 共享标签:评测基准
- cblue — 共享标签:评测基准
- blurb — 共享标签:评测基准
- tus-rec — 共享标签:评测基准
- biosses — 共享标签:评测基准
- tg3k — 共享标签:评测基准
- qmugs — 共享标签:评测基准
- openpros — 共享标签:评测基准
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

