信贷风控AI是指用机器学习模型替代或辅助人工审批授信、识别欺诈交易的系统。本节审计它在真实金融机构里的成色:技术指标如何换算成钱,阈值由谁定,以及反欺诈图特征为什么比模型结构更值钱。
一家区域信用卡中心的审批系统在凌晨两点收到一笔申请:申请人二十六岁,月收入八千,申请额度五万,工作单位填的是一家注册仅四个月的公司。十年前这笔申请要等早上人工审核,今天模型四十毫秒给出建议:拒绝,风险分落在最高档。场景很平常,但它浓缩了金融AI的全部要素——数据特权(这家机构看得到央行征信、历史还款、设备指纹)、代价不对称(放过一个坏客户损失远大于拒绝一个好客户的损失)、以及监管在场(拒贷理由必须可以解释)。
审计这样的系统,第一件事不是看模型,而是看它的指标链条。供应商汇报"模型AUC零点七九",这句话本身不构成业务价值。AUC零点七九意味着什么,取决于通过率定在哪里、客群坏账基线是多少、人工复核队伍的容量有多大。同一套模型,阈值挪动零点零五,放出去的坏账和拒掉的好人可以同时翻倍——这才是审计要盯的换算链条。
用一段可运行的代码把这个链条拆开。我们模拟一个评分卡输出,观察阈值选择如何同时改写业务三指标。
import random random.seed(11) def simulate_scores(n, good_mean=0.32, bad_mean=0.58): """模拟评分卡输出:坏客户风险分整体更高,分布有重叠。 重叠区就是模型无能为力、必须靠策略兜底的人群。""" scores, labels = [], [] for _ in range(n): bad = random.random() < 0.06 # 坏账基线 6% mu = bad_mean if bad else good_mean s = min(max(random.gauss(mu, 0.14), 0), 1) scores.append(s); labels.append(1 if bad else 0) return scores, labels scores, labels = simulate_scores(20000) def audit_threshold(scores, labels, t): """给定阈值 t:高于 t 拒绝或转人工,低于 t 自动通过。""" approve = bad_in = manual = 0 for s, y in zip(scores, labels): if s > t + 0.08: # 高危:拒绝 continue elif s > t: # 灰区:转人工 manual += 1 else: # 低危:自动通过 approve += 1 bad_in += y return { "自动通过率": approve / len(labels), "通过人群坏账率": bad_in / max(approve, 1), "转人工占比": manual / len(labels), } for t in (0.40, 0.45, 0.50): r = audit_threshold(scores, labels, t) print("阈值 %.2f -> 通过率 %.1f%%, 通过人群坏账率 %.2f%%, 转人工 %.1f%%" % (t, r["自动通过率"]*100, r["通过人群坏账率"]*100, r["转人工占比"]*100)) # 典型输出:阈值从 0.40 提到 0.50,通过率上升但坏账率同步上升, # 转人工占比下降。没有免费的午餐,只有可以被明确选择的交换。
跑完这段代码你会直观看到:所谓"模型效果"是一张交换表,而阈值是业务决策,不是技术决策。审计时若发现阈值半年没随客群漂移而调整,或者调阈值的权限在供应商手里,这两条都是成色扣分项。
交易反欺诈是另一个现场。公开案例里常见"图神经网络识别团伙欺诈"的表述,审计时要把它拆开看:真正起作用的往往是图特征本身——同一设备关联了多少张卡、同一收款方在多长时间内聚集了多少笔小额贷款申请、申请人手机号与已知黑名单的社交距离。模型换成梯度提升还是图网络,效果差距通常小于特征工程带来的差距。
edges = { "dev_1": ["card_A", "card_B", "card_C"], "dev_2": ["card_C", "card_D"], "payee_X": ["card_B", "card_E"], } def device_risk(card, edges, threshold=2): """一个极简的团伙特征:与该卡共享设备或收款方的卡片数。""" linked = set() for hub, cards in edges.items(): if card in cards: linked.update(cards) linked.discard(card) return ("高危" if len(linked) >= threshold else "正常", len(linked)) for c in ("card_A", "card_B", "card_D"): level, n = device_risk(c, edges) print(c, "->", level, "关联卡数:", n) # card_B 命中高危:它同时挂在 dev_1 和 payee_X 两个枢纽上。 # 真实系统把这个思想扩展到设备指纹、IP、GPS、联系人多层图上。
这个例子刻意原始,因为它要说明的正是审计观点:问一个反欺诈系统"用了什么模型",不如问"图特征有哪几层、更新频率多快、黑名单回流闭环多久"。团伙欺诈会进化,今天有效的设备特征三个月后失效,特征回流速度才是护城河。
信贷场景还有一条硬约束:拒贷要给理由。梯度提升模型可以输出特征重要性,但"特征重要性排序"和"能给客户的拒贷理由"之间还有一层翻译。不少机构的做法是双轨:机器学习模型做风险排序,一张可解释的规则评分卡负责出具理由。审计时要核对两轨的分歧率——如果机器模型和对外评分卡长期打架,说明其中一个是摆设。
背景(凌晨审批队列)、操作(换算链条加图特征拆解)、结果(阈值策略表与团伙特征命中)都在上面。解读:金融AI的成色核心是"换算链条完整且权限归属清晰"——谁能调阈值、调了谁签字、坏账归因时能不能还原当时模型版本,这三问比AUC重要。变式:把同样的审计搬到保险理赔反欺诈或证券异常交易监控,交换表的思想原样适用,只是坏账率换成漏损率或误报调查成本。下一节我们进入一个错误代价更不对称的现场:医疗。