manifold
模型可解释性可视化工具,通过性能分段与KL散度特征排序帮助ML工程师定位预测偏差根因
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
模型可解释性可视化工具,通过性能分段与KL散度特征排序帮助ML工程师定位预测偏差根因
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。

图1:Manifold 项目封面
深夜,你盯着屏幕上 0.87 的 AUC 分数,模型已经上线跑了三个月。但业务方不断反馈某些用户群体预测不准——可到底哪里不准?哪个特征出了问题?为什么同样一批数据,XGBoost 比 DeepLearning 表现更好?
传统的 ML 评测报告只能告诉你一个数字,但 Manifold 告诉你「为什么」。它是 Uber 内部孵化的模型可解释性可视化工具,如今已从 Uber 内部项目成长为 Apache-2.0 许可的开源库,被 1,670 颗 GitHub Stars 验证了其行业价值。
机器学习模型本质上是一个黑箱。传统指标如 AUC、RMSE、Log-Loss 只能给出整体「健康报告」,却无法定位具体问题。模型说「这个人违约概率 73%」,但它为什么这么认为?是因为年龄?地理位置?还是某个隐含的交叉特征?
Uber 的 ML 工程师在日常工作中频繁遇到这个问题:模型在整体指标上表现尚可,但在特定数据子集上存在系统性偏差。2019 年,Uber AI 团队正式开源 Manifold,希望解决这个行业痛点。项目使用 Apache-2.0 许可证,由 Uber 内部长期维护,属于 incubation 阶段项目。
这个视图用直方图和密度曲线展示不同模型在不同数据分段上的预测表现。X 轴是性能指标(Log-Loss 或 Squared Error),Y 轴是数据密度,每个分段代表一组具有相似预测误差的数据实例。

图2:性能对比视图 — 识别低性能数据段
具体来说,Manifold 内部使用 K-Means 聚类算法对每个数据实例的性能分数进行自动分段——分类模型用 Log-Loss,回归模型用 Squared Error。分段越多,分析粒度越细。
读图技巧:曲线越靠右,说明这一段数据的预测误差越大。如果 XGBoost 和 DeepLearning 在同一分段的表现差异明显(比如一个靠左、一个靠右),说明模型在不同数据子集上有各自的优势,可以考虑模型集成。

图3:性能曲线结构 — 25%、50%、75% 分位线
当你在性能对比视图中找到感兴趣的数据分段后,可以创建「分段组」(Segment Groups)进行对比分析。特征归因视图会自动渲染每个特征的分布直方图,并按 KL-Divergence(KL散度) 排序——KL 散度越高,说明该特征在两个分段组之间的分布差异越大,即该特征与预测误差高度相关。
这个设计极其巧妙:不需要手动猜特征重要性,算法自动告诉你「这个特征很可能就是问题所在」。

图4:特征归因视图 — 识别导致预测偏差的特征
根据特征类型不同,归因视图会以不同形式渲染:
对于地理特征,Manifold 集成 Uber 自家的 kepler.gl 引擎:

图5:地理特征视图 — 定位地理分布与预测偏差的关联
Manifold 采用 Lerna Monorepo 结构,根目录包含两个 Yarn Workspace:
manifold/
├── modules/ # 核心 JS 模块
│ ├── manifold/ # React 可视化组件(主包)
│ ├── graph-builder/ # 图构建器
│ ├── feature-list-view/ # 特征列表视图
│ ├── mlvis-common/ # ML 可视化公共组件
│ ├── multi-way-plot/ # 多路绘图
│ └── stacked-calendar/ # 日历堆叠图
├── bindings/ # 多语言绑定
│ ├── python-compute/ # Python 计算后端
│ └── jupyter/ # Jupyter Notebook 集成
└── examples/manifold/ # Demo 应用
核心包 @mlvis/manifold 依赖:
前端样式使用 Styletron(CSS-in-JS 引擎),而非业界常见的 styled-components 或 Emotion。Styletron 是 baseui 的御用样式引擎,特点是服务端渲染友好、原子化 CSS 生成。
Python 绑定(bindings/python-compute/)提供数据处理和性能分析的计算后端,不含前端可视化。典型用法:
from manifold_python import DataManager, PerformanceComparison
# 加载 CSV 数据
dm = DataManager.load_csv('features.csv', 'predictions.csv', 'ground_truth.csv')
# 计算分段性能
result = PerformanceComparison.compute(dm, n_segments=5)
Jupyter Notebook 绑定(bindings/jupyter/)则提供直接在 Jupyter 中嵌入 Manifold 可视化的能力,是数据科学家最自然的使用方式。
Manifold 对输入数据格式有清晰定义:
const data = {
x: [...], // 特征数据,每项是一个特征对象
yPred: [[...],...], // 预测数据,支持多模型对比
yTrue: [...] // 真实标签
};
数据量建议 10,000-15,000 条,超出时自动随机采样。这种设计让 Manifold 能兼容任意框架(TensorFlow、PyTorch、XGBoost、Scikit-learn)产出的模型输出,只需将模型推理结果转成上述格式即可。
项目提供了开箱即用的 Demo 应用,只需三步即可本地运行:
git clone https://github.com/uber/manifold
cd manifold && yarn
cd examples/manifold && yarn && yarn start
启动后访问 localhost:8080,通过界面上传三个 CSV 文件(特征、预测、真实标签),即可生成可视化报告。
如果要在现有 React 应用中集成 Manifold,只需安装 npm 包并挂载 Redux Reducer:
npm install @mlvis/manifold styled-components styletron-engine-atomic styletron-react
不过当前版本的 依赖版本较旧:React 16.9、Redux 4、Temporal.js 等依赖都是数年前的老版本,在新项目中使用可能需要额外处理依赖兼容性问题。
Manifold 代表了一个重要趋势:ML 可解释性工具的民主化。随着 AutoML、低代码平台让模型训练门槛不断降低,如何理解、审计、调试模型成为新的瓶颈。Manifold 用直观的可视化手段填补了这个空白,让产品经理、数据工程师都能参与到模型优化的讨论中。
尽管项目维护节奏放缓,但其核心理念(KL-Divergence 特征排序、分段性能对比)已被后续的可解释性工具广泛借鉴。当前 GitHub 仍有 83 个 open issues 和持续活跃的讨论,社区仍在维护中。