评分卡实战中的几个问题

  最近在做催收评分卡中的滚动率模型,在变量筛选这一步遇到了一些困惑,思考了很多觉得很有意义,有必要分享一下。如有理解不当之处还望多多指正。
  第一个问题是关于逻辑回归中系数为正的检验。先附上代码:

# 逻辑回归系数符号筛选,在筛选前需要做woe转换
def forward_delete_coef(x_train,y_train):
    """
    x_train -- x训练集
    y_train -- y训练集
    
    return :
    coef_col回归系数符号筛选后的变量
    lr_coe:每个变量的系数值
    """
    col_list = list(x_train.columns)
    coef_col = []
    for col in col_list:
        coef_col.append(col)
        x_train2 = x_train.loc[:,coef_col]
        sk_lr = LogisticRegression(random_state=0).fit(x_train2,y_train)
        coef_df = pd.DataFrame({'col':coef_col,'coef':sk_lr.coef_[0]})
        if coef_df[coef_df.coef<0].shape[0]>0:
            coef_col.remove(col)
    
    x_new_train = x_train.loc[:,coef_col]
    lr = LogisticRegression(random_state=0).fit(x_new_train,y_train)
    lr_coe = pd.DataFrame({'col':coef_col,
                           'coef':lr.coef_[0]})
    return coef_col,lr_coe

  是不是一定要做这一步检验呢?经过一下午的思考和排查发现还是必须要的,下面慢慢解释原因。
  首先回到WOE的计算上面,看一下bad_rate和WOE值的关系。

  结论就是某一箱的bad_rate越高,相应的WOE值也就越大。我观察了下所有箱的bad_rate和woe值确实是单调的。
然后再看一下每一箱的评分映射逻辑:

  简单说,就是每一箱的得分等于,
s c o r e i = B C W O E i score_i=-B*C*WOE_i
  这里的B在评分卡映射中提到过,等于PDO/log(2),所以是个正数。
再回到每一个变量,解释一下每个变量的得分情况:一个变量各个分箱的bad_rate越高,相应的WOE就越大,对应的分数应该越低。也就是 B C W O E i -B*C*WOE_i 越低。那么C乘B的符号就需要为正,否则就会出现bad_rate越高,分数也越高的情况。所以C的符号应为正。
  这里的前提是以分数越高,违约概率越低来考量的。
  所以结论就是,之所以要求系数为正,是为了便于解释评分卡单变量的得分。只有系数为正,才能对坏样本率高的箱赋予较低的得分。

  第二个问题就是评分卡变量的显著性检验。附上代码。

# 显著性筛选,在筛选前需要做woe转换
def forward_delete_pvalue(x_train,y_train):
    """
    x_train -- x训练集
    y_train -- y训练集
    
    return :显著性筛选后的变量
    """
    col_list = list(x_train.columns)
    pvalues_col=[]
    for col in col_list:
        pvalues_col.append(col)
        x_train2 = sm.add_constant(x_train.loc[:,pvalues_col])
        sm_lr = sm.Logit(y_train,x_train2)
        sm_lr = sm_lr.fit()
        for i,j in zip(sm_lr.pvalues.index[1:],sm_lr.pvalues.values[1:]): 
            if j>=0.05:
                pvalues_col.remove(i)
    
    x_new_train = x_train.loc[:,pvalues_col]
    x_new_train2 = sm.add_constant(x_new_train)
    lr = sm.Logit(y_train,x_new_train2)
    lr = lr.fit()
    print(lr.summary2())
    return pvalues_col

  特意去翻了一下笔记,关于一元线性回归的显著性检验。

  分为F检验和T检验。F检验用来检验总体回归关系的显著性,T检验用来检验各个回归系数的显著性。
  在变量筛选中,相关性剔除是一定要做的,相关性的检验就是去除变量之间的线性相关关系。相关系数小,只能说明变量之间无线性相关关系,但是仍有可能存在非线性相关的关系。
  所以,是不是一定要进行显著性检验,并不是。但是相关性检验一定是需要的。

第三个问题就是强变量是否应该入模。
  以评分卡为例,强变量的意思就是IV值很高,单箱的WOE值也很高。这种情况下其实可以将这一箱单独作为一条策略。当单箱的WOE值大于1的时候,可以推导一下坏样本率。

  WOE值大于1的时候,坏样本率大于12.4%。之前看到说应该是65%,这里留下疑问。如果有错误欢迎私信我。
再附上一个关于强变量是否应该作为入模变量的文章,可以思考一下。
评分卡强变量是否应该入模

【作者】:Labryant
【原创公众号】:风控猎人
【简介】:某创业公司策略分析师,积极上进,努力提升。乾坤未定,你我都是黑马。
【转载说明】:转载请说明出处,谢谢合作!~

猜你喜欢

转载自blog.csdn.net/lc434699300/article/details/105527011