skope-rules 进阶:用 score_top_rules 与 predict_top_rules 构建业务风险评分系统
【免费下载链接】skope-rulesmachine learning with logical rules in Python项目地址: https://gitcode.com/gh_mirrors/sk/skope-rules
skope-rules 是一个基于 scikit-learn 的 Python 机器学习库,专为"逻辑规则学习"而设计:它把复杂的分类任务提炼成一条条形如IF 条件 THEN 风险的可读规则,既保留决策树的直观解释性,又具备随机森林的建模能力。本文聚焦它的两个进阶方法score_top_rules与predict_top_rules,手把手教你搭建一套可落地、可审计、可解释的业务风险评分系统,例如信贷违约风险、欺诈交易识别等场景。
什么是 skope-rules:为"可解释"而生的规则学习库
在风控、医疗、金融等强监管领域,模型不仅要"预测得准",更要"说得清"。skope-rules 的核心思想很简单:通过集成多棵决策树,从每棵树的路径中抽取候选规则,再用袋外(Out-of-Bag)样本评估每条规则的精确率与召回率,最终保留下满足precision_min与recall_min阈值的高质量规则,并对相似规则做去重。
整个流程清晰可见:Bagging 训练决策树与回归树 → 抽取逻辑规则 → 精确率/召回率过滤 → 语义去重。最终产出的是类似下面的可读规则:
"LIMIT_BAL <= 100000 and PAY_1 > 0 and AGE <= 35"这意味着:当客户信用额度低于 10 万、上月还款状态异常且年龄小于 35 岁时,模型判定其违约风险较高——每一条规则都能直接翻译成业务语言。
为什么业务风险评分更需要可解释模型
黑盒模型(如深度神经网络、大型集成模型)虽然精度高,但在业务落地中会遇到三个现实难题:
- 监管合规:监管机构要求对拒贷、风控决策给出明确依据;
- 人工复核:风控人员需要快速判断模型结论是否合理,规则一眼可读;
- 持续迭代:业务专家能根据规则直接提出优化建议,而不是"猜"模型在想什么。
skope-rules 恰好命中这些痛点,这也是它被广泛用于"规则评分卡"类系统的原因。
五个核心方法,一张表看懂
SkopeRules训练完成后,主要提供五个推理方法(定义见 skrules/skope_rules.py 的SkopeRules类):
| 方法 | 返回值含义 | 适用场景 |
|---|---|---|
predict(X) | 0/1 二分类结果 | 常规分类 |
decision_function(X) | 规则按精确率加权的总分 | 连续风险分 |
rules_vote(X) | 命中的规则条数 | 快速统计覆盖度 |
score_top_rules(X) | 按规则精度排序的排名分 | 风险评分核心 |
predict_top_rules(X, n_rules) | 仅用最精确 N 条规则的 0/1 结果 | 高精度准入决策 |
其中后两个方法,就是构建风险评分系统的关键。
score_top_rules 原理:规则越精确,风险分越高
score_top_rules的思想非常巧妙:它不再给每条规则加权求和,而是按规则表现排序,给"命中高精度规则"的样本更高的分。
具体来说,训练完成后所有规则按表现从好到差排列。某个样本命中了排名第 k 的规则,就获得len(rules) - k分;若命中多条规则,则取其中的最高分(np.maximum逻辑)。于是:
- 命中"最精确规则"的样本 → 得分最高;
- 只命中弱规则的样本 → 得分较低;
- 一条规则都没命中的样本 → 得分为 0(视为低风险)。
from skrules import SkopeRules clf = SkopeRules(n_estimators=30, precision_min=0.6, recall_min=0.04) clf.fit(X_train, y_train) risk_score = clf.score_top_rules(X_test) # 每个样本一个风险排名分这个分数的妙处在于:它天然是离散的、可解释的。风控人员看到分数 23,就知道"样本命中了第 23 精确的规则",可以立刻定位到具体规则逐条审查。
上图展示了decision_function在二维特征空间上的表现:蓝色深浅代表风险分数高低,红点(风险样本)集中在高分区,规则把"高风险区"圈得明明白白。
predict_top_rules:只信任最精确的 N 条规则
predict_top_rules(X, n_rules)则解决了另一个业务问题:当你想严格控制误伤率时,只让最可靠的几条规则参与决策。
它的实现基于score_top_rules:当样本的风险排名分超过len(rules_) - n_rules时判为 1,等价于"只要命中最精确的前 N 条规则中的任意一条,就触发风险预警"。
# 只用最精确的 3 条规则做准入判断 hard_decision = clf.predict_top_rules(X_test, n_rules=3)这在业务上非常实用:n_rules越小,召回越严、精度越高,适合"高风险直接拦截";n_rules越大,覆盖面越广,适合"次级风险进入人工队列"。你可以根据精确率-召回率曲线灵活调整这个参数,实现风控松紧度的"旋钮式"控制。
实战:用 score_top_rules 构建信贷违约风险评分系统
下面用项目自带的信用卡违约数据集(skrules/datasets/credit_data.py 的load_credit_data(),共 3 万条样本、约 22% 违约率)完整走一遍流程。
第一步:加载数据并训练模型
from skrules import SkopeRules from skrules.datasets import load_credit_data dataset = load_credit_data() X, y = dataset.data, dataset.target # y=1 表示违约 clf = SkopeRules( max_depth=3, n_estimators=20, max_depth_duplication=3, # 语义去重深度 precision_min=0.6, recall_min=0.04, # 只保留高精度规则 feature_names=list(X.columns), random_state=1, ) clf.fit(X_train, y_train)第二步:输出规则,先看模型"学到了什么"
for rule in clf.rules_[:5]: print(rule[0])你会看到类似PAY_1 > 0 and LIMIT_BAL <= 210000的规则——上月还款逾期 + 额度不高 = 高风险,业务上完全说得通。
第三步:计算风险分并评估
risk_score = clf.score_top_rules(X_test) # 离散风险排名分 precision, recall, _ = precision_recall_curve(y_test, risk_score)第二张图是核心结论:图中蓝色散点代表 skope-rules 规则评分在不同阈值下的表现,绿色虚线是随机森林。可以看到,每一个蓝点都对应一个由若干条可读规则组成的分类器,其性能与随机森林相当,却完全可解释——这正是规则风险评分系统的价值所在。
风险分分级:从分数到业务动作
拿到score_top_rules的分数后,可以按分位数或业务经验切分成风险等级:
- 高分段(命中 Top 规则)→ 直接拒绝或强风控;
- 中分段(命中中等规则)→ 进入人工复核队列,并附上命中的规则清单;
- 低分段(未命中规则)→ 自动通过或低强度风控。
由于每条规则都可读,系统还能自动生成"拒绝原因说明",直接展示给审核人员,甚至作为面向客户的告知依据,这在信贷场景中极具落地价值。
调参技巧与注意事项
precision_min/recall_min:这两个参数决定规则的"质量下限"。风控场景建议调高precision_min(如 0.6~0.8),宁可召回低一点,也要保证命中的规则足够可靠;max_depth:控制规则长度,深度越大规则越细、解释成本越高,一般 2~4 即可;n_estimators:候选树的数量,越多规则候选越丰富,但训练时间线性增长;max_depth_duplication:开启后会对相似规则做语义去重,减少冗余、提升规则多样性;max_samples:建议小于 1.0,否则无法用袋外样本评估规则,容易过拟合(代码中会给出明确警告)。
另外要注意:skope-rules 假设目标类标注为 1、正常样本为 0,其他标签会被自动映射;数据极度不平衡时,建议配合sample_weight或调整阈值使用。
小结
skope-rules 用一套轻量、优雅的设计,把"机器学习"与"业务可解释"这两件事统一了起来。通过score_top_rules获取可解释的离散风险分、用predict_top_rules精确控制参与决策的规则数量,你可以在几分钟内搭建出一套既能精准识别风险、又能逐条解释依据的业务风险评分系统。如果你正在做风控、反欺诈或任何需要"说得出理由"的分类任务,这套进阶玩法值得立刻上手一试。
【免费下载链接】skope-rulesmachine learning with logical rules in Python项目地址: https://gitcode.com/gh_mirrors/sk/skope-rules
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考