戰(zhàn):從分箱到評(píng)分卡的Python風(fēng)控建模全解析)
1. 從信貸風(fēng)控到工具化scorecardpy到底解決了什么問題做信貸風(fēng)控的同學(xué)早晚都會(huì)碰到一個(gè)繞不開的課題評(píng)分卡。無論是信用卡申請(qǐng)?jiān)u分、消費(fèi)貸的貸前審批還是存量客戶的額度調(diào)整與風(fēng)險(xiǎn)定價(jià)幾乎都離不開這張卡。它本質(zhì)上是一種將客群的違約概率映射為整數(shù)分?jǐn)?shù)的模型讓業(yè)務(wù)人員看到分?jǐn)?shù)就能快速?zèng)Q策而不是面對(duì)一堆概率值無從下手。好幾年前我第一次獨(dú)立做評(píng)分卡項(xiàng)目時(shí)最痛苦的事情其實(shí)不是建模本身而是中間的臟活累活變量分箱要手動(dòng)寫一堆自定義函數(shù)、WOE和IV要逐個(gè)變量去算、分箱邊界不單調(diào)還要反復(fù)調(diào)參、生成最終的評(píng)分卡還要按步長(zhǎng)去計(jì)算每組得分。一輪流程走下來光數(shù)據(jù)清洗和變量處理就占了八成時(shí)間。后來接觸到scorecardpy這個(gè)Python庫(kù)算是把整個(gè)流程串起來了。它專門為評(píng)分卡建模設(shè)計(jì)覆蓋變量篩選、分箱、WOE編碼、IV評(píng)估、邏輯回歸擬合、評(píng)分卡生成與校驗(yàn)輸出一條流水線走完非常適合標(biāo)準(zhǔn)化的申請(qǐng)?jiān)u分卡或行為評(píng)分卡場(chǎng)景。這篇解讀我會(huì)按一個(gè)完整評(píng)分卡項(xiàng)目從數(shù)據(jù)到落地的順序把scorecardpy的設(shè)計(jì)思路、核心參數(shù)和實(shí)際坑位都過一遍。適合正要上手評(píng)分卡建模的數(shù)據(jù)分析師、風(fēng)控策略同學(xué)以及想用Python替代傳統(tǒng)SAS流程的建模人員。讀完你至少能跑通一條完整流程并理解每一步為什么要這么做。2. 評(píng)分卡建模的核心邏輯與scorecardpy的設(shè)計(jì)取舍2.1 評(píng)分卡為什么長(zhǎng)這樣從違約概率到分?jǐn)?shù)的映射在拆工具之前我們得先把評(píng)分卡本身的原理理清楚否則你很容易被各種參數(shù)繞暈。評(píng)分卡模型在統(tǒng)計(jì)層面通常是邏輯回歸。之所以不用復(fù)雜樹模型或神經(jīng)網(wǎng)絡(luò)核心原因是業(yè)務(wù)需要強(qiáng)解釋性和可追溯性。每一分的變化對(duì)應(yīng)哪些特征變化需要能給監(jiān)管和業(yè)務(wù)講清楚。邏輯回歸的預(yù)測(cè)結(jié)果是違約概率p但業(yè)務(wù)方不希望直接跟概率打交道更習(xí)慣用一個(gè)整數(shù)分?jǐn)?shù)。分?jǐn)?shù)和概率之間通過一個(gè)線性變換關(guān)聯(lián)score offset - factor * ln(p/(1-p))其中p/(1-p)是違約oddsoffset和factor是兩個(gè)常數(shù)。如果你要求一個(gè)基準(zhǔn)分?jǐn)?shù)對(duì)應(yīng)的基準(zhǔn)odds以及分?jǐn)?shù)每增加多少翻倍那么factor和offset都可以算出來。比如設(shè)定基準(zhǔn)分?jǐn)?shù)為600分基準(zhǔn)odds為50:1分?jǐn)?shù)每增加20分odds翻倍那么factor 20 / ln(2)約等于28.85offset 600 - factor * ln(50)。這些細(xì)節(jié)在scorecardpy里歸根到底就是offset_factor參數(shù)你想自定義就傳進(jìn)去不想自己算也可以直接用默認(rèn)。邏輯回歸的自變量一般不是原始特征值而是做過WOE編碼后的值。WOE全稱是Weight of Evidence也就是證據(jù)權(quán)重。它衡量的是某一分組內(nèi)好客戶odds相對(duì)于總體好客戶odds的差異WOE_i ln(壞客戶占比 / 好客戶占比)在做分箱之后每個(gè)箱子都會(huì)有一個(gè)WOE值。用WOE編碼的好處有兩個(gè)一是將分類型和連續(xù)型變量統(tǒng)一映射到同一量綱的數(shù)值二是天然處理了非線性關(guān)系比如年齡和違約率可能是U型關(guān)系分箱后WOE能直接捕捉這種形態(tài)。IV值Information Value則是每個(gè)變量的預(yù)測(cè)力度量等于每個(gè)箱子的WOE乘以該箱內(nèi)好壞客戶占比差再求和。IV值小于0.02一般認(rèn)為變量基本無預(yù)測(cè)力0.02到0.1為弱預(yù)測(cè)力0.1到0.3為中等大于0.3為強(qiáng)但太高也要警惕可能是變量泄漏或過度擬合。scorecardpy最核心的woebin函數(shù)干的事情之一就是幫你快速算出一堆變量的WOE和IV免去手動(dòng)分組比對(duì)。2.2 scorecardpy的架構(gòu)思路為什么它把整個(gè)流程封裝得這么深第一次用scorecardpy的人往往會(huì)被它的抽象程度驚訝到。一個(gè)woebin函數(shù)參數(shù)里塞進(jìn)去待分箱的DataFrame、目標(biāo)變量y、分箱方法method、分箱數(shù)初始值等等它就能把全部分箱結(jié)果一次性返回。這背后有兩個(gè)設(shè)計(jì)動(dòng)機(jī)。動(dòng)機(jī)一是典型評(píng)分卡建模流程高度標(biāo)準(zhǔn)化。從數(shù)據(jù)選擇、分箱、WOE編碼到模型訓(xùn)練雖然在每個(gè)環(huán)節(jié)都有各種方法論爭(zhēng)議比如分箱到底用卡方、決策樹還是等頻等距但整體骨架是固定的。一個(gè)足夠成熟的庫(kù)完全可以把這些流程封裝成高層接口讓建模人員專注于數(shù)據(jù)和業(yè)務(wù)理解本身。動(dòng)機(jī)二是業(yè)務(wù)項(xiàng)目對(duì)效率和可復(fù)現(xiàn)性要求很高。傳統(tǒng)SAS代碼做評(píng)分卡有時(shí)候一個(gè)變量分箱就要寫上百行宏而且要人工反復(fù)看分布去調(diào)邊界。scorecardpy用決策樹或者卡方方法自動(dòng)合并相鄰箱子幾分鐘跑完幾十個(gè)變量的分箱。我用它重新跑了之前SAS項(xiàng)目里四十幾個(gè)變量的數(shù)據(jù)集分箱結(jié)果和當(dāng)時(shí)人工調(diào)了幾個(gè)月的結(jié)論高度接近但肝度完全不是一個(gè)量級(jí)。但深封裝也意味著如果你不理解內(nèi)部機(jī)制出了奇怪結(jié)果很難排查。這也是我寫這篇解讀的初衷搞清楚參數(shù)背后在做什么才能真正用好這個(gè)工具。3. 核心環(huán)節(jié)實(shí)操?gòu)臄?shù)據(jù)到評(píng)分卡的全流程拆解3.1 數(shù)據(jù)準(zhǔn)備與變量篩選不是所有變量都能進(jìn)模型先加載一份模擬的信貸數(shù)據(jù)。數(shù)據(jù)經(jīng)過脫敏字段包括客戶年齡、收入、負(fù)債率、當(dāng)前逾期次數(shù)、歷史逾期次數(shù)、信用卡使用率、查詢次數(shù)、貸款用途、居住年限等目標(biāo)變量為target1代表違約0代表正常。接觸評(píng)分卡建模第一步不是急著跑模型而是先做變量篩選。scorecardpy提供了var_filter函數(shù)來粗篩變量。它有幾個(gè)關(guān)鍵參數(shù)iv_limit默認(rèn)0.02低于這個(gè)IV的變量會(huì)被剔除。但你也可以先把一批變量都放進(jìn)來做初步分箱看IV再?zèng)Q定保留哪些。missing_limit默認(rèn)0.95缺失率超過95%的變量直接剔除保留這種變量風(fēng)險(xiǎn)很大填充方式也容易引入偏差。identical_limit默認(rèn)0.95某個(gè)取值占比超過95%的變量也會(huì)被剔除這種變量相當(dāng)于常數(shù)。return_rm_reason設(shè)為True時(shí)函數(shù)會(huì)返回每個(gè)變量被剔除的原因方便后續(xù)做特征篩選報(bào)告。踩過最大的坑是粗篩時(shí)把target誤放進(jìn)特征里。如果一個(gè)業(yè)務(wù)上的運(yùn)營(yíng)指標(biāo)恰好和target強(qiáng)相關(guān)比如逾期客戶已經(jīng)被系統(tǒng)標(biāo)記該字段的IV可能接近幾百分箱結(jié)果好得驚人模型卻完全不可用。所以var_filter在篩選時(shí)一定要顯式排除目標(biāo)變量和主鍵ID。3.2 分箱的藝術(shù)woebin的自動(dòng)分箱與手動(dòng)干預(yù)分箱是評(píng)分卡建模的靈魂步驟。分箱是否合理直接決定WOE編碼能否真實(shí)反映變量與風(fēng)險(xiǎn)的關(guān)系也決定后續(xù)評(píng)分卡的業(yè)務(wù)可解釋性。scorecardpy里的woebin函數(shù)支持幾種分箱方法默認(rèn)方法基于決策樹的分箱。庫(kù)底層調(diào)用決策樹來做有監(jiān)督分箱讓樹找到最佳切分點(diǎn)再控制葉子節(jié)點(diǎn)數(shù)量。這種方法的優(yōu)點(diǎn)是自動(dòng)尋找非線性切分點(diǎn)缺點(diǎn)是過深時(shí)分箱結(jié)果容易過擬合。chimerge方法即卡方分箱。相鄰兩個(gè)箱子如果目標(biāo)分布差異不顯著就合并直到滿足停止條件。卡方分箱出來的邊界通常比較平滑但可能忽略一些模式。等距分箱和等頻分箱。這兩種屬于無監(jiān)督分箱僅按數(shù)值分布切分如果直接這么用很容易出現(xiàn)好客戶和壞客戶混雜嚴(yán)重的箱子后續(xù)IV會(huì)偏低。一般不推薦用作默認(rèn)方式但可以作為對(duì)比參考。實(shí)際建模時(shí)我通常的做法是先用默認(rèn)決策樹分箱跑一遍觀察每個(gè)箱子的WOE排序以及好壞樣本占比再手動(dòng)指定某些邊界。woebin里的breaks參數(shù)可以手工傳入分箱邊界比如年齡用[18,25,30,40,50,65]這樣業(yè)務(wù)解釋更強(qiáng)也方便后續(xù)在評(píng)審會(huì)上向策略同事展示。手動(dòng)干預(yù)最常做的另一件事是處理單調(diào)性問題。評(píng)分卡通常要求核心變量與風(fēng)險(xiǎn)呈單調(diào)關(guān)系但實(shí)際數(shù)據(jù)經(jīng)常會(huì)出現(xiàn)U型或者倒U型。比如年齡年輕人違約率高中年人違約率低到了退休年齡段可能又升高。如果分箱結(jié)果不單調(diào)可以考慮強(qiáng)制合并某些臨近箱子或者接受它作為分段型變量但謹(jǐn)慎解釋。scorecardpy沒有自動(dòng)強(qiáng)制單調(diào)的開關(guān)你需要基于分箱結(jié)果決定要不要調(diào)用woebin_adj函數(shù)去人工調(diào)整。woebin_adj會(huì)以交互方式展示每個(gè)變量的分箱圖和控制選項(xiàng)你可以手動(dòng)修改箱數(shù)、合并箱子、調(diào)整邊界。當(dāng)時(shí)我在某個(gè)項(xiàng)目里處理收入變量時(shí)數(shù)據(jù)前1%是大額多筆收入導(dǎo)致第一個(gè)箱子WOE異常用woebin_adj直接把極端高收入段合并到了下一個(gè)箱子整個(gè)單調(diào)性立刻順暢了。3.3 WOE編碼與IV結(jié)果分析數(shù)據(jù)長(zhǎng)什么樣心里要有底分箱完成后scorecardpy返回一個(gè)DataFrame里面包含每個(gè)變量的分箱邊界、計(jì)數(shù)、好壞占比、WOE和IV信息。這個(gè)結(jié)果結(jié)構(gòu)非常清晰每一行是一個(gè)箱子主要字段有variable變量名稱bin分箱區(qū)間標(biāo)簽比如[-Inf,30)表示小于30歲的區(qū)間count、count_dist該箱樣本量和占總體的比例good、bad、good_dist、bad_dist好壞樣本量以及各自占比woe該箱的WOE值iv該變量累計(jì)IV值把這些信息可視化之后你會(huì)發(fā)現(xiàn)很多有趣的現(xiàn)象。比如信用卡使用率這個(gè)變量通常使用率高的箱子WOE為正且絕對(duì)值大意味壞占比高這個(gè)變量在評(píng)分卡里往往是強(qiáng)變量。再比如查詢次數(shù)查詢較多的客戶可能近期資金緊張違約風(fēng)險(xiǎn)因此更高。要注意一點(diǎn)IV高不代表你就要無腦放進(jìn)去必須檢查變量是否有時(shí)間穿透、是否包含純未來信息以及業(yè)務(wù)上是否允許使用。某些強(qiáng)變量比如過去12個(gè)月貸款審批通過次數(shù)可能在貸中審核時(shí)點(diǎn)根本拿不到更新值上線后就已經(jīng)過時(shí)了。WOE編碼之后的數(shù)據(jù)集會(huì)替換原始特征這部分由woebin_ply函數(shù)完成。它有參數(shù)to_woe如果設(shè)為True就返回WOE編碼后的DataFrame設(shè)為False則返回原始值加WOE值的對(duì)照DataFrame。通常建模前我會(huì)用to_woeTrue因?yàn)檫壿嫽貧w輸入需要的是數(shù)值型WOE。3.4 模型擬合與逐步回歸從候選變量到可用模型生成WOE數(shù)據(jù)集之后下一步是訓(xùn)練邏輯回歸。直接簡(jiǎn)單粗暴地往邏輯回歸里扔幾十個(gè)變量顯然不行共線性問題會(huì)讓系數(shù)極不穩(wěn)定解釋性也大打折扣。scorecardpy提供了glm訓(xùn)練函數(shù)它其實(shí)是基于標(biāo)準(zhǔn)邏輯回歸加逐步特征選擇。這個(gè)函數(shù)有幾個(gè)值得注意的設(shè)計(jì)輸入訓(xùn)練集X_train是WOE編碼后的數(shù)據(jù)y_train是0/1標(biāo)簽。內(nèi)部會(huì)計(jì)算每個(gè)候選變量的IV然后按IV從高到低的方式逐批次引入變量同時(shí)做AIC或BIC評(píng)估從而篩選出最終進(jìn)入模型的變量組合。輸出結(jié)果中coefficients和selected_vars兩個(gè)結(jié)果會(huì)展示最終保留的變量及系數(shù)。曾經(jīng)有一次我用了某個(gè)外部變量分箱和WOE都很完美但進(jìn)入逐步回歸后始終保留著我發(fā)現(xiàn)它在業(yè)務(wù)上解釋不通——它的高IV完全來自特定人群的冗余信息。后來加了限制不讓該變量進(jìn)入候選集換用另一個(gè)強(qiáng)解釋性變量模型在驗(yàn)證集上的穩(wěn)定性反而更好。這說明自動(dòng)篩選只能輔助決策最終變量去留必須結(jié)合業(yè)務(wù)判斷。訓(xùn)練結(jié)束后可以順手看下模型的AUC和KS統(tǒng)計(jì)量這兩個(gè)指標(biāo)是評(píng)分卡最常見的判斷標(biāo)準(zhǔn)。AUC通常0.7到0.8之間算可用KS在0.3以上模型就有區(qū)分度了。但如果訓(xùn)練集上AUC超過0.95就要警惕是不是明顯過擬合看下是不是有變量泄漏進(jìn)了特征。3.5 從概率到評(píng)分卡scorecard生成與分?jǐn)?shù)落點(diǎn)分析模型訓(xùn)練只是前半場(chǎng)后半場(chǎng)是把邏輯回歸系數(shù)轉(zhuǎn)換成分?jǐn)?shù)。scorecardpy里的scorecard函數(shù)傳入擬合好的模型以及分箱映射關(guān)系就會(huì)返回評(píng)分卡格式的結(jié)果。評(píng)分卡輸出形式一般是一個(gè)字典鍵為變量名值為每個(gè)分箱對(duì)應(yīng)的分?jǐn)?shù)明細(xì)表。根據(jù)scorecardpy的映射規(guī)則分?jǐn)?shù)通常是從一個(gè)基礎(chǔ)分出發(fā)加上每個(gè)變量分組對(duì)應(yīng)的正負(fù)分?jǐn)?shù)。最終客戶總分等于基礎(chǔ)分加各變量得分之和總分越高代表風(fēng)險(xiǎn)越低。生成分?jǐn)?shù)后默認(rèn)情況下scorecardpy還會(huì)計(jì)算每個(gè)客戶的總分前提是你傳入測(cè)試數(shù)據(jù)集并調(diào)用predict方法。我個(gè)人習(xí)慣立刻跑一下分?jǐn)?shù)分布看是否存在明顯的分?jǐn)?shù)斷層。如果大量人群集中在分?jǐn)?shù)區(qū)間邊緣可能說明模型的區(qū)分粒度不夠需要回頭調(diào)整分箱邊界或變量組合。打分完成后還要做分?jǐn)?shù)校準(zhǔn)。前面提到的offset和factor在scorecardpy里對(duì)應(yīng)scorecard函數(shù)的offset_factor參數(shù)。如果你不傳函數(shù)默認(rèn)按某些默認(rèn)值計(jì)算也就是基準(zhǔn)分?jǐn)?shù)為600基準(zhǔn)odds為50比1PDO為20。這和國(guó)內(nèi)很多實(shí)際使用的標(biāo)準(zhǔn)不太一樣所以一定要根據(jù)自己業(yè)務(wù)目標(biāo)去設(shè)置。比如某些消費(fèi)金融公司把客戶違約率萬分之幾作為好客戶標(biāo)準(zhǔn)分?jǐn)?shù)映射邏輯就會(huì)不同。當(dāng)時(shí)我把一個(gè)模型的基準(zhǔn)分?jǐn)?shù)從600調(diào)整為650整個(gè)客群的分?jǐn)?shù)分布右移審批閾值跟著變動(dòng)最終通過率完全變了。這說明分?jǐn)?shù)變換參數(shù)直接影響業(yè)務(wù)口徑不是可有可無的細(xì)節(jié)你必須和策略同事或跟蹤上線管理的人對(duì)齊。4. 上手實(shí)操跑通一整套評(píng)分卡建模流程4.1 環(huán)境準(zhǔn)備與基礎(chǔ)安裝先準(zhǔn)備好環(huán)境。scorecardpy對(duì)Python版本要求不算苛刻一般3.7以上都可以用。安裝方式除了從PyPI下載也可以通過代碼倉(cāng)庫(kù)的版本安裝這里我直接使用最常見的安裝命令配合國(guó)內(nèi)鏡像會(huì)更快pip install scorecardpy如果下載速度慢可以用國(guó)內(nèi)鏡像源常見的清華源、阿里源都可以加速pip install scorecardpy -i https://pypi.tuna.tsinghua.edu.cn/simple在導(dǎo)入階段有些新版本會(huì)提示依賴項(xiàng)缺少比如sklearn或pandas版本不匹配這種情況只要把相關(guān)依賴重新升級(jí)一下就行。順便提一句安裝庫(kù)之后最好看一下版本號(hào)后續(xù)使用過程中不同版本之間可能有細(xì)微參數(shù)差異。4.2 用自帶示例數(shù)據(jù)集快速跑通scorecardpy內(nèi)部帶了一個(gè)示例數(shù)據(jù)集非常適合第一次跑通全流程。你只需要幾行代碼就能完成分箱和WOE模塊的調(diào)用import scorecardpy as sc dat sc.germancredit() y dat[creditability] X dat.drop(columnscreditability) # 變量粗篩 dt_sel sc.var_filter(dat, yy, iv_limit0.02, missing_limit0.95, identical_limit0.95, return_rm_reasonTrue) # 分箱 bins sc.woebin(dt_sel, yy) # WOE編碼 train_woe sc.woebin_ply(dt_sel, bins)上面這幾行就已經(jīng)完成了數(shù)據(jù)篩選、分箱和WOE編碼三步。打印bins里任何一個(gè)變量的分箱結(jié)果都能看到詳細(xì)的WOE和IV統(tǒng)計(jì)我建議第一次練習(xí)時(shí)逐字段觀察一下培養(yǎng)感覺。如果你把bins傳給woebin_plot函數(shù)它會(huì)把每個(gè)變量的分布圖、好壞占比、WOE趨勢(shì)畫在一張圖上直觀看到變量和風(fēng)險(xiǎn)的關(guān)系形態(tài)。這個(gè)可視化在寫評(píng)審材料時(shí)特別有用比貼一堆數(shù)據(jù)表格強(qiáng)得多。4.3 從訓(xùn)練到評(píng)分卡的完整腳本我給出一個(gè)平時(shí)常用的完整建模腳本處理好數(shù)據(jù)后你可以直接參考著改寫import scorecardpy as sc from sklearn.model_selection import train_test_split # 設(shè)示例數(shù)據(jù) dat sc.germancredit() y dat[creditability] X dat.drop(columnscreditability) # 粗篩 X_sel, y_sel sc.var_filter(X, y, iv_limit0.05, missing_limit0.9, identical_limit0.9, return_rm_reasonFalse) # 分箱 bins sc.woebin(X_sel, y_sel) # WOE轉(zhuǎn)換 woe_data sc.woebin_ply(X_sel, bins) # 劃分訓(xùn)練集和測(cè)試集 train, test train_test_split(woe_data, test_size0.3, stratifyy_sel, random_state42) X_train train.drop(columnscreditability) y_train train[creditability] X_test test.drop(columnscreditability) y_test test[creditability] # 邏輯回歸與逐步篩選 m1 sc.glm(X_train, y_train) # 在測(cè)試集上評(píng)估 pred m1.predict(X_test)整體流程走下來你會(huì)發(fā)現(xiàn)scorecardpy把過去手工需要寫幾百行代碼的環(huán)節(jié)壓縮到了十幾行。但正因?yàn)樽銐蚩炷愀桦S手就交付風(fēng)險(xiǎn)。每一輪產(chǎn)出之后都建議回頭人工檢查分箱是否合理、WOE編碼是否跟業(yè)務(wù)認(rèn)知一致、模型系數(shù)符號(hào)是否符合預(yù)期。4.4 生成評(píng)分卡和分?jǐn)?shù)解釋模型訓(xùn)練完之后生成評(píng)分卡的代碼同樣非常簡(jiǎn)短# 生成評(píng)分卡 card sc.scorecard(binsbins, modelm1, points0600, odds050, pdo20) # 給樣本打分 score sc.scorecard_ply(woe_data, card) # 查看評(píng)分卡明細(xì) print(card)打印card之后你會(huì)看到一個(gè)很直觀的對(duì)照表每個(gè)變量每個(gè)分箱區(qū)間都對(duì)應(yīng)該變量的加分或減分。比如年齡變量30到40歲區(qū)間可能加10分而25歲以下區(qū)間可能是減15分。最終客戶分?jǐn)?shù)就是基礎(chǔ)分加各變量得分的累加。打分這個(gè)環(huán)節(jié)還有一個(gè)常見需求是把分?jǐn)?shù)映射成概率違約等級(jí)比如A/B/C/D等級(jí)。最簡(jiǎn)單的方法是直接把預(yù)測(cè)概率的輸出保留下來再按概率閾值切等級(jí)。但既然已經(jīng)生成了整數(shù)分?jǐn)?shù)也可以直接用分?jǐn)?shù)分位數(shù)去切等級(jí)這個(gè)開源工具不直接提供等級(jí)映射功能需要自己處理。如果要做更細(xì)致的校準(zhǔn)可以對(duì)比每個(gè)分?jǐn)?shù)段客戶的實(shí)際違約率與理論違約率。理想狀態(tài)下二者應(yīng)該一致或接近。假如預(yù)測(cè)違約率整體偏低意味著概率校準(zhǔn)有問題這時(shí)需要檢查邏輯回歸是否存在明顯的偏差或者分?jǐn)?shù)映射的基準(zhǔn)odds設(shè)置不合理。5. 常見問題與排查技巧這些坑我都替你踩過5.1 分箱結(jié)果異常WOE全部為0或IV過高新手最常見的問題是跑完woebin后某變量的IV直接爆表或者WOE全是0。前者通常是變量和目標(biāo)之間過于對(duì)應(yīng)的信號(hào)比如一個(gè)狀態(tài)字段里目標(biāo)為1的樣本全都在某個(gè)取值區(qū)間內(nèi)分箱后該區(qū)間壞占比為100%WOE會(huì)趨向無窮大。這種變量一旦進(jìn)模型會(huì)出現(xiàn)完美分離現(xiàn)象邏輯回歸系數(shù)無法收斂。排查時(shí)可以將這類變量拿出來單獨(dú)交叉分析確認(rèn)它在未來數(shù)據(jù)上是否可獲取、是否有意義。WOE全為0則往往是因?yàn)樽兞勘旧頉]有區(qū)分能力每個(gè)箱子的好壞占比都和總體一致導(dǎo)致每個(gè)箱子的ln(1)等于0。如果你看到所有變量都這樣大概率是目標(biāo)變量傳錯(cuò)了比如把訓(xùn)練集中目標(biāo)列全部傳成同一個(gè)值或者分箱參數(shù)設(shè)置過粗導(dǎo)致每個(gè)箱子都只有一個(gè)類別。調(diào)試的時(shí)候建議先用少量變量跑一次分箱并打印結(jié)果確認(rèn)單變量邏輯沒問題后再全量跑幾十個(gè)變量這樣能大幅縮短排查時(shí)間。5.2 預(yù)測(cè)函數(shù)和變量名列不一致實(shí)際項(xiàng)目中最常遇到的報(bào)錯(cuò)之一是predict時(shí)提示變量缺失原因是woebin_ply生成的訓(xùn)練集列名和預(yù)測(cè)時(shí)傳入數(shù)據(jù)集的列名不一致比如訓(xùn)練時(shí)你傳入了原始字段名預(yù)測(cè)時(shí)卻傳入了已經(jīng)處理過的其他字段名或者分箱對(duì)象bins來自舊數(shù)據(jù)。解決方案是維護(hù)一個(gè)統(tǒng)一的變量映射字典確保每次建模和預(yù)測(cè)過程使用同一個(gè)配置字典。另外當(dāng)數(shù)據(jù)有類別型字段時(shí)分箱和預(yù)測(cè)時(shí)的category順序也必須保持一致否則WOE映射會(huì)錯(cuò)位這個(gè)非常隱蔽打印幾行預(yù)測(cè)數(shù)據(jù)對(duì)比一下就知道問題出在哪。5.3 缺失值處理和特殊值的分箱邏輯評(píng)分卡建模中缺失值不能直接在邏輯回歸里被忽略否則會(huì)影響預(yù)測(cè)穩(wěn)定性。scorecardpy的分箱會(huì)自動(dòng)把缺失值單獨(dú)歸為一個(gè)箱子這樣缺失本身就擁有一個(gè)獨(dú)立的WOE值可以成為一個(gè)有實(shí)際含義的變量狀態(tài)。這種做法其實(shí)很實(shí)用因?yàn)槿笔凳究蛻粜畔⒉煌暾?、申?qǐng)漏填或者渠道差異天生就有風(fēng)險(xiǎn)識(shí)別能力。但如果缺失率太高比如超過了95%var_filter會(huì)直接剔除該變量。有些時(shí)候缺失率雖然高但缺失本身非常強(qiáng)此時(shí)你可以用業(yè)務(wù)規(guī)則重新定義一下變量比如把是否缺失轉(zhuǎn)換為一個(gè)新的標(biāo)志字段再去參加分箱這種嘗試往往有意想不到的效果。經(jīng)驗(yàn)法則是缺失占比在5%到50%之間的變量保留缺失組信息超過50%再結(jié)合具體業(yè)務(wù)判斷不能一刀切低于5%可以先做填充再分箱否則缺失組樣本太少WOE也不穩(wěn)定。5.4 評(píng)分卡上線前的樣本外驗(yàn)證訓(xùn)練集上的指標(biāo)再漂亮也不能代表未來評(píng)分卡上線前必須在時(shí)間外樣本或者至少隨機(jī)留出的測(cè)試集上跑一遍。我習(xí)慣使用時(shí)間外數(shù)據(jù)來做驗(yàn)證因?yàn)樵u(píng)分卡業(yè)務(wù)對(duì)時(shí)間穩(wěn)定性特別敏感。某個(gè)人群在不同月份的違約率波動(dòng)可能很大如果時(shí)間外樣本的KS和AUC掉得厲害基本可以認(rèn)定為模型過擬合了歷史模式。另外一個(gè)容易被忽略的檢查是PSI也就是群體穩(wěn)定性指標(biāo)。對(duì)比訓(xùn)練樣本和未來樣本的分?jǐn)?shù)分布PSI小于0.1說明兩個(gè)集合分布非常穩(wěn)定0.1到0.25說明有輕微偏移需要關(guān)注大于0.25則提示模型可能需要重新開發(fā)或者至少要做分?jǐn)?shù)校準(zhǔn)。scorecardpy本身不直接提供PSI計(jì)算但你可以基于scorecard_ply生成的分?jǐn)?shù)分位數(shù)去快速實(shí)現(xiàn)代碼量不大。5.5 變量共線性處理不只是看相關(guān)系數(shù)邏輯回歸雖然能容忍一定程度的相關(guān)性但高度共線會(huì)讓系數(shù)估計(jì)極不穩(wěn)定。具體表現(xiàn)是某個(gè)變量的系數(shù)符號(hào)和業(yè)務(wù)常識(shí)相反例如收入越高反而風(fēng)險(xiǎn)分?jǐn)?shù)越低。scorecardpy的逐步回歸會(huì)基于AIC篩選變量但它不會(huì)完全自動(dòng)消除共線性問題。我的做法是在喂給glm之前先計(jì)算所有WOE編碼后變量的方差膨脹因子VIF把VIF大于10的變量單獨(dú)篩選出來。如果兩個(gè)變量同時(shí)進(jìn)入候選集且相關(guān)性很高保留解釋性更強(qiáng)、邏輯業(yè)務(wù)上更好講述的那個(gè)。比如負(fù)債率和月收入可能高度相關(guān)保留負(fù)債率往往比保留月收入解釋性更順因?yàn)樨?fù)債率已有標(biāo)準(zhǔn)定義在策略評(píng)審中可講的故事更完整。這里提醒一句VIF計(jì)算要在WOE編碼后做而不是原始值上做。原始值尺度和分箱化后的形態(tài)差異巨大用原始值計(jì)算VIF容易得到錯(cuò)誤的絕對(duì)值。6. 擴(kuò)展應(yīng)用與落地經(jīng)驗(yàn)總結(jié)評(píng)分卡建模工具說到底只是解放生產(chǎn)力的工具真正決定模型質(zhì)量的還是你對(duì)業(yè)務(wù)的理解和建模流程的把握。scorecardpy最值得稱道的地方在于它將繁瑣流程標(biāo)準(zhǔn)化讓模型復(fù)用和迭代的成本大幅降低。我后來幾個(gè)不同項(xiàng)目之間只需要調(diào)整變量清單和分箱邊界模型框架就可以快速遷移歷史方法論也能直接沉淀到工具配置中。如果你覺得scorecardpy在某些環(huán)節(jié)不夠靈活它的模塊設(shè)計(jì)是拆開的你可以只使用它的woebin分箱和WOE編碼部分然后自己用statsmodels或者sklearn訓(xùn)練邏輯回歸最后再用自定義函數(shù)生成評(píng)分卡。這種方式保留了自動(dòng)分箱的效率同時(shí)把模型訓(xùn)練的細(xì)節(jié)掌控在自己手里。引用一句業(yè)內(nèi)的老話評(píng)分卡建模中最難的不是數(shù)學(xué)而是把業(yè)務(wù)邏輯轉(zhuǎn)化成可解釋的分?jǐn)?shù)和規(guī)則。多看看分箱圖、多和策略同事討論變量邏輯、多復(fù)盤線上表現(xiàn)與預(yù)期差異比調(diào)包參數(shù)本身更重要。我個(gè)人的習(xí)慣是每次建模完之后都會(huì)把最后生成的評(píng)分卡表格打印出來貼在工位旁邊過幾天再回頭瞄一眼。很多時(shí)候你盯著屏幕寫代碼時(shí)會(huì)忽略某個(gè)變量分?jǐn)?shù)的業(yè)務(wù)合理性但人肉看一遍紙質(zhì)版反而容易發(fā)現(xiàn)邏輯漏洞。這個(gè)方法聽起來很笨但確實(shí)幫我避免過至少一次嚴(yán)重的事故。scorecardpy的生態(tài)還在持續(xù)迭代社區(qū)里關(guān)于它的討論也越來越多。如果你用它跑過真實(shí)業(yè)務(wù)數(shù)據(jù)有自己獨(dú)特的分箱調(diào)整心得非常值得沉淀下來分享。工具是標(biāo)準(zhǔn)化的但每個(gè)人的業(yè)務(wù)理解不同這些差異化經(jīng)驗(yàn)才是模型效果的真正分水嶺。