风控模型指标PSI详细理解

文章介绍了在风控模型中,PSI作为衡量模型稳定性的重要指标,以及其计算方法。PSI通过比较历史样本分布与未来样本分布的偏差来评估稳定性。同时,文章还讨论了与PSI密切相关的KL散度,它是衡量两个概率分布差异的非对称性度量。在代码实现部分,展示了如何计算PSI值,并给出了模型稳定性的一般判断标准。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.模型稳定性

在风控模型领域,PSI(Population Stability Index)是个常见的指标,用来描述模型/特征的稳定性。因为在金融领域,稳定是个特别重要的要求,模型/特征的更新频率,比起搜广推这种业务场景来也慢很多很多。像风控模型这种,更新频率至少是按季度起算,按年算也非常常见。因此,模型上线前后的稳定性就是个特别重要的指标。

我们在建模时,模型/特征的稳定性一般可以这么衡量:
模型或特征稳定性 == 历史样本分布与未来样本分布的偏差大小。

如果历史样本分布与未来样本分布偏差小,我们就可以认为模型的稳定性较好没有比较大的偏差,反制亦然。

当然在实际情况中,未来样本的分布,总是在不断变化的。互联网各种场景中,用户的变化都非常快。举个很实际的例子,大部分做贷款业务的互金公司,包括传统的银行,在20年用户都发生了重大变化,大家的逾期率普遍都提升了很多,原因大家也都清楚,就是因为疫情的黑天鹅事件。

2.PSI的计算方法

训练模型的时候,我们一般可以把训练数据作为历史样本(actual),验证数据作为未来样本(expected),那么PSI的计算公式如下:
P S I = ∑ i = 1 n ( A i − E i ) ∗ l n A i E i PSI = \sum_{i=1} ^n (A_i - E_i) * ln \frac{A_i}{E_i} PSI=i=1n(AiEi)lnEiAi

参考文献1种提到PSI值可以这样理解:
PSI = SUM( (实际占比 - 预期占比)* ln(实际占比 / 预期占比) )

这么理解就更为直观,是一种加深理解的好方法。

3.KL散度(相对熵)

说到PSI,一般都会提到KL散度,因为这两长得就很像,各种藕断丝连的关系。
KL散度(Kullback-Leibler divergence,简称KLD),在讯息系统中称为相对熵(relative entropy),在连续时间序列中称为随机性(randomness),在统计模型推断中称为讯息增益(information gain)。也称讯息散度(information divergence)。

KL散度是两个几率分布P和Q差别的非对称性的度量。 KL散度是用来度量使用基于Q的分布来编码服从P的分布的样本所需的额外的平均比特数。典型情况下,P表示数据的真实分布,Q表示数据的理论分布、估计的模型分布、或P的近似分布。(参考文献2)

D K L ( P ∣ ∣ Q ) = − ∑ p i l n q i p i D_{KL}(P||Q) = -\sum p_i ln\frac{q_i}{p_i} DKL(P∣∣Q)=pilnpiqi

也可以等价于
D K L ( P ∣ ∣ Q ) = ∑ p i l n p i q i D_{KL}(P||Q) = \sum p_i ln\frac{p_i}{q_i} DKL(P∣∣Q)=pilnqipi

如果是连续随机变量,概率分布P和Q可按积分方式定义为
D K L ( P ∣ ∣ Q ) = ∫ − ∞ ∞ p ( x ) l n p ( x ) q ( x ) d ( x ) D_{KL}(P||Q) = \int _{-\infty} ^{\infty} p(x) ln\frac{p(x)}{q(x)} d(x) DKL(P∣∣Q)=p(x)lnq(x)p(x)d(x)

可以对KL散度进行简单进行推导
随机变量X的熵可以表示为:
H ( X ) = − ∑ i p ( x i ) l o g p ( x i ) H(X) = -\sum_i p(x_i) log p(x_i) H(X)=ip(xi)logp(xi)
而对于两个随机变量P, Q,概率分布分别为p(x), q(x),则p与q的交叉熵定义为:
H ( p , q ) = ∑ p ( x ) l o g 1 q ( x ) = − ∑ p ( x ) l o g q ( x ) H(p, q) = \sum p(x) log \frac{1}{q(x)} = -\sum p(x)logq(x) H(p,q)=p(x)logq(x)1=p(x)logq(x)

