关于 explore-ml-data
用于项目级探索性数据分析的技能,可生成 Notebook、HTML 报告、简短分析文档和 JOURNAL 索引,供后续建模前了解数据。
主要功能
- 01项目级探索性数据分析
- 02生成 Notebook 与 HTML 报告
- 03创建嵌入报告的数据摘要
- 04分析重复项与目标列
适用场景
- 01建模前概览数据集
- 02检查目标分布与特征关系
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ probabl-ai/ skore-skills --skill explore-ml-data安装后在 Claude Code 中输入/explore-ml-data确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/cell_anatomy.mdextra_analyses.mdtemplates/data_analysis.mddata_analysis.pydatetime.pydrift.pyfamily.pyjoin_coverage.pymaterialize.pytarget_classification.pytarget_multioutput_regression.pytarget_regression.py详细介绍
探索机器学习数据
针对项目开展一次探索性数据分析:提供一个用户可以打开的笔记本、HTML 报告、一份嵌入这些报告的简短 data_analysis.md,以及 JOURNAL 索引行。
面向人的文案
详情:setup-workspace references/human_facing_prose.md。
笔记本 Markdown、data_analysis.md、JOURNAL 文本和 #
注释描述的是此数据集,而非技能框架、CLI 或生成输出的命令。
问题、回复和收尾叙述使用相同的数据科学语言,而非技能 ID、
G-* 名称或封装 CLI。
`` 是站点标记。编写提示保留在此技能中。
style 仅用于 ruff。
产物
| 路径 | 受众 |
|---|---|
| 原始数据(任意位置) | 用户所有,只读 |
data_analysis/data_analysis.py | 面向人的笔记本——TableReport + ML 差距单元格 |
data_analysis/data_analysis_<slug>.html | 面向人——TableReport 页面,每个系列一个 |
data_analysis/*.png | 面向人——用于阐述影响的图表,绝不用于快速浏览 |
data_analysis/<slug>.html | 面向人——Plotly(或其他)HTML,在影响分析中使用 iframe |
data_analysis/data_analysis.md | 面向人 + 后续建模——TableReport iframe、影响分析 |
scratch/data_analysis/materialize.py | Agent——唯一运行入口;被 gitignore 忽略 |
scratch/data_analysis/<slug>.json | Agent——每个系列对应一个 TableReport.json();被 gitignore 忽略 |
scratch/data_analysis/extras.json | Agent——tables[]、targets、泄漏信息、png 和 html 路径 |
| JOURNAL § 数据理解 | 索引:状态、2–4 行摘要、链接 |
TableReport 负责数据类型、缺失情况、单变量分布、基数和排名靠前的成对关联。 额外单元格涵盖重复项、每个目标的分布、特征与目标的关系,以及 潜在泄漏。其他目标不是特征。不要在额外单元格中重复 TableReport 的内容。
详情:references/cell_anatomy.md。额外分析配方:
references/extra_analyses.md。
后续步骤指引
| 你来这里是为了…… | → 下一步 |
|---|---|
| 首次 EDA(分流或自由文本) | → 编写 md;然后展示五选项续接面板 |
| 选择续接方式 | → 预定义选项、查询、自动探索或描述图表;此时不要结束回合 |
| 结束此阶段 | → 填写 / site / git end-turn / 若已安装则使用 triage-ml-task |
| EDA 已完成,但对方法有疑问 | → 跳过 G-DATA-ANALYSIS;继续探索 § 自动探索(明确提出的问题会跳过预设调查) |
| 数据源已变更或“也绘制 X” | → 覆盖 data_analysis/data_analysis.*,更新 JOURNAL |
停止条件
- 先完成设置。 运行
python -m skore_skills status。如果status.setup.pending不为空,且status.skills.setup-ml-project为 true,则加载setup-ml-project并停止。不要启动此技能。它返回后再继续。本轮不要再次加载它。如果未安装该技能,用一行列出待处理项 并停止。不要臆造git init、脚手架或env init。 如果status.setup.env或status.setup.workspace为declined,用一行说明后停止。若git或editable被拒绝,则不要再次询问;继续。不要手动定义PROJECT_ROOT,也不要在工作区设置待处理时写入根目录下的JOURNAL.md。 - 原始数据只读。 绝不清理、改写或重新保存用户的文件。绝不要让用户删除某列或文件(“删除它”)。数据泄漏应留在开放问题 /
measure看板中。清理工作属于build-ml-pipeline。 - 交付内容放在
data_analysis/下。 原始数据的加载位置可以是任何地方。 - 每个询问都要带上上下文。 在此技能中使用任何 AskUserQuestion 之前,用 2–4 行说明答案授权的操作、依据的事实(在行内明确写出,例如文件名、候选列、建议的系列 slug),以及每个选项的作用。文件链接只能作为补充,不能替代上下文。
- G-DATA-ANALYSIS 运行 | 跳过。 AskUserQuestion。“快速进行”不等于跳过。若跳过 →
python -m skore_skills eda stamp --status skipped并停止。不要填写日期。 只有当data_analysis/data_analysis.md不存在时,跳过才有效(status.data_analysis为missing或skipped)。若状态为present,不要写入skipped。说明已写入的分析会保留,并提供重新运行探索(覆盖data_analysis/data_analysis.*)或保留现有内容的选项。用户接受重新运行之前,不要覆盖。即使 EDA 已完成,只要用户提出了具体的方法论疑虑,此门槛仍应跳过。跳过时不要运行site build。在build-ml-pipeline中,Evaluate 之前仍要运行未拟合快照构建。 - 在
data_analysis/data_analysis.py之前处理 G-TABULAR。status.policy.tabular;否则先运行choose-python-library(推荐 pandas),再为该库以及skrub、matplotlib和seaborn运行add-python-package。不要静默采用默认值。安装该skrub时出现的 Graphviz 修复诊断不会导致放弃此分析。用一行引用该诊断并继续。build-ml-pipeline中的未拟合快照需要可渲染的图。若 G-TABULAR、 目标或系列尚未得到答复,在询问后停止 — 不要创建默认路径笔记本,哪怕称作“假设使用 pandas 的交付物 A”。除非用户选择的额外项需要,否则不要安装 sklearn / skore / pytest。 - 目标。 当列含义明确时,根据 JOURNAL Status / 用户提示推断目标,包括所有命名的输出。否则使用 AskUserQuestion
allow_multiple(列名加上“暂时没有目标”),然后停止 — 暂时不要编写笔记本。“暂时没有目标”不可与其他选项同时选择。不要将特征与目标的区别 / 数据泄漏列为始终需要执行的后续步骤。不同取值很多的数值列属于回归。标签较少或标签为非数值的列属于分类。一列 → 只添加对应的目标代码片段。两列或更多回归列属于一个多输出回归:追加一次templates/target_multioutput_regression.py。多个分类列,或分类与回归混合,不属于 skore 可报告的联合模型:记录每列及其任务,不要追加该代码片段。在选择“暂时没有目标”或拒绝后 →TARGETS=[]。只使用 TableReport + 重复项。不要持久化策略键。 - 不进行训练 / 测试集拆分。 之后由建模决策锁定来决定此选择。EDA 期间不要拆分。如果文件已经分别是训练表和测试表,在摘要中写出两者,不要将它们合并。探索不负责选择评估方式。
数据泄漏单元格是对包含所有目标的原始系列进行的定性标记。其他系列只使用
templates/family.py(TableReport + 重复项)——不要在不包含目标的系列上添加数据泄漏 / 目标 / 双变量单元格。不要持久化合并后的建模表。 - 先确定系列,再编写笔记本。 数据文件多于一个 →
使用 AskUserQuestion 询问分组(不推荐任何选项):使用建议的分组 / 分别分析每个文件 / 我会描述分组方式。根据扩展名、名称模式或表头 / 模式预览提出聚类建议;使用通用 slug(
family_a)。询问时提出这些 slug 不等于臆造系列;只有在得到答复后编写系列才算臆造。一个文件 → 跳过此询问。 - 本轮对使用到的符号执行
api get(缓存命中也算)。TableReport.json()的键可能变化 — 使用.get(...)。 - 只创建一个
data_analysis/data_analysis.py。 对每个已确认的系列(若用户选择按文件处理,则对每个文件)重复 TableReport 单元格。重新运行时原地覆盖。默认笔记本只包含这些模板(以及匹配的目标代码片段)。不要添加额外的直方图、sns.heatmap/ 关联矩阵、唯一值比例(nunique()/n)、列字典或report.json()单元格。重复项单元格只打印重复项数量,不打印唯一值百分比,也不打印nunique()/n。数据泄漏内容应使用模板表格,而不是注释。一个目标:在templates/target_regression.py/target_classification.py中使用 seaborndisplot(描述统计 + 一张目标图),并使用一个分面relplot→bivariate_grid.png。多个回归目标:只使用一次templates/target_multioutput_regression.py(target_distributions.png、bivariate_targets.png)。不要在其旁边复制单目标代码片段,也不要在TableReport旁边臆造另一张目标直方图。最后一个表达式为g。默认路径中不要import matplotlib.pyplot。 - 不要设计模型。 只在
data_analysis.md中说明影响。 - 不要将
data_analysis/加入 gitignore。若用户提出要求,通过setup-git忽略特定的原始数据模式(默认:不忽略)。
预检
- [ ] Setup: pending empty | load setup-ml-project and stop
- [ ] Detect: status.data_analysis present|skipped|missing
- [ ] G-DATA-ANALYSIS: run | skip when the analysis file is absent (skip → JOURNAL only, STOP). present → keep or re-run; never write skipped
- [ ] G-TABULAR + add frame lib + skrub + matplotlib + seaborn
- [ ] Targets: inferred | AskUserQuestion | none
- [ ] Families: one file | AskUserQuestion grouping
- [ ] Load plot-ml-figure if installed; place
data_analysis/data_analysis.py from the template (edit to
the live path); do not execute it
- [ ] scratch/data_analysis/materialize.py once → HTML, figures,
<slug>.json per family, extras.json
- [ ] notebook fill when policy.notebooks is true
- [ ] Author data_analysis.md + JOURNAL
- [ ] Preview `site build` if `policy.site` (skip on G-DATA-ANALYSIS skip)
- [ ] AskUserQuestion five options, including Close (skip if user
already closed the turn)
勾选,然后运行对应步骤。附上证据重新输出检查清单。 只有完成 Close 后才能结束本轮。
执行前
解决 G-DATA-ANALYSIS、G-TABULAR、目标和族之后,在首次写入前立即输出 1–3 句自然语言。说明这是本地计算:它会分析已确认的完整表族,运行适用的重复项/目标/双变量/泄漏分析,并写入 data_analysis/ HTML/图表以及 scratch/data_analysis/ JSON 事实。指出数据范围和报告路径;不要用预检内容来解释。
根据事实描述成本,不要猜测。TableReport 和所请求的图表会随表大小和族的数量而扩展;除非已有测量得到的耗时,否则说明耗时取决于这些输入,不要虚构分钟数。此预览只输出一次,不要在每次编辑前重复;仅当新选择的额外项实质性改变工作内容时才更新。
自动探索/方法论讨论属于 LLM 研究,不是模型拟合或测试:说明它将基于记录的 EDA 进行推理,可能会写入一份临时研究笔记,并会在本地分析前停在测量选择板。
如果有强制关卡尚未完成,可以预览可能进行的工作,但不要写入或执行笔记本。
流程(运行路径)
-
先解析
TARGETS,并为每列确定一个任务(classification|regression)。空列表表示没有目标。两个或更多回归列表示多输出回归。解析 families(见上方停止条件)。如果适用,复制templates/data_analysis.py,然后编辑 — 不要粘贴未使用的分支。第一个 family 是包含所有目标的那个(如果有目标);替换<pkg>、<LOAD_RAW_DATA>(将该 family 的分片合并到内存中;可选的_source_file)、<slug>(Python 标识符)。每个后续 family →templates/family.py(<OTHER_SLUG>、<LOAD_OTHER>)。一个目标 → 附加templates/target_regression.py或templates/target_classification.py,并在第一个 family 的加载单元格中设置TARGET。两个或更多回归目标 → 附加一次templates/target_multioutput_regression.py,并将TARGETS设为该列表。没有目标、多个分类列或任务混合 → 不使用上述片段,也不赋值TARGET/TARGETS。某个 family 有日期时间列 → 对该 family 使用templates/datetime.py(除非恰好只有一个数值目标,否则删除 relplot 单元格)。两个 family 共享列名 → 使用templates/drift.py,并填入<OTHER_FRAME>。默认流程中,架构不相交时不做漂移分析。此处不要附加连接覆盖率单元格。生成的 notebook 不得包含if TARGET、if TASK、OTHER = None、空日期时间循环或“跳过此单元格”。如果已安装plot-ml-figure,在编写图表单元格前加载它(包括首次编写时)。Markdown 内容应针对本次 分析。写入后运行python -m skore_skills style。不要执行此文件。 -
将
templates/materialize.py复制到scratch/data_analysis/materialize.py。替换<pkg>、<TARGETS>、<TASKS>和<ANALYSIS>块:与人工编写的文件保持相同的加载操作、TableReport.html_snippet()写入操作以及图表或 HTML 保存操作。<TARGETS>是列名列表(没有目标时为[])。<TASKS>是与之并行的classification|regression列表,包括没有对应联合片段的列。每个 family 加载一次。 将FAMILIES绑定为(slug, raw),并将FRAME绑定到包含所有目标的 pandas 数据框。保留文件末尾部分。运行该文件一次。 它会写入 TableReport HTML、图表、<slug>.json和extras.json。不要执行data_analysis/data_analysis.py。不要对它运行notebook convert,也不要运行cells run。读取<slug>.json和extras.json。 -
读取
status.policy.notebooks和status.policy.site。 当 notebooks 为true时,运行python -m skore_skills notebook fill data_analysis/data_analysis.py,仅当 site 也为true时才添加--html。fill 不会执行文件。它需要 jupytext 和 nbformat,不需要 nbclient、ipywidgets 或 IPython。当 notebooks 为null或false时,不要更改策略,也不要填充。materialize.py仍是唯一运行的文件。 -
根据
templates/data_analysis.md编写data_analysis/data_analysis.md:概览(每个 family 一个 iframe,除此之外不包含其他内容)、建模启示(包括 特征工程候选项)、待解问题。报告和图表以内嵌方式呈现,不要链接;或 HTML iframe(<iframe src="<slug>.html" …>)应放在其所支持的启示旁边,绝不能放在概览中。概览只保留 TableReport。嵌入每个extras["pngs"]和extras["htmls"]路径,并各用一句话引用这些 JSON 文件(或 notebook 汇总表)中的数字。不要保存没有对应说明句的图表。 根据两个 JSON 文件和 HTML 中的信息得出结论。不要杜撰列名。 -
JOURNAL § Data understanding 表格:运行
python -m skore_skills eda stamp --status done设置 Status 单元格。不要手动输入日期。撰写简短摘要(形状、每个目标的平衡情况或偏斜情况、一至两个影响建模的发现),并在 Report 中写入[data_analysis/data_analysis.md](../data_analysis/data_analysis.md)。 跳过路径:仅运行eda stamp --status skipped。跳过时不要填充或运行git end-turn。 -
续接看板——除非用户已结束本轮(“EDA is done”、“close the turn”):如果
policy.site为 true 且已安装export-ml-site,先运行python -m skore_skills site build --if-stale。否则用一行说明跳过。如果site build报错,提示需要mkdocs-material,则为mkdocs-material(agent)加载add-python-package,然后再构建一次。不要运行pixi add/uv add。 如果缺少该技能,或重试仍失败,用一行说明错误。指出构建错误;不要因此导致检查失败。 如果构建已运行或报告网站为最新状态,说明网站已更新,并逐字粘贴该输出中的file://行。不要提及data_analysis.md或html/data_analysis.html。在此预览中不要运行notebook fill或git end-turn。然后通过 AskUserQuestion 让用户选择一项。不要推荐或预先选择任何选项。首份 md 完成后始终提问(包括分诊流程将你带到此处的情况)。在此看板中不要说“extra-analyses”或“standard extra analysis”。Label 副标题 选择其他预定义选项 仅列出适用的项目:交互 / pairplot、PCA、假设检验、子群、时间序列、文本或地理数据、连接键 / 覆盖范围(2 个以上类别) 提供查询以扩展探索 描述要添加到笔记本的分析(表格、检验或图表) 自动探索与数据和问题相关的内容 针对我们正在探索的问题和数据进行深入研究 描述图表 指定图表类型,我会为其添加单元格 关闭 结束此阶段。不要添加其他分析。 关闭 → 结束本轮对话(面向用户的关闭)。关闭时不要重写
data_analysis.md。其他四个选项会进入 继续探索,且不会针对相同选项再次询问此面板。重复项 / 目标 / 泄漏应保留在建模 影响中,而不应只放在开放问题里。
如果原始提示词已指定其他项目(例如 PCA),请在步骤 1 中加入 这些单元格,不要再次询问该项目。
导入失败 → 使用 add-python-package,不要绕过问题。
刷新(已为 done,用户要求更多图表):编辑
人工维护的文件和 <ANALYSIS> 块,运行一次 materialize.py,
笔记本启用后再填写,然后执行步骤 4–6。不要再次询问
G-DATA-ANALYSIS。
当 status.data_analysis 存在时提出方法论疑虑
(泄漏 /“研究此问题”):跳过 G-DATA-ANALYSIS;不要
覆盖笔记本;转到继续探索 § 自动探索,并针对该明确提出的疑虑进行探索(跳过预设的
额外分析问卷)。
如果已安装 plot-ml-figure,务必在编写或重写图表单元格前加载它。模板并不意味着可以跳过绘图工作器。缺少技能 → 用一行说明跳过,并仍然遵循该流程(统计图表用 seaborn,简单图表用 pandas,最后才用 matplotlib)。笔记本单元格中绝不要使用 plt.close:保存 PNG 后,让图表 / 网格保留为单元格输出。
继续探索
无需单独导出,也不要执行 git end-turn。编辑人工文件时也会编辑 <ANALYSIS>,然后运行一次 materialize.py,启用 notebooks 时再运行 fill。md 重写之前,不要再次构建站点。本轮任何地方(聊天、检查清单或看板)都不要说“extra-analyses”或“standard extra analysis”。只能将文件 references/extra_analyses.md 作为路径提及。
已询问过继续看板。处理已选标签。不要询问保留还是关闭,也不要针对本次选择重复看板。
-
预定义选项 — 配方文件
references/extra_analyses.md(仅路径;聊天中不要说“extra-analyses”)。它自己的allow_multiple看板。问题的最后一行必须严格为:Select each one you want. 该行之后不要写任何内容。在绘图单元格之前,如果已安装,则加载plot-ml-figure。 -
查询 — 等待用户提出分析请求。追加单元格(如果要绘图,则加载
plot-ml-figure)。不要使用预设的研究调查。之后执行刷新步骤。 -
自动探索 — 如果已安装,则加载
research-ml-practice,阶段设为data_analysis,并使用下方的预设调查关注点。缺少技能时 → 用一行说明跳过,并重新询问五选项看板,不要再次执行site build。不要询问初始信息。将 JOURNAL、data_analysis.md(含影响和未决问题)以及scratch/data_analysis/extras.json作为上下文传入。工作进程在搜索前会抽象出问题类别(不包含数据集专有名称)。预设问题:鉴于 JOURNAL 中的问题类型(领域、任务、约束)以及 EDA 中已观察到的结构类型(而非数据集的专有名称),对于这样的原始表,还有哪些额外测量值得进行?
阅读
scratch/research/survey-<slug>.md。在聊天中总结,不要直接贴出笔记。如果工具未运行,就用两句话说明具名关注点(针对泄漏:来源 / 评分时是否可用),并提供measure看板;不要声称已读取临时文件。不要建议删除原始列。通过 AskUserQuestion,仅针对有来源且尚未出现在笔记本中的measure类额外分析启用allow_multiple。没有选项默认选中。问题的最后一行必须严格为:Select each one you want. 该行结束消息:之后不要添加检查清单。 如果存在配方,则映射到 extra_analyses;否则使用自定义单元格。declare/evaluate/confirm不要放到此看板上 → 将未决问题作为建议,而非发现。除非调查笔记列出了带来源的未决问题,否则不要将其复制到看板上。用户点名的方法论关注点(leakage / “research this”)会跳过预设调查:将该关注点作为深入研究内容传入,然后提供相同的
measure看板。如果工具未运行,则按上述方式总结;不要建议删除原始列。 -
描述绘图 — 如果已安装,则加载
plot-ml-figure;追加单元格。 -
会更改
.py的选择:设置style,编辑<ANALYSIS>块使其保持一致,运行一次materialize.py,然后在 notebooks 为true时运行notebook fill(仅当 site 也为 true 时才使用--html)。根据 JSON/PNG/HTML 重写data_analysis.md(影响应基于结果)。然后,如果policy.site为真,则预览site build并重新询问五选项看板(执行运行路径第 6 步)。不要编造领域检查清单。
调度
由 triage-ml-task 调用(explore-the-data 意图,或建模请求中的
explore-first,且缺少 data_analysis 时),也可由用户自由文本调用。
调用:add-python-package、api get、choose-python-library /
G-TABULAR;如果已安装,且用户希望进行额外分析研究或关注某个指定方法,
则调用 research-ml-practice;在任何图表单元格之前调用
plot-ml-figure(默认笔记本、额外分析、自由文本、研究中的 measure);
在 data_analysis.py 之后调用 style。
需要软件包?如果已安装,则加载 add-python-package;否则说明软件包名称
并停止。不要在此处运行 env add。
回合结束
仅在 Close 之后(或用户已结束回合时)运行此区块。Keep exploring
永远不会进入此处。不要在此区块中重写 data_analysis.md。
面向用户的结束语
面向用户的消息应是简短的说明加链接。它不是 Pre-flight,不是 Markdown
内容的完整转储,也不能只有 JOURNAL 表格单元格。不要在该消息中提及
site build、--if-stale 或其他封装命令。
- 先讲述结果——用 2–6 句话总结此阶段的发现,并以建模影响 / JSON
事实(形状、目标、会影响建模的泄漏或重复项)为依据。不要编造列。
不要粘贴
data_analysis.md。 - 打开这些内容——如果运行了
site build或报告网站已是最新,则说明 网站已更新,并逐字粘贴该输出中的file://行。不要提及 Markdown 或html/data_analysis.html。此阶段不提供 Skore 定位信息。 如果未构建网站,不要声称网站已更新,也不要提及 Markdown。 - 规范化标记位于之后——EDA 不提供任何标记 (不提供 G-REPORT-LOCATOR / G-AUDIT-FINDING)。
此技能负责结束回合。Keep exploring 仅提供 1–2 句话的摘要(若运行了构建:
说明网站已更新,并粘贴 file:// 行);它不会进入填充 /
git end-turn。
如果 policy.notebooks 为 true,export-ml-notebook 已安装,且本次运行
尚未写入最新笔记本,则运行 python -m skore_skills notebook fill data_analysis/data_analysis.py;如果 policy.site 也为 true,则添加
--html。由 run-path 步骤 3 生成的笔记本已是最新:不要仅因用户选择
Close 就再次填充。若产物已来自此人工文件,不要重新运行 materialize.py。
否则用一行说明跳过。缺少 jupytext / nbformat / nbconvert 时,用一行说明
跳过并提及 add-python-package;不要让回合失败,也不要运行 pixi add。
然后,如果 policy.site 为 true 且 export-ml-site 已安装,则在持久化文件
写入磁盘后运行 python -m skore_skills site build --if-stale。否则用一行
说明跳过。如果 site build 因 mkdocs-material is required 出错,则为
mkdocs-material(agent)加载 add-python-package,再构建一次。不要运行
pixi add / uv add。如果该技能缺失,或重试仍失败,用一行说明错误。
指出构建错误;不要让数据分析回合失败。运行构建后,说明网站已更新,并
逐字粘贴该输出中的 file:// 行。不要提及 Markdown 或
html/data_analysis.html。
python -m skore_skills git end-turn --stage data_analysis。如果 JSON 中的
action 为 invoke,仅当 status.skills.persist-ml-git 为 true 时加载
persist-ml-git,然后停止;该技能会返回 triage。如果缺少 persist,则
指出待处理的 staged 路径并停止。否则,仅当
status.skills.triage-ml-task 为 true 时加载 triage-ml-task;否则停止。
不要运行 git commit。