scorecardpy庫的使用簡介

  Python中信貸評分卡中常用的兩個庫有scorecardpy和Toad。其中scorecardpy是由謝士晨博士開發,Toad是由厚本金融風控團隊內部孵化產生的標準評分卡庫。關於Toad的使用,之前已經寫過學習教程,Toad庫使用教程,今天學習一下scorecardpy庫的使用。github鏈接見:
scorecardpy

  該軟件包是R軟件包評分卡的python版本。它的目標是通過提供一些常見任務的功能,使傳統信用風險計分卡模型的開發更加輕鬆有效。該包的功能及對應的函數如下:

  • 數據劃分(split_df)
  • 變量選擇(iv, var_filter)
  • 變量分箱(woebin, woebin_plot, woebin_adj, woebin_ply)
  • 評分轉換(scorecard, scorecard_ply)
  • 模型評估(perf_eva, perf_psi)

  首先,導入germancredit數據。

import scorecardpy as sc
dat = sc.germancredit()
dt_s = sc.var_filter(dat, y="creditability")

  這個函數可以根據指定的條件篩選變量,例如IV值、缺失率、一致性等,函數的參數如下:

def var_filter(dt, y, x=None, iv_limit=0.02, missing_limit=0.95, 
               identical_limit=0.95, var_rm=None, var_kp=None, 
               return_rm_reason=False, positive='bad|1')

var_rm:強制刪除變量的名稱
var_kp:強制保留變量的名稱
return_rm_reason:是否返回每個變量被刪除的原因
positive:壞樣本的標籤

數據劃分

train, test = sc.split_df(dt_s, 'creditability').values()
def split_df(dt, y=None, ratio=0.7, seed=186)

  該函數的ratio默認爲0.7,即按照7:3對數據集進行分割。ratio可以隨意進行設置,比如[0.5,0.2]

變量分箱

bins = sc.woebin(dt_s, y="creditability")
def woebin(dt, y, x=None, 
           var_skip=None, breaks_list=None, special_values=None, 
           stop_limit=0.1, count_distr_limit=0.05, bin_num_limit=8, 
           # min_perc_fine_bin=0.02, min_perc_coarse_bin=0.05, max_num_bin=8, 
           positive="bad|1", no_cores=None, print_step=0, method="tree",
           ignore_const_cols=True, ignore_datetime_cols=True, 
           check_cate_num=True, replace_blank=True, 
           save_breaks_list=None, **kwargs):

  返回的是每個變量的分箱結果組成的字典。

  woebin支持決策樹分箱、卡方分箱、自定義分箱,默認的WOE值計算是用壞樣本率/好樣本率,這個可以通過參數postive進行調整。如果某一箱只有好樣本或者壞樣本,會對缺失的類別賦予0.99進行調整,方便計算woe值。重要參數含義如下:

var_skip:指定不需要分箱的變量。
breaks_list:分割點的List。對分箱進行調整的時候用。可以進行自定義分箱
special_values:指定單獨的箱。
count_distr_limit:分箱結果中最小佔比。默認0.05
stop_limit:當IV值的增加值小於stop_limit或者卡方值小於qchisq(1-stoplimit, 1)時停止分割。
bin_num_limit:最大分箱數。
method:分箱方法,可以有"tree" or “chimerge”。
ignore_const_cols:是否忽略常數列。
check_cate_num:檢查分類變量中類別數是否大於50。
replace_blank:將空值替換爲None。

  sc.woebin_plot()可以畫出變量分箱之後的Bi_variate圖,這裏的壞樣本率圖展示了每一箱的好壞樣本數、樣本佔比、壞樣本率,比較清晰明瞭。

sc.woebin_plot(bins)

分箱調整

breaks_adj = sc.woebin_adj(dt_s, "creditability", bins) 
def woebin_adj(dt, y, bins, adj_all_var=False, special_values=None, method="tree", save_breaks_list=None, count_distr_limit=0.05)

重要參數的含義:

adj_all_var:是否顯示woe變量的單調性。

  其它參數和woebin()函數一樣,這裏沒有深入研讀調整分箱的代碼,而且運行過程中有報錯。猜測調整的方向是壞樣本率單調。
  此外也可以手動進行分箱調整:

breaks_adj = {
    'age.in.years': [26, 35, 40],
    'other.debtors.or.guarantors': ["none", "co-applicant%,%guarantor"]
}
bins_adj = sc.woebin(dt_s, y="creditability", breaks_list=breaks_adj)

woe轉換

  分箱之後需要對變量的原始值進行轉換,將變量值轉化成woe值,後續使用變量的WOE值入模進行訓練。

train_woe = sc.woebin_ply(train, bins_adj)
test_woe = sc.woebin_ply(test, bins_adj)

模型建立

y_train = train_woe.loc[:,'creditability']
X_train = train_woe.loc[:,train_woe.columns != 'creditability']
y_test = test_woe.loc[:,'creditability']
X_test = test_woe.loc[:,train_woe.columns != 'creditability']

# logistic regression ------
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(penalty='l1', C=0.9, solver='saga', n_jobs=-1)
lr.fit(X_train, y_train)
# lr.coef_
# lr.intercept_

# predicted proability
train_pred = lr.predict_proba(X_train)[:,1]
test_pred = lr.predict_proba(X_test)[:,1]

模型評估

train_perf = sc.perf_eva(y_train, train_pred, title = "train")
test_perf = sc.perf_eva(y_test, test_pred, title = "test")

def perf_eva(label, pred, title=None, groupnum=None, plot_type=["ks", "roc"], show_plot=True, positive="bad|1", seed=186)

  perf_eva()函數可以從KS、AUC、Lift曲線、PR曲線評估模型的效果。可以通過plot_type參數控制評估方法,可以選"ks", “lift”, “roc”, “pr”。s

評分映射

  模型評估之後,需要對概率進行映射,轉換成評分卡得分。得分包括每個客戶的最終得分和單個變量的得分。

card = sc.scorecard(bins_adj, lr, X_train.columns)

  scorecard()返回一個字典,對應的是基礎分和每個變量的得分。

def scorecard(bins, model, xcolumns, points0=600, odds0=1/19, pdo=50, basepoints_eq0=False)

  scorecard()函數的參數含義如下:

bins:分箱信息。woebin()返回的結果。
model:模型對象。
points0:基礎分,默認爲600。
odds:好壞比,默認爲1:19
pdo:比率翻番的倍數,默認爲50。
basepoints_eq0:如果爲True,則將基礎分分散到每個變量中。

評分穩定性評估–PSI

sc.perf_psi(
  score = {'train':train_score, 'test':test_score},
  label = {'train':y_train, 'test':y_test}
)

總結:對於想學習建模的新手來說,一套有效的腳本能夠幫助快速建立一張評分卡。本人在自學的過程中看了幾乎網上所有能找到的評分卡腳本,比較實用的還是之前github上的半自動建模包,自己也嘗試寫了一個評分卡腳本,終於算是入門完成。scorecardpy庫雖然封裝得很好,但是一旦運行過程中出現問題,調試起來仍然是件很麻煩的事情。對比起來,本人覺得半自動化建模的包更具有實用性,將鏈接附在下方,感興趣者可以學習。
建立一個評分卡模型的代碼包

【作者】:Labryant
【原創公衆號】:風控獵人
【簡介】:某創業公司策略分析師,積極上進,努力提升。乾坤未定,你我都是黑馬。
【轉載說明】:轉載請說明出處,謝謝合作!~

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