在信息论中,交叉熵可认为是对预测分布q(x)用真实分布p(x)来进行编码时所需要的信息量大小。

因此,KL散度(相对熵)为:
D K L ( P ∣ ∣ Q ) = H ( p , q ) − H ( p ) = − ∑ p ( x ) l o g q ( x ) − ( − ∑ p ( x ) l o g p ( x ) ) = ∑ p ( x ) l o g p ( x ) q ( x ) \begin{aligned} D_{KL}(P||Q) &= H(p, q) - H(p) \\ &= -\sum p(x)logq(x) - (-\sum p(x)logp(x)) \\ & = \sum p(x) log \frac{p(x)}{q(x)} \end{aligned} DKL(P∣∣Q)=H(p,q)H(p)=p(x)logq(x)(p(x)logp(x))=p(x)logq(x)p(x)

注意KL散度并不是一个真正的度量或者距离,因为它不具有对称性
D K L ( P ∣ ∣ Q ) ≠ D K L ( Q ∣ ∣ P ) D_{KL}(P||Q) \neq D_{KL}(Q||P) DKL(P∣∣Q)=DKL(Q∣∣P)

4.PSI与散度的关系

我们再来看PSI的公式

P S I = ∑ i = 1 n ( A i − E i ) ∗ l n A i E i PSI = \sum_{i=1} ^n (A_i - E_i) * ln \frac{A_i}{E_i} PSI=i=1n(AiEi)lnEiAi

拆开一下
P S I = ∑ i = 1 n A i ∗ l n A i E i + E i ∗ l n E i A i PSI = \sum_{i=1} ^n A_i * ln \frac{A_i}{E_i} + E_i * ln \frac{E_i}{A_i} PSI=i=1nAilnEiAi+EilnAiEi

所以拆开一下,很容易看出来,PSI其实是将A(actual)与E(expected)的KL散度做了一个对称化操作,将两个KL散度进行了相加。

P S I = D K L ( A ∣ ∣ E ) + D K L ( E ∣ ∣ A ) PSI = D_{KL}(A||E) + D_{KL}(E||A) PSI=DKL(A∣∣E)+DKL(E∣∣A)

5.代码实现

上头已经解释了很长时间的理论,下面我们看看具体代码如何实现。

import math

def genData():
    ages = ['<18', '[18,25)', '[25,30)', '[30,40)', '[40,50)', '>50']
    train_all = [190, 370, 550, 140, 160, 130]
    train_target = [90, 70, 50, 40, 60, 80]
    train_target_num = sum(train_target)
    ai_list = [round(ele / train_target_num, 4) for ele in train_target]
    print(ai_list)

    predict_all = [1912, 3705, 5507, 1408, 1603, 1311]
    predict_target = [800, 827, 548, 446, 660, 846]
    predict_target_num = sum(predict_target)
    ei_list = [round(ele / predict_target_num, 4) for ele in predict_target]
    print(ei_list)

    psi_list = [round((ai - ei) * math.log(ai / ei), 6) for ai, ei in zip(ai_list, ei_list)]
    print(psi_list)
    print(sum(psi_list))


genData()

上面的代码,我们模拟一个场景:
将用户的年龄段分为六段,train_target, predict_target分别为响应人群,最后计算PSI值。

最后代码输出

[0.2308, 0.1795, 0.1282, 0.1026, 0.1538, 0.2051]
[0.1938, 0.2004, 0.1328, 0.1081, 0.1599, 0.205]
[0.006465, 0.002302, 0.000162, 0.000287, 0.000237, 0.0]
0.009453000000000001

一般如果PSI值<0.1,我们认为模型/特征稳定性很好,变化不大,可以使用。
如果PSI值>0.25,则认为模型/特征稳定性不行,需要进行更新。

参考文献

1.https://zhuanlan.zhihu.com/p/79682292
2.https://zh.wikipedia.org/wiki/%E7%9B%B8%E5%AF%B9%E7%86%B5
3.https://hsinjhao.github.io/2019/05/22/KL-DivergenceIntroduction/

