xieshiran:使用 R 语言开发评分卡模型
?
為了提高評分卡模型的開發(fā)效率,我為 R 語言社區(qū)貢獻(xiàn)了一個開源項目 scorecard 包 (HomePage,?Github,?CRAN)。該 R 包提供了評分卡開發(fā)過程中的常用功能,包括變量粗篩、分箱與 woe 轉(zhuǎn)換、模型評估、評分刻度轉(zhuǎn)換等。
評分卡模型的開發(fā)流程通常包括以下五個主要步驟:數(shù)據(jù)準(zhǔn)備、WOE 分箱、模型擬合、模型評估、評分卡刻度。下面結(jié)合 scorecard 包完成一個簡單的評分卡模型開發(fā)案例。更加詳細(xì)的評分卡模型開發(fā)介紹請參考幻燈片。
數(shù)據(jù)準(zhǔn)備
首先加載 scorecard 包,并載入包內(nèi)自帶的德國信貸數(shù)據(jù)集。該數(shù)據(jù)集包含了1000個借款人的信貸數(shù)據(jù),20個 X 特征與1個 Y 值。其詳細(xì)信息參見?UCI 的德國信貸數(shù)據(jù)集網(wǎng)站。
library(scorecard)# load germancredit data data(germancredit)載入數(shù)據(jù)集后,可先通過變量的 IV 值、缺失率以及單類別率對 X 特征進(jìn)行初步篩選。var_filter 函數(shù)默認(rèn)刪除信息值小于0.02、缺失率大于95%或單類別比例大于95%的變量。var_filter 函數(shù)還能夠人為設(shè)定需要刪除或保留的變量,以及夠返回變量刪除的原因列表。
# filter variable via missing rate, iv, identical rate dt = var_filter(germancredit, y = 'creditability') ## [INFO] filtering variables ...將經(jīng)過初篩的數(shù)據(jù)集拆分為訓(xùn)練集與測試集。在 split_df 函數(shù)中如果指定了 y 變量,那么將基于 y 變量分層拆分,如果沒有指定,則隨機(jī)拆分?jǐn)?shù)據(jù)集。ratio 為拆分后兩個數(shù)據(jù)集的樣本量占比。 seed 為隨機(jī)種子,用于重現(xiàn)拆分的樣本。
# breaking dt into train and test dt_list = split_df(dt, y="creditability", ratio = 0.6, seed = 30) label_list = lapply(dt_list, function(x) x$creditability)WOE分箱
接下來對數(shù)據(jù)集進(jìn)行分箱與 woe 值轉(zhuǎn)換。由于這個數(shù)據(jù)集樣本量比較小,我們可以直接對全樣本進(jìn)行分箱處理。如果數(shù)據(jù)量允許,應(yīng)該使用訓(xùn)練集進(jìn)行分箱,并使用訓(xùn)練集得到的 woe 值對其他數(shù)據(jù)集進(jìn)行woe替換。
woebin 函數(shù)提供了樹形 tree、卡方合并 chimerge、等寬 width 與等高 freq 四種分箱方法。以樹形分箱為例,默認(rèn)情形是當(dāng)信息值增益率 stop_limit 小于0.1, 或分箱數(shù) bin_num_limit 大于8(缺失值除外)時停止分箱,同時確保每一個分箱的樣本占比 count_distr_limit 不小于5%。當(dāng)然還能夠通過 breaks_list 手動設(shè)定分箱節(jié)點。
woebin 函數(shù)輸出的結(jié)果為多個 data.frame 組成的 list,可通過 data.table::rbindlist 或 dplyr::bind_rows 函數(shù)合并為一個數(shù)據(jù)框然后保存。當(dāng)然 woebin 函數(shù)也能夠直接輸出一個由分箱切割點組成的 list 并保存,下次使用時直接通過 woebin 函數(shù)對 breaks_list 參數(shù)對新的數(shù)據(jù)集進(jìn)行分箱。
woebin_adj 函數(shù)可逐個觀察每個變量的分箱情況。如果不滿意默認(rèn)的分箱結(jié)果,可以手動修改。最終返回一個經(jīng)過手動調(diào)整的分箱節(jié)點。
分箱之后,需要使用 woebin_ply 函數(shù)將訓(xùn)練集與測試集轉(zhuǎn)換為對應(yīng)的 woe 值。
# woe binning bins = woebin(dt, "creditability", print_step=0) ## [INFO] creating woe binning ... bins[[12]] ## variable bin count count_distr good bad badprob woe bin_iv total_iv breaks ## 1: other.installment.plans bank%,%stores 186 0.186 110 76 0.4086 0.4776 0.04594 0.05759 bank%,%stores ## 2: other.installment.plans none 814 0.814 590 224 0.2752 -0.1212 0.01166 0.05759 none ## is_special_values ## 1: FALSE ## 2: FALSE woebin_plot(bins[[12]]) ## $other.installment.plans?
# converting train and test into woe values dt_woe_list = lapply(dt_list, function(x) woebin_ply(x, bins)) ## [INFO] converting into woe values ...模型擬合
當(dāng)獲得了 woe 值替換之后的數(shù)據(jù)集,可以使用邏輯回歸進(jìn)行擬合,并通過AIC、LASSO等方法對變量進(jìn)一步篩選。下面使用基于 AIC 的逐步回歸進(jìn)一步篩選變量,最終得到了一個擁有13個變量的模型。
# lr m1 = glm( creditability ~ ., family = binomial(), data = dt_woe_list$train) # vif(m1, merge_coef = TRUE) # summary(m1)# Select a formula-based model by AIC (or by LASSO for large dataset) m_step = step(m1, direction="both", trace = FALSE) m2 = eval(m_step$call) vif(m2, merge_coef = TRUE) # summary(m2) ## variable Estimate Std. Error z value Pr(>|z|) gvif ## 1: (Intercept) -0.9448 0.1094 -8.639 0.0000 NA ## 2: status.of.existing.checking.account_woe 0.7756 0.1380 5.619 0.0000 1.042 ## 3: duration.in.month_woe 0.7963 0.2291 3.476 0.0005 1.181 ## 4: credit.history_woe 0.8308 0.2035 4.082 0.0000 1.064 ## 5: purpose_woe 0.8632 0.2755 3.133 0.0017 1.043 ## 6: credit.amount_woe 0.7669 0.2838 2.702 0.0069 1.251 ## 7: savings.account.and.bonds_woe 0.8545 0.2606 3.279 0.0010 1.039 ## 8: installment.rate.in.percentage.of.disposable.income_woe 1.8621 0.6822 2.730 0.0063 1.094 ## 9: other.debtors.or.guarantors_woe 2.1018 0.8922 2.356 0.0185 1.037 ## 10: age.in.years_woe 1.0154 0.3001 3.383 0.0007 1.033 ## 11: other.installment.plans_woe 0.7623 0.4347 1.754 0.0795 1.060 ## 12: housing_woe 0.7610 0.3665 2.077 0.0378 1.035模型評估
通過邏輯回歸獲得各變量的擬合系數(shù)之后,可以計算出各個樣本為壞客戶的概率,然后評估模型的預(yù)測效果。 perf_eva 函數(shù)能夠計算的評估指標(biāo)包括 mse, rmse, logloss, r2, ks, auc, gini,以及繪制多種可視化圖形 ks, lift, gain, roc, lz, pr, f1, density。
## predicted proability pred_list = lapply(dt_woe_list, function(x) predict(m2, x, type='response'))## performance perf = perf_eva(pred = pred_list, label = label_list) ## [INFO] The threshold of confusion matrix is 0.3133.?
評分卡刻度
當(dāng)我們獲得了各個變量的分箱結(jié)果,并且確定了最終進(jìn)入模型的變量以及系數(shù),則可以創(chuàng)建標(biāo)準(zhǔn)評分卡。
有了評分卡之后,可用于對新樣本進(jìn)行打分,從而評估該客戶的信用水平,并最終作出審批決策。
最后,評分卡模型的開發(fā)過程,還需要對模型的穩(wěn)定性進(jìn)行評估,即計算psi。
## scorecard card = scorecard(bins, m2) ## credit score score_list = lapply(dt_list, function(x) scorecard_ply(x, card))## psi perf_psi(score = score_list, label = label_list) ## $psi ## Null data.table (0 rows and 0 cols)以上代碼均可以在該項目的主頁獲取。
總結(jié)
以上是生活随笔為你收集整理的xieshiran:使用 R 语言开发评分卡模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Building credit scor
- 下一篇: 为什么腾讯的产品总能做得很好?