銀行風(fēng)控部門拿到一份貸款數(shù)據(jù):2000筆借款,回收率分布圖在1.0的位置突然冒出一根尖刺——全是全額還款的客戶。標準貝塔回歸(Beta Regression)在這里直接失效,因為它假設(shè)數(shù)據(jù)嚴格落在0到1之間,不包括端點。這篇文章用PyMC手搓一個"一膨脹貝塔"模型,把離散的全額還款和連續(xù)的部分還款塞進同一個似然函數(shù)里。
為什么標準工具會在這里翻車
![]()
先看清數(shù)據(jù)長什么樣。2000筆合成貸款中,約30%全額還款(repayment=1.0),剩下70%分散在0到1之間。畫成密度圖:主體是一條平滑的貝塔曲線,右側(cè)邊緣卻粘著一坨點質(zhì)量。
傳統(tǒng)方案兩頭不討好。邏輯回歸只認二元標簽——還了還是沒還,把"還了六成"和"還了九成"當成一回事。標準貝塔回歸更尷尬,它的支撐集是開區(qū)間(0,1),碰到確切的1.0直接報錯或數(shù)值爆炸。
金融風(fēng)控的真實需求是同時回答兩個問題:這人全額還款的概率有多大?如果沒全額還,預(yù)期能收回多少比例?兩個答案都得從同一批數(shù)據(jù)里摳出來。
一膨脹貝塔:把兩個分布縫在一起
模型的核心想法不復(fù)雜。每一筆貸款的回收率Y服從混合分布:以概率π取確定值1,以概率(1-π)從貝塔分布中抽樣。π本身又是借款人特征的函數(shù)——信用分越高、貸款價值比越低,全額還款概率越大。
用代碼語言說,似然函數(shù)是分段定義的:
當y=1時:log p(y) = log(π)
當0
貝塔分布的參數(shù)α、β也不是固定的,由均值θ和精度φ推導(dǎo):α=θφ,β=(1-θ)φ。θ同樣回歸于借款人特征,φ作為全局精度參數(shù)。
最終模型要估計三套東西:π的回歸系數(shù)(5個,含截距)、θ的回歸系數(shù)(5個,含截距)、精度φ(1個)。11個參數(shù)從2000個觀測值里同時反推,靠的就是PyMC的自動微分變分推斷(ADVI)或NUTS采樣器。
手搓似然:從pm.Potential到逐行實現(xiàn)
PyMC沒有內(nèi)置"一膨脹貝塔",但給了pm.Potential這個后門——直接把對數(shù)似然塞進圖模型。作者選擇更硬核的路線:用pytensor.tensor手寫了貝塔對數(shù)密度,再拼成完整似然。
關(guān)鍵代碼塊拆解如下。首先處理全額還款的示蹤變量:
![]()
obs_full = pt.eq(repayment_data, 1.0) # 布爾張量,標記哪些觀測是1.0
然后計算兩個分支的對數(shù)概率。全額還款分支簡單:就是logit_pi經(jīng)過logistic變換后的對數(shù)。部分還款分支需要完整的貝塔對數(shù)密度,包括伽馬函數(shù)和邊界處理。
最后把兩段縫起來:pt.switch(obs_full, log_prob_full, log_prob_partial)。這個switch操作在計算圖層面完成,保證梯度能正常回傳。
模型跑下來,2000個觀測、11個參數(shù),NUTS采樣2000次 tune=1000,在普通筆記本上幾分鐘收玫。arviz的診斷圖顯示R-hat全部接近1,沒有明顯的路徑依賴問題。
參數(shù)恢復(fù):合成數(shù)據(jù)的誠實測試
用合成數(shù)據(jù)的好處是知道"正確答案"。作者設(shè)定的真實參數(shù):π的截距0.5、信用分系數(shù)0.8、貸款價值比系數(shù)-0.6;θ的截距0.3、信用分系數(shù)0.5、貸款價值比系數(shù)-0.3;精度φ=5.0。
后驗均值與真實值的偏差控制在0.1個標準差以內(nèi)。信用分對全額還款概率的拉動效應(yīng)(0.8)被準確捕捉,貸款價值比的負面沖擊(-0.6)也沒有被稀釋。部分還款分支的參數(shù)同樣穩(wěn)健恢復(fù)。
這個誠實測試驗證了兩件事:模型設(shè)定沒有識別問題,PyMC的采樣器對這種分段似然處理得當。對于真實銀行數(shù)據(jù),只要把合成數(shù)據(jù)換成實際特征,同一套代碼直接可用。
從貸款回收推廣到更廣泛的"零一膨脹"問題
一膨脹貝塔的鏡像版本是零膨脹——比如醫(yī)療支出數(shù)據(jù)里大量零消費混雜著正數(shù)支出。同樣的分段似然技巧,把π換成零點的概率質(zhì)量即可。
更一般的框架是Tweedie分布或復(fù)合泊松-伽馬模型,但那些假設(shè)特定的指數(shù)族形式。一膨脹貝塔的優(yōu)勢在于靈活:π和θ可以各自綁定不同的特征集,甚至可以引入層次結(jié)構(gòu)處理多產(chǎn)品、多地域的貸款組合。
PyMC的自定義似然能力在這里是決定性因素。相比Stan需要手寫C++,或JAGS受限于內(nèi)置分布,PyMC的pytensor后端允許純Python級別的計算圖操作,同時保持自動微分和GPU加速的潛力。
這篇文章的完整代碼已打包成可交互Notebook,點擊原文徽章可直接在瀏覽器里跑。對于正在處理邊界點質(zhì)量問題的量化風(fēng)控團隊,這是一份可以直接落地的技術(shù)參考。
2000筆貸款、11個參數(shù)、兩段式似然——這個數(shù)字組合或許會成為你下一個風(fēng)控模型的起點。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.