逻辑回归中的“20/ln(2)”是什么意思?

机器算法验证 物流
2022-03-29 20:00:24

我试图了解与信用评分模型相关的逻辑回归。我想了解逻辑回归中“20/ln(2)”的意义。为什么以及如何使用它?

3个回答

这是用于使用逻辑回归构建的信用评分模型的常见比例因子。

逻辑回归中因变量的解释为对数赔率,但在信用评分中,我们喜欢以点数来处理,因此对数赔率应用了比例因子以转换为积分系统。

信用评分中广泛使用的约定是“ Points to Double the Odds ”(通常缩写为 PDO)的概念,这就是问题中的来源。例如,如果赔率从 100:1 增加到 200:1,分数会改变多少分。ln(2)

PDO 的一个常见默认值是 20,因为它产生了人们倾向于喜欢的信用评分范围。

因此,的解释是分数增加 20 分,赔率翻倍。20/ln(2)

通常在信用评分中,人们会选择基线分数,例如 600。例如,我们为 600 赋予特定含义,600 表示好坏赔率为 30:1(坏通常表示违约,默认定义通常是付款后 90 天贷款到期,但不良定义可能会有所不同)。通常,他们还定义 20 点跳跃意味着赔率翻倍,例如,如果 60:1 和 640 是 120:1 等,则 620 表示好坏赔率等。这个定义来自逻辑回归。

如果我们拟合逻辑回归模型,则拟合的模型是这个

log(p/(1p))=a+b1d1++bndn

其中是参数估计,是好的概率是您的原始数据(解释变量)。LHS 是对数好的坏赔率。为了符合上述标准(即 600 为 30:1,620 为 60:1),我们使用通过求解这些联立方程得到的abipdicd

600=clog(30/1)+d=c+d(a+b1d1++bndn)
620=clog(60/1)+d=c+d(a+b1d1++bndn)

你会得到缩放 RHS将为您提供所需的分数。因此我们看到只是为了实现 20 点加倍赔率的咒语。c=20/log(2)cd20/log(2)

对我来说,所有这些理论都不是那么明显,我提供了带有公式的代码来解释所有“定义”如何转换为结果分数。

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)}')