关于 autocarver
AutoCarver 是用于监督式特征分箱的 Python 库,面向信用评分、欺诈检测和风险建模。它搜索并验证候选分组,也提供本地 MCP 服务,让 LLM 助手通过工具调用筛选字段并针对目标变量分箱。
主要功能
- 01搜索目标关联较强的分组
- 02在开发集和交叉验证中检验稳健性
- 03支持二分类、多分类、序数和回归目标
- 04一次处理多种字段类型
- 05查看并调整分箱定义与历史
- 06提供本地 MCP 服务
适用场景
- 01为信用评分变量构造可解释分箱
- 02在训练阶段筛除不稳健分组
- 03通过助手对数据文件字段进行资格判定和分箱
MCP 相关
本地 MCP 服务向客户端提供字段资格判定和针对目标变量分箱的工具调用;数据集不会发送到 AutoCarver 或外部服务。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
AutoCarver 只需几行代码,就能将原始数值、类别和有序列转换为有监督、抗漂移且易于理解的分箱。别再因手动分箱不理想而损失模型性能,也别再等到生产监控时才发现过拟合分箱。
- 通过搜索,而非目测 — 动态规划搜索会根据 Tschuprow's T(默认值)或 Cramér's V 对候选分组进行排序,并遵循你的
min_freq和max_n_mod设置。 - 从设计上保证稳健 — 每个候选分组都必须通过留出的开发集(以及可选的 CV 折)验证,否则就会被否决;这一过程在
fit时完成,而不是等到监控阶段。 - 定义 → 分箱 → 建模 — 声明你的
Features,对分箱器执行fit,再调用transform:整个特征集只需一次有监督处理即可完成分箱,无需为每个特征单独创建一个 notebook。针对每种目标类型使用一个分箱器:BinaryCarver、MulticlassCarver、OrdinalCarver、ContinuousCarver(回归),且 API 完全相同。 - AI 辅助 — 本地 MCP 服务可让你的大模型助手通过工具调用筛选并分箱列,全程在你的计算机上运行。
在 Titanic 快速入门示例中,Fare 从分箱前的 72 个取值合并为 2 个箱,同时与生存情况的关联度提高:Tschuprow's T 从原始值 0.18 升至分箱后的 0.29。
适用于信用评分、欺诈检测和风险建模。
🆕 最新动态
📊 交叉验证稳健性。 fit 现在支持 cv 参数,可在开发集之外(或替代开发集)提供额外的留出稳健性视图:
carver.fit(X, y, cv=5)。接受整数、任意 scikit-learn 划分器或显式索引对,并通过 sklearn.model_selection.check_cv 解析——各折会否决过拟合组合,但绝不会重新排序(排名仍以完整训练集为基准)。请参阅交叉验证折。
🤖 LLM 与 MCP 集成。 AutoCarver 现在内置本地 Model Context Protocol 服务:让支持 MCP 的助手(VS Code Copilot、Claude Desktop、Cursor,……)读取数据文件,然后通过工具调用来判定列的类型,并针对目标变量对其进行分箱。该服务完全在你的计算机上运行——你的数据集绝不会发送给 AutoCarver 或任何外部服务(只有你自己的 LLM 提供商能看到助手分享的内容)。分箱质量取决于 LLM,因此在投入生产使用前,请让人工确认特征定义。请参阅 LLM 与 MCP 指南。
pip install "autocarver[mcp]"
完成配置后,只需向助手提出:
判定
titanic.csv中各列的类型,并针对Survived对其进行分箱。
助手会推断特征类型、提出分箱方案,并返回汇总表——无需手动编写代码。
客户端配置
将以下内容添加到 .vscode/mcp.json(VS Code / GitHub Copilot)或 claude_desktop_config.json(Claude Desktop,在 mcpServers 下,而不是 servers):
{
"servers": {
"autocarver": {
"command": "python",
"args": ["-m", "AutoCarver.mcp"]
}
}
}
如果你使用 uv,可以将 command 指向 uv,由它为你解析环境:
{
"servers": {
"autocarver": {
"command": "uv",
"args": ["run", "python", "-m", "AutoCarver.mcp"]
}
}
}
安装
pip install autocarver
快速开始
你已经有了一个 DataFrame 和一个目标变量——开始之前,第一项就已完成:
- 加载数据
- 划分训练集 / 开发集
- 按类型声明特征
- 拟合 carver,并在开发集上验证
- 检查分箱结果
- 持久化
接下来只需使用下方代码片段——在 Titanic 数据集上进行二分类:
from pathlib import Path
import pandas as pd
from sklearn.model_selection import train_test_split
from AutoCarver import BinaryCarver, Features
# 1. Load data
url = "https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv"
data = pd.read_csv(url)
target = "Survived"
# 2. Train / dev split, stratified on the target
train, dev = train_test_split(data, test_size=0.33, random_state=42, stratify=data[target])
# 3. Declare features by type
features = Features(
categoricals=["Sex"],
numericals=["Age", "Fare", "Siblings/Spouses Aboard", "Parents/Children Aboard"],
ordinals={"Pclass": ["1", "2", "3"]},
)
# 4. Fit the carver (dev set drives the robustness checks)
carver = BinaryCarver(features=features)
train_processed = carver.fit_transform(train, train[target], X_dev=dev, y_dev=dev[target])
dev_processed = carver.transform(dev)
# 5. Inspect the carved buckets, target rate, and association
carver.summary
# 6. Persist for later use
carver.save(Path("titanic_carver.json"))
# 7. Load the carver back in
carver = BinaryCarver.load(Path("titanic_carver.json"))
dev_processed = carver.transform(dev)
min_freq 和 max_n_mod 是入门时唯一需要关注的两个参数——默认值(0.02 / 5)体现了常见的评分实践,而所有行为开关都集中在一个 ProcessingConfig 对象中。查看、调整,然后继续。
多分类任务可使用 MulticlassCarver(针对完整的 K 类目标,每个特征进行一次分箱),也可使用 OneVsRestCarver,为每个类别分别进行分箱;有序目标可使用 OrdinalCarver;回归任务可使用 ContinuousCarver——API 完全相同。若要根据目标关联度和特征间冗余进行特征预选,可将分箱后的输出传入 ClassificationSelector 或 RegressionSelector,并设置 features=carver.features(carver 会对自己的副本进行分箱,因此原始 features 会保持不变)。
你将获得什么
在下次模型评审前,值得回答两个问题:你能否向利益相关方说明当前模型的每个分箱边界是如何确定的?你能否证明每个边界在模型从未见过的数据上依然成立?AutoCarver 让这两件事都只需一行代码:
-
选择最佳分组,而非第一个可接受的分组——候选分组按 Tschuprow's T(默认)或 Cramér's V 排序,并保留在开发集上表现最佳的分组,因此不会停留在第一个看起来还不错的分组上。
-
在上线前避免悄然过拟合——只在训练样本中存在的分箱会在数据漂移下悄然退化。每种候选组合都会在开发集(以及可选的 CV 折)上验证:任何目标率发生反转或分桶低于
min_freq的候选组合,都会在拟合时被拒绝,而不是等到监控时才被发现。 -
一等序数特征支持——
OrdinalDiscretizer会遵循你声明的类别顺序,因此代表性不足的类别会与最近的相邻类别合并,而不是按频率合并。 -
由你担任最终审核者——
carver.features.summary和carver.features.history会显示分箱定义、每个分箱的目标率/频率以及完整的分箱过程;如果你不同意某个边界,可以覆盖它,而transform会像应用其他分箱一样应用你的修改:feature = carver.features("Siblings/Spouses Aboard") # any carved feature; labels are [0, 1, 2] feature.group([1], 2) # merge two bins you consider equivalent -
可解释的分桶——边界易于理解,便于审核、记录并用于评分卡。
-
降维——合并代表性不足的类别,并限制每个特征的分箱数(
max_n_mod),在独热编码前尤其有用。 -
特征预筛选——
ClassificationSelector/RegressionSelector按特征与目标的关联程度排序,并根据特征间相关性进行筛选。
Titanic 数据集中的 Age,一次 BinaryCarver.fit 调用:将 84 个原始取值合并为 3 个分桶,生存率呈单调变化。
对比如何?
| 手动分箱 | AutoCarver | optbinning | sklearn KBinsDiscretizer | |
|---|---|---|---|---|
| 算法 | 逐个查看分布和笔记本 | 对有序分组进行动态规划搜索 | CART 预分箱,然后使用 CP 求解器(默认 CP-SAT;可选 MIP) | 分位数/均匀/k-means——无监督 |
对给定 min_freq / max_n_mod / 指标保留的分组 | 无——采用第一个符合条件的分组 | 从排名靠前的候选分组中选出最佳可行分组 | 在求解器时间限制内,从 CART 预分箱中找到最佳合并结果 | 不适用——没有目标函数 |
| 目标类型 | 任意,约每小时处理 1 个特征 | 二分类、多分类、有序、连续 | 二分类、多分类、连续 | 不适用 |
一次 fit 中处理所有特征类型(数值、类别、有序、NaN) | 每个特征都是独立项目 | 是——强制遵循声明的有序顺序,并将 NaN 作为独立模态 | 可通过 BinningProcess 实现;没有原生有序类型(可通过 user_splits 变通) | 仅支持数值;遇到 NaN 会报错 |
| 留出开发集稳健性检查 | 很少——为每个特征编写脚本太繁琐 | 支持——开发集 + 可选 k 折交叉验证,内置于 fit | 不支持(需自行编写交叉验证脚本) | 不支持 |
fit 后的每箱统计数据 + 分箱历史 | 分散在各个笔记本单元格中 | carver.summary、carver.history | binning_table | 不支持 |
这三个库都兼容 sklearn 的 Pipeline;AutoCarver 还支持 JSON 往返持久化(carver.save("...json"))。AutoCarver(ClassificationSelector、RegressionSelector)和 optbinning(BinningProcess(selection_criteria=...))都提供特征预筛选。完整的特征矩阵、并排的可运行代码片段,以及“如何选择”的指南,请参阅对比页面。
文档
完整参考资料、教程和端到端笔记本示例请见 ReadTheDocs。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。