我试图了解与信用评分模型相关的逻辑回归。我想了解逻辑回归中“20/ln(2)”的意义。为什么以及如何使用它?
逻辑回归中的“20/ln(2)”是什么意思?
机器算法验证
物流
2022-03-29 20:00:24
3个回答
这是用于使用逻辑回归构建的信用评分模型的常见比例因子。
逻辑回归中因变量的解释为对数赔率,但在信用评分中,我们喜欢以点数来处理,因此对数赔率应用了比例因子以转换为积分系统。
信用评分中广泛使用的约定是“ Points to Double the Odds ”(通常缩写为 PDO)的概念,这就是问题中的来源。例如,如果赔率从 100:1 增加到 200:1,分数会改变多少分。
PDO 的一个常见默认值是 20,因为它产生了人们倾向于喜欢的信用评分范围。
因此,的解释是分数增加 20 分,赔率翻倍。
通常在信用评分中,人们会选择基线分数,例如 600。例如,我们为 600 赋予特定含义,600 表示好坏赔率为 30:1(坏通常表示违约,默认定义通常是付款后 90 天贷款到期,但不良定义可能会有所不同)。通常,他们还定义 20 点跳跃意味着赔率翻倍,例如,如果 60:1 和 640 是 120:1 等,则 620 表示好坏赔率等。这个定义来自逻辑回归。
如果我们拟合逻辑回归模型,则拟合的模型是这个
其中和是参数估计,是好的概率是您的原始数据(解释变量)。LHS 是对数好的坏赔率。为了符合上述标准(即 600 为 30:1,620 为 60:1),我们使用通过求解这些联立方程得到的和
你会得到。和缩放 RHS将为您提供所需的分数。因此我们看到只是为了实现 20 点加倍赔率的咒语。
对我来说,所有这些理论都不是那么明显,我提供了带有公式的代码来解释所有“定义”如何转换为结果分数。
import pandas as pd
import numpy as np
df=pd.DataFrame()
df['fc']=[206, 205, 200, 220, 230, 235, 236, 240,250]
df['cat']=[0, 1, 0, 0, 0, 1, 1, 1,0]
df['good']=[0, 1, 0, 0, 1, 0, 1, 1,1]
train=df[['fc','cat']]
y=df['good']
from sklearn.linear_model import LogisticRegression
clf=LogisticRegression(fit_intercept=True, solver='lbfgs')
clf=clf.fit(train, y)
coefficients = np.append (clf.intercept_, clf.coef_)
print('Coefficients', coefficients)
#Option 1: Predict proba
test=pd.DataFrame (np.array([200,1]).reshape(1,2))
y_pred=clf.predict_proba(test)[:,1]
print('Predict proba: ' ,y_pred)
#Option 2: Calculate Probability
ln_odds=sum(np.multiply(coefficients,np.array([1,200,1]))) # sum(coefficients*values)=ln(odds)
odds=np.exp(ln_odds)
prob_good=odds/(1+odds)
print('Resulting probablity: ', prob_good)
#score from Siddiqi
pdo=20
factor=pdo/np.log(2)
offset=200
score1=offset+factor*np.log(1) #p_bad=0.5, bad=good > odds=1
score2=offset+factor*np.log(2) #p_bad=0,3(3) good=2 bad=1
score3=offset+factor*np.log(4) #p_bad=0,2 good=4 bad=1
print(f'Difference 2 and 1: {score2-score1} \nDifference 3 and 2: {score3-score2}' )
'''To calculate score from logregression '''
#NB! in regression target 1 should be set to good as in Siddiqi odds are 100:1 meaning 100 good and 1 bad
score=offset-factor*sum(np.multiply(coefficients,np.array([1,200,1])))
print(f'Score from regression: {round(score,0)}')
#score from probability
score=offset+factor*np.log(prob_good/(1-prob_good))
print(f'Score from probability: {round(score,0)}')
其它你可能感兴趣的问题