<think>好的,用户想了解如何评估评分模型,特别是机器学习或数据分析中的评分模型。首先,我需要确定评分模型的具体应用场景,比如信用评分、险预测还是客户分群。不同的场景可能关注不同的评估指标。 根据引用[1]和[2],评估方法主要分为数据集划分和性能指标。数据集划分方面,常用的有留出法、交叉验证和自助法。需要解释这些方法如何保证模型评估的客观性,尤其是交叉验证的具体步骤,比如k折交叉验证。同时,数据分层的概念也很重要,特别是处理类别不平衡的数据时。 性能指标方面,分类模型和回归模型有不同的指标。分类常用准确率、精确率、召回率、F1分数、AUC-ROC等。需要详细说明每个指标的含义和适用场景,比如精确率和召回率的权衡,以及AUC-ROC曲线的作用。对于回归模型,MSE、RMSE、MAE、R²是核心指标,要解释它们的计算方式和意义。 另外,用户提到的评分模型可能涉及概率输出,所以还需考虑对数损失、Brier分数等概率校准指标。业务指标的结合也很关键,比如在金融中KS统计量和PSI的重要性,这些需要结合实际应用来解释。 生成相关问题时要覆盖评估方法、性能指标选择、业务适配性、优化策略和工具实现等方面,帮助用户全面理解。同时,确保引用文献正确对应内容,比如引用[1]提到交叉验证和性能量,引用[2]涉及离线与在线评估方法,引用[3]关联分析可能与特征评估有关。需要检查引用是否准确,避免错误关联。 最后,注意格式要求,数学公式用$...$或$$...$$,代码块使用正确语法,回答结构清晰,分点说明。确保语言流畅,用词准确,符合用户的中文需求。</think>### 评分模型评估方法详解 评分模型(如信用评分、险预测模型)的评估需要结合机器学习的评估框架和业务场景特性,以下是核心方法及指标: --- #### 一、数据集划分方法 1. **留出法** 将数据集分为训练集(70-80%)和测试集(20-30%),确保测试集分布与训练集一致[^2]。 $$ \text{数据集} = \text{训练集} \cup \text{测试集}, \quad \text{训练集} \cap \text{测试集} = \emptyset $$ 2. **交叉验证** 采用k折交叉验证(k=5或10),减少数据划分的随机性影响: ```python from sklearn.model_selection import KFold kf = KFold(n_splits=5, shuffle=True) for train_index, test_index in kf.split(X): X_train, X_test = X[train_index], X[test_index] ``` 3. **时间序列分层划分** 对于时序数据(如金融交易记录),需按时间顺序划分,避免未来信息泄露。 --- #### 二、核心性能指标 1. **分类任务指标** - **混淆矩阵衍生指标** $$ \text{精确率} = \frac{TP}{TP + FP}, \quad \text{召回率} = \frac{TP}{TP + FN} $$ $$ F_1 = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} $$ - **AUC-ROC** 反映模型对正负样本的区分能力,AUC>0.8为优秀[^1]。 2. **回归任务指标** - **均方误差(MSE)** $$ \text{MSE} = \frac{1}{n}\sum_{i=1}^n (y_i - \hat{y}_i)^2 $$ - **R²分数** $$ R^2 = 1 - \frac{\sum (y_i - \hat{y}_i)^2}{\sum (y_i - \bar{y})^2} $$ 3. **概率校准指标** - **Brier分数** $$ \text{Brier} = \frac{1}{n}\sum_{i=1}^n (p_i - y_i)^2 $$ 用于评估概率预测的校准程(值越小越好)。 --- #### 三、业务适配性评估 1. **KS统计量** 衡量评分模型区分好坏客户的能力,通常要求KS>0.3: $$ \text{KS} = \max |\text{TPR}(s) - \text{FPR}(s)| $$ 2. **PSI(群体稳定性指标)** 监模型在不同时间段的稳定性,PSI<0.1表示稳定: $$ \text{PSI} = \sum (实际占比 - 预期占比) \times \ln\left(\frac{实际占比}{预期占比}\right) $$ 3. **Lift值** 评估模型在高分段捕获正样本的效率,例如前10%样本的Lift=3表示效果是随机选择的3倍。 --- #### 四、实现工具与代码 ```python # 使用scikit-learn计算指标 from sklearn.metrics import roc_auc_score, precision_score, mean_squared_error # AUC-ROC auc = roc_auc_score(y_true, y_prob) # MSE mse = mean_squared_error(y_true, y_pred) # 特征重要性(以随机森林为例) from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier() model.fit(X_train, y_train) importance = model.feature_importances_ ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值