評分卡實戰中的幾個問題

  最近在做催收評分卡中的滾動率模型,在變量篩選這一步遇到了一些困惑,思考了很多覺得很有意義,有必要分享一下。如有理解不當之處還望多多指正。
  第一個問題是關於邏輯迴歸中係數爲正的檢驗。先附上代碼:

# 邏輯迴歸係數符號篩選,在篩選前需要做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值確實是單調的。
然後再看一下每一箱的評分映射邏輯:

  簡單說,就是每一箱的得分等於,
scorei=BCWOEiscore_i=-B*C*WOE_i
  這裏的B在評分卡映射中提到過,等於PDO/log(2),所以是個正數。
再回到每一個變量,解釋一下每個變量的得分情況:一個變量各個分箱的bad_rate越高,相應的WOE就越大,對應的分數應該越低。也就是BCWOEi-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
【原創公衆號】:風控獵人
【簡介】:某創業公司策略分析師,積極上進,努力提升。乾坤未定,你我都是黑馬。
【轉載說明】:轉載請說明出處,謝謝合作!~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章