文章目录
- 小结在前
- 由概率到分数的转换
-
- 概率转换分数最终表达式
- 变量的分值计算
- 评分卡性能评估
-
- 坏账率与通过率的审批策略
- 双卡审批策略
- 代码
将模型预测概率转化为分数,更符合人的一个直观感受
小结在前
- 1.把对数几率当成分数
- 2.在对数几率的基础上进行缩放平移(简单的线性变换,就是对数几率的线性变换)
- 3.可用线性代数式所表示,能直观的看到每个变量都对分值有影响(可解释性强)
- 4.变量可以用指示函数的方式,拆成每一个具体的值
概率转换为分数需要三个条件
- 1.样本总的分数是由每个变量的分数之和累加得到
- 2.模型预测概率的变化会引起分值以某一单位刻度发生改变
- 3.每个变量的取值发生变化会引起样本分值的改变
几率Odds
Odds 可以衡量模型预测结果为正例可能性的大小
几率公式做对数变换展开后的结果
取对数可以写成线性函数
由此可见,上述公式的左边是模型输出概率的对数几率,右边是不同变量的线性加权表示,巧妙的将概率相关表达映射为变量加权的方式
由概率到分数的转换
概率转换分数最终表达式
Score = A - B * log(Odds)
- A作为补偿,即平移
- B作为刻度,即缩放
起了调解作用,对数几率的范围可能不是我们想要的范围B来缩放,A来平移调解
我们希望模型预测概率的变化会引起分值以某一单位刻度发生改变,得到如下式
这里的概率体现在 log(Odds)=log(p/(1-p))表达中。
假设在给定几率 θ0 时,对应的分数为 s0,同时,当几率增加 2
倍变为 2θ0 时,对应的分值增加刻度为 PDO,表示为 s0+PDO
- PDO: 基准几率翻倍之后,增加的值(分值的一个加量)
例子练习
求解A、B,解两个方程即可
基准几率:1/60
基准分数:600
PDO:20
score = A - B * log(Odds)
600 = A - B * log(1/600)
600 + 20 = A - B * log(1/30)
可以看出,任意一个变量每增加一个单位,该样本的几率就增加,并影响到对数几率,进而引起分值的变化。
任意一个变量的变化都会影响模型最终的分数,模型给出的分值的每一点变化都可以用输入特征来解释
变量的分值计算
如果将公式展开,就可以得到每个变量的分值乃至每个变量可能取值的最终分值
变量拆开具体的值,每一个值都对分数有影响,并且每一个值的分值都能计算出来
其中,A、B 在给定特定比率对应的预期分值与比率变化对应的翻倍分数后即可求得;w0、w1…wn 是 Logistic 回归模型训练得到的参数;x1、x2…xn 是样本的变量值经过 WOE 编码后的结果。由于一条样本中变量的取值是互斥的,比如性别变量 xi,其可能取值为{‘男’、‘女’},进行 WOE 编码后表示为{woei1,woei2}。一个样本的性别变量只能取其中的一个值,这里用一个二值编码矩阵 σ 表示该样本性别变量的取值。σ 表示形式如下,不是矩阵也行,如男:1 0,女:0 1
则样本性别变量取值为男时,用 WOE 编码与二值编码矩阵 σ 点积的形式表示为 woei1·σi1。因此,将每个变量按各自的取值展开并带入式(10-9),可以得到如下形式
其中,σ是一个二值编码矩阵,用于指示该变量的具体取值情况,如σij 表示第 i 个变量是否取第 j 个取值;woeij 表示第 i 个变量的第 j 个取值的 WOE 编码结果;wi 表示第 i 个变量在 Logistic 回归模型中的权重。上式中所有参数都可以计算,每个变量及其变量取值的分值计算如表 所示
如果建立标准评分卡,
在特征工程部分,离散变量需要 WOE 编码,连续变量需要先分箱后编
码;在模型训练部分只能用 Logistic 回归模型
通过率相同的情况下比较坏账率
坏账率相同的情况下比较通过率
评分卡性能评估
若系统中已经存在一个评分卡模型,模型更新之前要比较新开发的模型与已经上线的模型在客群上有哪些变化
- 第一种方式为评分卡自身评估
- 第二种方式是与已经上线的评分卡比较评估
一般需要观察的组内指标有:拒绝率、通过率、坏账率、好样本换入/换出、坏样本换入/换出、不确定样本换入/换出、拒绝样本换入和 KS 值等
评分卡模型建模时只采用了真实准入样本,在评分卡性能评估时要用到准入样本与拒绝样本。通过率的计算一定要加上拒绝样本才有效,才能在新模型保证与原有模型同样的通过率的情况下,比较模型的坏账率
坏账率与通过率的审批策略
当与原有评分卡模型相比较,新开发的模型在给定的坏账率下其通过率更高;或在给定的通过率下其坏账率更低,则模型是可接受的
一般会做成两个分数阈值,一个分值用于直接拒绝,一个分值用于直接准入,在两个分值之间的分数则人工介入或增加其他说明信息重新评估
双卡审批策略
- 评分卡A和评分卡B都是A卡
- A卡:申请评分卡
- B卡:行为评分卡
代码
import math
import copy
def score_card(woe_df, coef, intercept, odds=0.2, p0=300, pdo=20):
"""
LR模型转换评分卡
:param woe_df:DataFrame,特征分箱对应WOE
:param coef:dict,LR模型的特征系数
:param intercept:float,LR模型的偏置项,即theta_0
:param odds:float,设定几率,用于求解评分卡中常数A和B
:param p0:float,设定几率对应分数,用于求解评分卡中常数A和B
:param pdo:float,翻倍分值,用于求解评分卡中常数A和B
:return:
score:DataFrame,评分卡各特征分数
base_score:float,基础分数
Example
-----------------------------------------------------------------
>>> import pandas as pd
>>> df = pd.DataFrame({'feature': ['income', 'income', 'income', 'age', 'age', 'age'], 'woe': [
0.2, -0.2, -0.4, 0.2, -0.3, 0.1]})
>>> df
feature woe
0 income 0.2
1 income -0.2
2 income -0.4
3 age 0.2
4 age -0.3
5 age 0.1
>>> coef_ = {'income': 0.2, 'age': 0.15}
>>> intercept = 0.1
>>> score, base_score = score_card(woe_df=df, coef=coef, intercept=intercept)
>>> base_score
3.497757007553993
>>> score
feature woe score
0 income 0.2 -10.142458
1 income 0.1 -5.071229
2 income -0.2 10.142458
3 income -0.3 15.213686
4 income -0.4 20.284915
"""
score = copy.copy(woe_df)
a = pdo / math.log(2)
b = p0 + a * math.log(odds)
base_score = a - intercept * b
score['score'] = score[['feature', 'woe']].apply(
lambda x: -b * coef[x[0]] * x[1], axis=1)
return score, base_score