控?cái)?shù)據(jù)科學(xué)實(shí)戰(zhàn):從特征工程到評(píng)分卡與模型監(jiān)控)
做信貸風(fēng)控這行快十年了從最早用SAS跑邏輯回歸到后來在集群上用PySpark跑LightGBM說實(shí)話很多人問我“大數(shù)據(jù)技術(shù)到底在風(fēng)控里起了多大作用”我一直覺得這個(gè)問題問得不好——真正的問題應(yīng)該是“數(shù)據(jù)科學(xué)在風(fēng)控里到底怎么落地才能不讓業(yè)務(wù)部門和合規(guī)部門把你建模的東西按在地上摩擦”。這篇不是通用科普是一個(gè)完整的實(shí)戰(zhàn)復(fù)盤從數(shù)據(jù)底座、樣本設(shè)計(jì)、特征工程、模型選擇到上線監(jiān)控和解釋性要求把一套真實(shí)可跑的金融風(fēng)控?cái)?shù)據(jù)科學(xué)方案拆給你看。適合準(zhǔn)備入行風(fēng)控建模、或者已經(jīng)在做數(shù)據(jù)科學(xué)但想往金融場景轉(zhuǎn)的同學(xué)也適合業(yè)務(wù)團(tuán)隊(duì)里想了解模型在風(fēng)控體系中定位的朋友。1. 項(xiàng)目概述大風(fēng)控場景下數(shù)據(jù)科學(xué)的定位1.1 核心需求解析風(fēng)控到底需要什么金融風(fēng)控是一個(gè)極復(fù)雜的大系統(tǒng)數(shù)據(jù)科學(xué)在里面負(fù)責(zé)的環(huán)節(jié)簡單說就一句話把無序的用戶行為數(shù)據(jù)變成有序的風(fēng)險(xiǎn)判斷。但這句話背后藏著的需求層次往往被外界低估了。首先是反欺詐層。黑產(chǎn)團(tuán)伙的作弊行為不是勻速發(fā)生的而是脈沖式、團(tuán)伙式的識(shí)別這類風(fēng)險(xiǎn)需要的數(shù)據(jù)維度非常多設(shè)備指紋、IP關(guān)聯(lián)、注冊(cè)時(shí)間、操作頻次、收款賬戶關(guān)聯(lián)關(guān)系等單靠一兩張表根本做不了。其次是信用風(fēng)險(xiǎn)評(píng)估層也就是判斷一個(gè)用戶“還不起錢”的概率這一層依賴的數(shù)據(jù)更多消費(fèi)行為、社交特征、第三方征信數(shù)據(jù)、歷史借貸記錄、甚至App操作習(xí)慣的細(xì)節(jié)。最后是貸后管理層的應(yīng)用比如賬齡滾動(dòng)分析、催收策略模型這些也需要數(shù)據(jù)科學(xué)參與。這個(gè)項(xiàng)目的核心需求可以拆成三塊數(shù)據(jù)整合能力把來自十幾個(gè)數(shù)據(jù)源、幾十個(gè)系統(tǒng)的散亂數(shù)據(jù)統(tǒng)一接入形成可分析的特征寬表。模型建設(shè)與迭代能力用可解釋性強(qiáng)、穩(wěn)定性好、效果達(dá)標(biāo)的模型完成信用評(píng)分、反欺詐打分、額度定價(jià)等任務(wù)。監(jiān)控與治理能力模型上線不是終點(diǎn)風(fēng)控模型必須可監(jiān)控、可回溯、可解釋否則監(jiān)管一查一個(gè)準(zhǔn)。這三塊需求相互依賴。數(shù)據(jù)整合做不好特征就是無源之水模型建設(shè)做不好數(shù)據(jù)整合就白費(fèi)監(jiān)控治理做不好前面的成果隨時(shí)可能被合規(guī)挑戰(zhàn)推翻。所以做這一行千萬別把自己定位成“只調(diào)模型參數(shù)的人”那是最不值錢的位置。1.2 為什么風(fēng)控行業(yè)是數(shù)據(jù)科學(xué)應(yīng)用的最佳戰(zhàn)場金融風(fēng)控和別的數(shù)據(jù)科學(xué)應(yīng)用場景有一個(gè)本質(zhì)區(qū)別它同時(shí)具備高價(jià)值、高數(shù)據(jù)質(zhì)量要求、強(qiáng)規(guī)則約束、高試錯(cuò)成本四個(gè)特征。以推薦系統(tǒng)為例建模用戶興趣推薦錯(cuò)了頂多用戶不點(diǎn)推薦對(duì)了就賺錢模型收益是連續(xù)緩變的。但風(fēng)控不是審批一筆貸款如果模型把壞人放進(jìn)來損失可能遠(yuǎn)超這筆貸款賺的利息如果模型把好人誤殺又會(huì)直接損失業(yè)務(wù)量。這就是為什么風(fēng)控既不能“抓得嚴(yán)到?jīng)]業(yè)務(wù)”也不能“放得寬出風(fēng)險(xiǎn)”必須在風(fēng)險(xiǎn)和業(yè)務(wù)增長之間找那個(gè)最優(yōu)解。另外金融風(fēng)控對(duì)模型的可解釋性有硬性要求。歐盟GDPR里有“解釋權(quán)”條款國內(nèi)雖然沒有完全相同的規(guī)定但監(jiān)管對(duì)金融機(jī)構(gòu)的模型管理、客戶權(quán)益保護(hù)同樣有明確要求模型對(duì)客戶做不利決策時(shí)必須有合理解釋。這一點(diǎn)決定了風(fēng)控建模里永遠(yuǎn)有傳統(tǒng)機(jī)器學(xué)習(xí)的一席之地有些場景你塞個(gè)深度學(xué)習(xí)黑盒進(jìn)去業(yè)務(wù)和合規(guī)分分鐘把你打回重做。數(shù)據(jù)科學(xué)在這個(gè)行業(yè)里的核心價(jià)值不只是預(yù)測(cè)準(zhǔn)確率而是在約束條件下給出最優(yōu)的風(fēng)險(xiǎn)定價(jià)和策略。理解了這一點(diǎn)再做技術(shù)選型、方案設(shè)計(jì)思路就清楚很多。2. 整體架構(gòu)與技術(shù)選型大數(shù)據(jù)底座怎么搭2.1 數(shù)據(jù)接入與存儲(chǔ)從十幾張表到一張寬表金融場景的數(shù)據(jù)鏈路大致長這樣核心交易系統(tǒng)產(chǎn)生訂單數(shù)據(jù)用戶行為采集系統(tǒng)產(chǎn)生埋點(diǎn)日志第三方征信機(jī)構(gòu)返回外部數(shù)據(jù)反欺詐系統(tǒng)記錄設(shè)備信息催收系統(tǒng)記錄貸后表現(xiàn)。這些數(shù)據(jù)不能直接拿給模型用因?yàn)樗鼈兎植荚诓煌黝}、不同粒度的表中需要先經(jīng)過采集、清洗、加工三個(gè)階段。采集層如果公司規(guī)模不大可以用Canal監(jiān)聽MySQL Binlog配合Kafka做消息隊(duì)列保證數(shù)據(jù)實(shí)時(shí)或準(zhǔn)實(shí)時(shí)地進(jìn)入數(shù)倉如果數(shù)據(jù)規(guī)模再上一點(diǎn)就用更完整的實(shí)時(shí)計(jì)算鏈路。我當(dāng)時(shí)接手項(xiàng)目的時(shí)候團(tuán)隊(duì)已經(jīng)有了一套基于KafkaFlink的實(shí)時(shí)數(shù)倉訂單數(shù)據(jù)從發(fā)生到進(jìn)入特征計(jì)算延遲控制在1分鐘左右這對(duì)反欺詐場景非常關(guān)鍵。存儲(chǔ)層核心是分層設(shè)計(jì)我習(xí)慣用經(jīng)典數(shù)倉分層ODS層存原始數(shù)據(jù)DWD層做清洗和標(biāo)準(zhǔn)化DWS層做明細(xì)匯總ADS層面向應(yīng)用。這套分層的核心價(jià)值有兩個(gè)一是讓不同團(tuán)隊(duì)有明確的職責(zé)邊界避免互相污染二是讓數(shù)據(jù)血緣清晰出了問題能快速定位。在存儲(chǔ)選型上方案是Hive做離線批處理 HBase做實(shí)時(shí)明細(xì)查詢 ClickHouse做即席分析和特征服務(wù)查詢。離線訓(xùn)練數(shù)據(jù)用Hive跑量大且離線容忍高延遲實(shí)時(shí)規(guī)則引擎和模型服務(wù)需要毫秒級(jí)查詢用戶畫像數(shù)據(jù)用HBase和Redis做KV存儲(chǔ)更合適ClickHouse則用來支撐風(fēng)控大屏和運(yùn)營分析真的很能跑。2.2 模型開發(fā)環(huán)境離線訓(xùn)練與在線推理的接口設(shè)計(jì)可能有人覺得搞數(shù)據(jù)科學(xué)的大頭在算法環(huán)境配置沒技術(shù)含量。實(shí)際上風(fēng)控模型上線最大的坑往往是離線訓(xùn)練環(huán)境和在線推理環(huán)境版本不一致。經(jīng)典的坑是這樣踩的日志在Notebook里用1.4.2版本的xgboost訓(xùn)練出了模型文件但模型服務(wù)端的Python環(huán)境是1.1.0加載模型直接報(bào)錯(cuò)。重裝版本服務(wù)端的容器依賴已經(jīng)鎖定改一個(gè)包可能連帶其他服務(wù)掛掉。最后只能把模型服務(wù)單獨(dú)做了一個(gè)Docker鏡像固定依賴版本才徹底解決。我的建議是從第一天起就把模型服務(wù)當(dāng)工程做訓(xùn)練環(huán)境和推理環(huán)境統(tǒng)一用Docker容器鎖版本號(hào)禁止漂移。模型文件建議統(tǒng)一用PMML或ONNX格式導(dǎo)出跨語言部署時(shí)超方便。但因?yàn)長ightGBM的PMML導(dǎo)出對(duì)某些自定義評(píng)價(jià)函數(shù)支持不好我后來更傾向于“訓(xùn)練環(huán)境和推理環(huán)境Python版本一致直接序列化模型文件”的做法。每個(gè)模型記錄完整的特征版本和樣本版本信息做不到這一點(diǎn)后續(xù)排查線上問題會(huì)非常痛苦。2.3 為什么規(guī)則引擎還死不了這個(gè)話題在數(shù)據(jù)科學(xué)圈有爭議。很多算法工程師覺得規(guī)則引擎是落后的產(chǎn)物一堆if-else邏輯維護(hù)成本高、不優(yōu)雅應(yīng)該用機(jī)器學(xué)習(xí)模型全面替代。但在風(fēng)控行業(yè)待過的同學(xué)應(yīng)該都懂規(guī)則引擎不僅沒死而且在反欺詐場景中是主力。原因是反欺詐面對(duì)的是黑產(chǎn)集團(tuán)他們盯上你的模型后會(huì)用大量樣本試探你的評(píng)分卡找到漏洞后就批量發(fā)起攻擊。這種情況下模型再準(zhǔn)也未必能扛住主動(dòng)攻擊因?yàn)楹诋a(chǎn)會(huì)在短時(shí)間制造海量低維度異常特征這時(shí)候規(guī)則能快速攔截模型則容易被噪聲干擾。另外很多場景下模型的可解釋性不夠業(yè)務(wù)部門需要找依據(jù)去拒絕用戶或跟客戶解釋這時(shí)候規(guī)則反而是更清晰的溝通語言。所以在真實(shí)的金融風(fēng)控系統(tǒng)里通常會(huì)走一條“規(guī)則前置、模型后置”的雙層策略規(guī)則引擎先跑黑名單攔截、多頭借貸過線、設(shè)備異常、欺詐團(tuán)伙關(guān)聯(lián)等命中強(qiáng)規(guī)則直接拒絕命中弱規(guī)則進(jìn)入流調(diào)或打分階段。模型后置未命中強(qiáng)規(guī)則的案件進(jìn)入評(píng)分模型給出分級(jí)結(jié)果再結(jié)合額度策略、渠道策略綜合決策。這套雙引擎的設(shè)計(jì)既能對(duì)抗黑產(chǎn)主動(dòng)攻擊又能兼顧業(yè)務(wù)拓展需求同時(shí)在技術(shù)體系上讓數(shù)據(jù)科學(xué)和傳統(tǒng)計(jì)算各司其職。剛?cè)胄械臄?shù)據(jù)科學(xué)同學(xué)千萬別對(duì)規(guī)則引擎有偏見把兩種能力融合好才叫真的懂風(fēng)控。3. 核心環(huán)節(jié)樣本設(shè)計(jì)與特征工程實(shí)戰(zhàn)3.1 樣本定義觀察期、表現(xiàn)期與好壞客戶樣本設(shè)計(jì)是整個(gè)風(fēng)控建模中最容易做錯(cuò)、也最反直覺的環(huán)節(jié)。風(fēng)控建模要解決的核心問題在于“好客戶”和“壞客戶”不是天生定義好的而是需要你自己根據(jù)業(yè)務(wù)目標(biāo)去構(gòu)造的。在消費(fèi)信貸場景中樣本設(shè)計(jì)一般分成觀察期和表現(xiàn)期兩段。觀察期指積累特征數(shù)據(jù)的時(shí)間窗口比如申請(qǐng)日前6個(gè)月表現(xiàn)期指觀察客戶借了這筆錢之后的表現(xiàn)比如借后3個(gè)月或6個(gè)月。如果表現(xiàn)期內(nèi)客戶發(fā)生過M3逾期超過90天就定義為“壞客戶”如果一直正常還款或只發(fā)生過M1、M2級(jí)別的短期逾期就定義為“好客戶”。這兩個(gè)時(shí)間窗口的設(shè)計(jì)直接決定了模型的時(shí)效性。舉個(gè)例子如果表現(xiàn)期設(shè)為1個(gè)月定義M3為壞那你會(huì)發(fā)現(xiàn)壞樣本非常少模型學(xué)不到東西如果表現(xiàn)期設(shè)為12個(gè)月壞樣本倒是多了但樣本的“新鮮度”會(huì)下降——用兩年前的客群行為預(yù)測(cè)現(xiàn)在的客戶風(fēng)險(xiǎn)效果大概率會(huì)衰減。實(shí)操中我常用的方式是表現(xiàn)期和觀察期配對(duì)滾動(dòng)分桶把歷史存量客戶按放款月份分成若干桶再在各桶內(nèi)按固定表現(xiàn)期提取好壞標(biāo)簽這樣既能保證樣本量又能兼顧時(shí)間上的代表性。3.2 特征工程實(shí)操從原始數(shù)據(jù)到可用特征的完整鏈路特征工程這部分我想用一個(gè)個(gè)真實(shí)場景來展開直接對(duì)照著做就行。場景設(shè)定是消費(fèi)信貸平臺(tái)目標(biāo)是構(gòu)造“申請(qǐng)?jiān)u分卡”模型的輸入特征。第一步是基礎(chǔ)特征提取。假設(shè)線上流水表order_table記錄了用戶的注冊(cè)、登錄、點(diǎn)擊、申請(qǐng)等行為原始數(shù)據(jù)可能是這樣的SELECT user_id, count(*) AS app_cnt, -- 申請(qǐng)次數(shù) count(distinct device_id) AS device_num, -- 設(shè)備數(shù) max(apply_time) AS last_apply_time, -- 最近申請(qǐng)時(shí)間 datediff(now(), max(apply_time)) AS days_since_last_apply FROM user_behavior_log WHERE behavior_type apply GROUP BY user_id這一步得到的特征還只是對(duì)用戶行為的簡單描述信息量有限。數(shù)據(jù)科學(xué)家的價(jià)值體現(xiàn)在第二步——特征加工。第二步是比率與聚合特征。不要只看次數(shù)要看比率比如“白天操作占比”“深夜操作占比”“登錄到申請(qǐng)的平均時(shí)長”“近7天活躍天數(shù)”。這些比值和聚合特征可以更精細(xì)地刻畫用戶行為模式。舉個(gè)例子“近30天申請(qǐng)次數(shù)/近90天申請(qǐng)次數(shù)”這個(gè)比率實(shí)際上刻畫了“短時(shí)間內(nèi)行為集中度”對(duì)識(shí)別突發(fā)性資金緊張很有效。第三步是第三方數(shù)據(jù)交叉特征。很多平臺(tái)會(huì)采購征信公司的數(shù)據(jù)字段比如“近3個(gè)月征信查詢次數(shù)”“信用卡使用率”“已有貸款筆數(shù)”。這些外部字段不能直接用最好和自己的行為特征做交叉。我當(dāng)時(shí)有一個(gè)效果很好的特征“外部征信查詢次數(shù)×近30天App活躍天數(shù)”它解釋力強(qiáng)的原因在于高頻查詢征信說明用戶資金緊張高活躍天數(shù)說明最近在大量使用App兩者疊加風(fēng)險(xiǎn)信號(hào)的置信度大幅提升。第四步是WOE分箱編碼。為什么特征需要做WOE編碼因?yàn)橹苯虞斎朐紨?shù)值到邏輯回歸模型模型可能學(xué)不到最優(yōu)非線性關(guān)系。WOE編碼也叫證據(jù)權(quán)重編碼它的核心思想是把連續(xù)變量分箱然后計(jì)算每一箱中壞客戶與好客戶的比值的對(duì)數(shù)用這個(gè)對(duì)數(shù)值代替原始輸入。這一步能自帶單調(diào)性約束讓評(píng)分卡更加穩(wěn)定。WOE的計(jì)算公式是WOE_i ln( (第i箱壞客戶數(shù)/總壞客戶數(shù)) / (第i箱好客戶數(shù)/總好客戶數(shù)) )分箱的目的是讓特征與標(biāo)簽之間呈現(xiàn)出單調(diào)關(guān)系而不是單純追求模型擬合。實(shí)操中我用的是等頻分箱少量手動(dòng)調(diào)整的方式針對(duì)長尾極值做人工合并確保每箱的樣本占比不能過低一般要求不低于總體的5%。第五步是IV值篩選。特征做完WOE轉(zhuǎn)化后可以用IV值信息價(jià)值來篩選有效特征。IV值的經(jīng)驗(yàn)閾值是小于0.02表示幾乎無預(yù)測(cè)能力0.02到0.1表示弱預(yù)測(cè)能力0.1到0.3表示中等預(yù)測(cè)能力大于0.3表示強(qiáng)預(yù)測(cè)能力。但要注意IV值過高超過0.5要警惕“看似過度擬合”——常見原因是特征被第三方數(shù)據(jù)源污染或泄漏比如你用了“用戶是否逾期”的標(biāo)簽去構(gòu)造特征那IV值當(dāng)然爆表。3.3 樣本不均衡與拒絕推斷信貸場景的壞樣本率通常只有1%到5%天然是高度不均衡的數(shù)據(jù)集。如果在不均衡數(shù)據(jù)上直接訓(xùn)練模型模型會(huì)傾向于把所有樣本預(yù)測(cè)為“好客戶”因?yàn)檫@樣總體準(zhǔn)確率很高但業(yè)務(wù)上根本沒法用。處理不均衡有幾個(gè)層次的手段第一層是樣本權(quán)重調(diào)整在損失函數(shù)中給壞樣本加權(quán)或在下采樣時(shí)保留全部壞樣本、隨機(jī)抽取部分好樣本。實(shí)操中下采樣比例通??刂圃?:5到1:10之間太低會(huì)丟失好樣本的信息太高則壞樣本依然被淹沒。第二層是算法層面的處理LightGBM和XGBoost都支持scale_pos_weight參數(shù)它其實(shí)就是把正樣本的梯度放大了。我在實(shí)際項(xiàng)目中通常采用“下采樣scale_pos_weight”的組合方案訓(xùn)練時(shí)可以先用全量好樣本和全量壞樣本訓(xùn)練一輪查看PR曲線再根據(jù)業(yè)務(wù)期望的召回率調(diào)整權(quán)重。第三層容易被忽略拒絕推斷。建模樣本只包含“被審批通過”的客戶但被拒絕的客戶我們沒有其表現(xiàn)標(biāo)簽這樣直接用審批通過樣本建模會(huì)產(chǎn)生樣本選擇偏差。比如你早期審批策略偏保守很多優(yōu)質(zhì)客戶被拒掉模型只學(xué)會(huì)了在“保守策略通過的人群”里做區(qū)分它的區(qū)分能力就永遠(yuǎn)被限制在狹窄的樣本空間里。拒絕推斷的方法有幾種最樸素的是“給拒絕樣本推斷標(biāo)簽”用現(xiàn)有模型預(yù)測(cè)拒絕樣本的壞概率然后按后驗(yàn)概率融入訓(xùn)練集。但這種方法存在自增強(qiáng)問題——模型錯(cuò)的地方被自己放大。所以實(shí)操中拒絕推斷更傾向于只做一個(gè)“樣本權(quán)重修正”而非“標(biāo)簽推斷”通過調(diào)整被拒絕樣本的權(quán)重讓模型泛化性更好。這一塊沒有完美解決方案核心思路是承認(rèn)模型有偏差再用合理的假設(shè)去修正偏差。4. 模型構(gòu)建與評(píng)估從XGBoost到評(píng)分卡落地4.1 為什么信用評(píng)分卡至今仍是行業(yè)標(biāo)配說到信貸風(fēng)控模型繞不開“評(píng)分卡”這個(gè)詞。很多新入行的算法工程師喜歡堆模型、上復(fù)雜網(wǎng)絡(luò)但在真實(shí)金融項(xiàng)目里評(píng)分卡依然占據(jù)主導(dǎo)地位原因不外乎三點(diǎn)可解釋性強(qiáng)每個(gè)特征對(duì)分?jǐn)?shù)的貢獻(xiàn)權(quán)重清晰業(yè)務(wù)人員能一眼看懂個(gè)別高風(fēng)險(xiǎn)客戶被拒后客服能清楚地跟客戶解釋原因。穩(wěn)定性和可監(jiān)控性強(qiáng)評(píng)分卡的輸入變量經(jīng)過分箱轉(zhuǎn)換后單變量變化對(duì)整體分?jǐn)?shù)的影響是可預(yù)期、可推測(cè)的模型上線后好做監(jiān)控和迭代。監(jiān)管友好金融機(jī)構(gòu)接受外部審計(jì)時(shí)評(píng)審更認(rèn)可這種可解釋、可追溯的方案黑盒模型則很難通過合規(guī)審查。評(píng)分卡的核心就是從邏輯回歸模型轉(zhuǎn)化過來的?;竟绞荢core Offset Factor * ln(Odds) Odds p/(1-p)p為逾期概率其中Offset和Factor通過設(shè)定“基準(zhǔn)分、基準(zhǔn)Odds、翻倍倍率”來解出。簡單說就是你定義好“當(dāng)Odds等于某個(gè)值時(shí)分值為多少”“Odds翻多少倍分?jǐn)?shù)加多少”然后由這兩個(gè)約束解出Offset和Factor。但這不代表XGBoost和LightGBM在風(fēng)控里沒價(jià)值。實(shí)際上我現(xiàn)在的做法是雙軌并行邏輯回歸評(píng)分卡作為審批主模型用于解釋、監(jiān)控、應(yīng)對(duì)監(jiān)管LightGBM模型作為風(fēng)險(xiǎn)排序和貸中預(yù)警融合模型用于策略分層和額度定價(jià)。LightGBM的優(yōu)勢(shì)在于非線性擬合能力強(qiáng)能捕捉到特征交互效應(yīng)對(duì)風(fēng)險(xiǎn)排名能力有一定提升。但它上線前必須做嚴(yán)格的穩(wěn)定性監(jiān)控任何特征波動(dòng)都可能引起分?jǐn)?shù)劇烈變化而這在傳統(tǒng)評(píng)分卡中幾乎不會(huì)發(fā)生。4.2 模型評(píng)估AUC不是唯一答案KL散度和PSI才是很多數(shù)據(jù)科學(xué)同學(xué)習(xí)慣把AUC當(dāng)成衡量模型好壞的核心指標(biāo)。在風(fēng)控里AUC只是其中之一甚至不是最重要的。原因是風(fēng)控模型面對(duì)的真實(shí)場景里樣本分布是動(dòng)態(tài)變化的AUC衡量的是區(qū)分度但不衡量穩(wěn)定性。更關(guān)鍵的指標(biāo)組合是這樣的指標(biāo)作用參考標(biāo)準(zhǔn)KS衡量好樣本和壞樣本分?jǐn)?shù)分布的差異越高區(qū)分度越強(qiáng)一般要求0.25以上高于0.5要警惕過度擬合AUC排序能力0.75以上基本可用0.8以上表現(xiàn)不錯(cuò)PSI特征分布穩(wěn)定性指數(shù)小于0.1穩(wěn)定0.1到0.25輕微偏移大于0.25嚴(yán)重偏移遷移率各個(gè)逾期階段的滾動(dòng)遷移分析觀察短期逾期向長期逾期的轉(zhuǎn)化趨勢(shì)PSI這個(gè)指標(biāo)以前很多團(tuán)隊(duì)不重視但我踩過坑之后強(qiáng)烈建議每個(gè)人都做。PSI的公式是PSI Σ(實(shí)際占比 - 預(yù)期占比) * ln(實(shí)際占比 / 預(yù)期占比)它衡量兩個(gè)時(shí)間窗口之間分?jǐn)?shù)分布或特征分布的偏移程度。假設(shè)模型上線時(shí)訓(xùn)練樣本的分?jǐn)?shù)分布是基準(zhǔn)到了第二個(gè)月實(shí)際客群的分?jǐn)?shù)分布和基準(zhǔn)對(duì)不上PSI飆到了0.2以上說明客群結(jié)構(gòu)變了模型可能已經(jīng)失效。這時(shí)候你不能干瞪眼等著模型效果崩盤而是要提前預(yù)警觸發(fā)重訓(xùn)練流程。實(shí)操中我每個(gè)月初的第一件事就是跑一篇模型監(jiān)控報(bào)表把以下內(nèi)容打印出來總體樣本量、好/壞客戶占比、分?jǐn)?shù)分布直方圖、分位數(shù)、PSI、KS分階段、AUC。這幾張圖和數(shù)據(jù)放在一起足夠用來判斷“模型狀態(tài)健康”還是“已經(jīng)開始退化”。4.3 模型調(diào)參與特征融合經(jīng)驗(yàn)聊到調(diào)參先提一個(gè)原則風(fēng)控模型不需要追求極致的AUC。我們追求的是“在保證穩(wěn)定性的前提下把區(qū)分度做到可接受”。這個(gè)原則和Kaggle比賽選手追求第一的思路完全不同。在Kaggle上你把模型做到AUC 0.999都不嫌多在風(fēng)控中如果一個(gè)模型在測(cè)試集上做到AUC 0.95我反而會(huì)強(qiáng)烈懷疑變量泄漏或者過擬合。用LightGBM做風(fēng)控建模時(shí)我在實(shí)踐中總結(jié)的幾組相對(duì)穩(wěn)定的參數(shù)基線如下數(shù)據(jù)規(guī)模大概在百萬級(jí)import lightgbm as lgb params { objective: binary, metric: auc, learning_rate: 0.02, num_leaves: 31, max_depth: 5, min_child_samples: 100, feature_fraction: 0.8, bagging_fraction: 0.8, bagging_freq: 1, lambda_l1: 1.0, lambda_l2: 1.0, scale_pos_weight: 10, verbosity: -1, }這個(gè)基線的特點(diǎn)是學(xué)習(xí)率低、葉子數(shù)適中、正則強(qiáng)。模型更加平滑不會(huì)過度抓住個(gè)別的極端特征。如果是邏輯回歸評(píng)分卡特征則全都要經(jīng)過WOE轉(zhuǎn)換且特征之間要控制相關(guān)性。我當(dāng)時(shí)用的變量篩選方法可以總結(jié)為四個(gè)步驟按單變量IV值降序排序保留IV大于0.02的特征。檢查特征之間的相關(guān)系數(shù)如果兩個(gè)特征相關(guān)系數(shù)超過0.7保留IV更高的一方剔除另一方。按業(yè)務(wù)邏輯剔除可能導(dǎo)致“未來函數(shù)”的特征比如用了表現(xiàn)期的數(shù)據(jù)。用逐步回歸的簡化版本做最終特征準(zhǔn)入優(yōu)先保留業(yè)務(wù)上可解釋、可采集的特征。這套流程下來評(píng)分卡的特征數(shù)量一般控制在15到30個(gè)之間覆蓋用戶基本屬性、行為特征、征信特征、設(shè)備特征這幾個(gè)維度。5. 實(shí)操過程從零搭建一個(gè)申請(qǐng)?jiān)u分卡5.1 全套流程的步驟拆解這部分用一個(gè)簡化的消費(fèi)信貸申請(qǐng)?jiān)u分卡來演示全流程所有步驟都是可以對(duì)照?qǐng)?zhí)行的。第1步數(shù)據(jù)準(zhǔn)備數(shù)據(jù)源包含用戶基本信息表年齡、性別、收入、職業(yè)、借貸行為表申請(qǐng)歷史、還款歷史、產(chǎn)品信息表借款金額、期限、用途、第三方征信報(bào)告摘要。把這些數(shù)據(jù)按用戶ID關(guān)聯(lián)成寬表按“申請(qǐng)日”作為時(shí)間基準(zhǔn)往前取6個(gè)月的行為數(shù)據(jù)做特征往后取6個(gè)月的還款表現(xiàn)做標(biāo)簽。第2步樣本切分時(shí)間序列數(shù)據(jù)不能隨機(jī)切分要按時(shí)間切分。我用的是“過去12個(gè)月放款樣本作為訓(xùn)練集最近3個(gè)月放款樣本作為測(cè)試集”同時(shí)訓(xùn)練集中預(yù)留一部分做驗(yàn)證集來做早停。隨機(jī)切分會(huì)造成時(shí)間穿越模型學(xué)到的規(guī)律會(huì)包含未來信息因?yàn)檫@個(gè)原因我見過太多團(tuán)隊(duì)模型上線后效果崩掉。第3步特征工程對(duì)連續(xù)變量做等頻分箱然后轉(zhuǎn)WOE編碼。對(duì)分類變量先按業(yè)務(wù)含義歸類再用目標(biāo)編碼或WOE編碼處理。這里要特別注意有的團(tuán)隊(duì)直接用one-hot把類別特征扔進(jìn)模型結(jié)果在邏輯回歸上特征維度爆炸而且泛化能力極差。具體寫一段特征轉(zhuǎn)換代碼示例方便理解import pandas as pd import numpy as np # 假設(shè)df包含特征 amount、train_flag樣本是否來自訓(xùn)練集、bad_flag好壞標(biāo)簽 def woe_encoding(df, feature, targetbad_flag, bins10): # 等頻分箱 df[bin] pd.qcut(df[feature], qbins, duplicatesdrop) grouped df.groupby(bin)[target].agg([sum, count]) grouped[bad] grouped[sum] grouped[good] grouped[count] - grouped[bad] grouped[bad_rate] grouped[bad] / grouped[bad].sum() grouped[good_rate] grouped[good] / grouped[good].sum() grouped[woe] np.log(grouped[bad_rate] / grouped[good_rate]) df[woe_ feature] df[bin].map(grouped[woe]) return df, grouped[woe].to_dict()這段代碼的邏輯是按分位數(shù)把連續(xù)變量分成10箱統(tǒng)計(jì)每箱中壞樣本和好樣本占比計(jì)算WOE值。注意WOE編碼一定是在訓(xùn)練集上計(jì)算好映射字典再應(yīng)用到測(cè)試集防止信息泄漏。第4步訓(xùn)練邏輯回歸評(píng)分卡主模型直接訓(xùn)練線性模型訓(xùn)練完成后每個(gè)特征的系數(shù)乘上WOE值就是這張?jiān)u分卡的核心邏輯。邏輯如下Score Offset - Factor * (β0 β1*WOE_特征1 β2*WOE_特征2 ...)實(shí)際落地時(shí)評(píng)分卡生成的不是一個(gè)Python模型而是一張打分規(guī)則表每個(gè)特征、每個(gè)分段、對(duì)應(yīng)分?jǐn)?shù)。這張表會(huì)同步給業(yè)務(wù)系統(tǒng)和審批系統(tǒng)由規(guī)則引擎執(zhí)行。我當(dāng)時(shí)生成評(píng)分卡這張表的時(shí)候生成腳本用的是Pandas輸出到Excel文件交付給審批決策團(tuán)隊(duì)再由他們配置到?jīng)Q策引擎中整個(gè)過程是可以審計(jì)、可追溯的。第5步設(shè)定閾值和策略評(píng)分卡模型會(huì)輸出一個(gè)0到1000之間的分?jǐn)?shù)一般來說分?jǐn)?shù)越高風(fēng)險(xiǎn)越低。審批策略一般是這樣做的分?jǐn)?shù)大于750自動(dòng)通過不走人工。分?jǐn)?shù)在650到750之間視借款金額和期限走自動(dòng)審批或抽查人工。分?jǐn)?shù)在550到650之間走人工審核或降低額度縮短期限。分?jǐn)?shù)小于550自動(dòng)拒絕。這些閾值不是拍腦袋定的而是根據(jù)各分?jǐn)?shù)段的壞賬率、通過率、收益三者權(quán)衡得出。每次調(diào)整閾值都需要做策略模擬用測(cè)試集分?jǐn)?shù)分布模擬新策略對(duì)通過率和逾期率的影響綜合評(píng)估后才定。5.2 冷啟動(dòng)階段沒有歷史標(biāo)簽怎么辦很多朋友問過我一個(gè)問題“如果是一個(gè)新業(yè)務(wù)沒有歷史放款樣本怎么建評(píng)分卡”這是金融風(fēng)控冷啟動(dòng)的經(jīng)典難題。我的回答是冷啟動(dòng)階段不要指望一開始就訓(xùn)練出完美的模型先解決“有比沒有好”的問題。冷啟動(dòng)方案通常有三個(gè)階段第一階段0到3個(gè)月用專家規(guī)則和外部數(shù)據(jù)做準(zhǔn)入策略。比如年齡小于20或大于60拒絕、近3個(gè)月征信查詢次數(shù)超過10次拒絕、無收入證明拒絕。同時(shí)通過小額試放積累樣本。這個(gè)階段的核心目標(biāo)是“安全地搜集數(shù)據(jù)”而不是“最大化審批通過率”。第二階段3到6個(gè)月當(dāng)積累了1萬筆以上的放款樣本且最長表現(xiàn)期覆蓋了至少3個(gè)月就可以訓(xùn)練第一版簡單模型。這個(gè)時(shí)候不要直接上復(fù)雜的LightGBM先用邏輯回歸少量特征比如年齡、收入證明、征信查詢次數(shù)、借貸歷史做一張簡化評(píng)分卡。第三階段6個(gè)月以上積累的樣本足夠多、表現(xiàn)期足夠長之后再逐步過渡到完整的評(píng)分卡和機(jī)器學(xué)習(xí)模型。這個(gè)過程看起來慢但實(shí)際上是最穩(wěn)健的。很多團(tuán)隊(duì)冷啟動(dòng)翻車都是因?yàn)榧庇谟?xùn)練模型導(dǎo)致樣本偏差嚴(yán)重后面模型的坑越挖越深。5.3 模型部署與服務(wù)的工程要點(diǎn)模型在Notebook里跑出好效果只是第一步要讓它真正在業(yè)務(wù)系統(tǒng)里干活有幾點(diǎn)工程上的細(xì)節(jié)值得多說幾句。第一點(diǎn)是特征的實(shí)時(shí)計(jì)算延遲。審批決策對(duì)響應(yīng)時(shí)間有要求一般在2秒內(nèi)要給出結(jié)果。所以模型服務(wù)里用到的特征不可能現(xiàn)場從Hive拉表算而是靠實(shí)時(shí)特征服務(wù)來支撐。具體做法是把常用特征預(yù)計(jì)算好寫到KV存儲(chǔ)比如Redis中請(qǐng)求來了直接查。如果用戶是新客需要實(shí)時(shí)計(jì)算特征就把需要實(shí)時(shí)計(jì)算的部分用Flink SQL或在服務(wù)內(nèi)完成控制延遲在幾百毫秒以內(nèi)。第二點(diǎn)是特征缺失值的處理方案。線上推理時(shí)經(jīng)常會(huì)遇到“用戶沒有某類行為數(shù)據(jù)”的情況比如借款記錄為空、征信查詢次數(shù)缺失。這就需要在訓(xùn)練階段就把缺失值處理做進(jìn)特征轉(zhuǎn)換邏輯中確保線下訓(xùn)練和線上推理對(duì)缺失值的口徑一致。最經(jīng)典的做法是WOE編碼時(shí)單獨(dú)分一箱“缺失箱”把缺失值映射到該箱的WOE值這樣缺失值本身也能貢獻(xiàn)信息量。第三點(diǎn)是模型版本管理與灰度切換。新模型上線不能直接全量切換要先在模擬環(huán)境中對(duì)比新舊模型的分?jǐn)?shù)分布、拒絕率、通過率再切小流量灰度觀察如果KS、PSI等指標(biāo)穩(wěn)定再逐步放量。這套流程聽起來簡單但在真實(shí)項(xiàng)目中執(zhí)行起來需要運(yùn)維、算法、業(yè)務(wù)協(xié)同作戰(zhàn)一套規(guī)范的發(fā)布流程能省掉很多不必要的線上事故。6. 常見問題與排查技巧實(shí)錄6.1 數(shù)據(jù)質(zhì)量問題時(shí)間穿越與口徑不一致數(shù)據(jù)科學(xué)在風(fēng)控中最大的敵人不是模型復(fù)雜度不夠而是數(shù)據(jù)質(zhì)量差。我在項(xiàng)目里處理過大量這類問題遇到頻率最高的兩類是“時(shí)間穿越”和“口徑不一致”。時(shí)間穿越指的是特征中包含了未來的信息。舉例來說建模時(shí)你用“是否被拒過”做特征但被拒這個(gè)信息只存在于拒絕樣本中而拒絕樣本天然沒有表現(xiàn)標(biāo)簽。你用這個(gè)特征訓(xùn)練模型模型會(huì)學(xué)到“被拒過的用戶壞概率高”但實(shí)際上這個(gè)特征在線下推送時(shí)是拿不到的。解決時(shí)間穿越的核心方法就是在所有特征提取時(shí)都以“決策時(shí)點(diǎn)”為準(zhǔn)嚴(yán)格按照時(shí)點(diǎn)回溯不允許任何未來信息進(jìn)入特征。口徑不一致則更隱蔽。不同團(tuán)隊(duì)提交的特征看著字段名一樣但業(yè)務(wù)含義不同。比如“近三個(gè)月消費(fèi)金額”A團(tuán)隊(duì)統(tǒng)計(jì)的是“支付成功金額”B團(tuán)隊(duì)統(tǒng)計(jì)的是“下單金額”一旦兩個(gè)數(shù)據(jù)源混在一起模型特征就會(huì)亂。所以特征倉庫要有統(tǒng)一的口徑定義文檔和血緣分線每一張?zhí)卣鞅矶家胸?fù)責(zé)人禁止無主特征。6.2 模型上線后效果衰減不是模型錯(cuò)了是客群變了模型上線之后KS、AUC一路下坡是常規(guī)現(xiàn)象很多團(tuán)隊(duì)第一反應(yīng)是“模型需要迭代了”。但實(shí)際上絕大多數(shù)情況不是模型失效而是客群結(jié)構(gòu)變了。舉例來說平臺(tái)在某個(gè)季度做了一輪市場投放渠道獲客結(jié)構(gòu)變化明顯新客大多來自下沉渠道風(fēng)險(xiǎn)偏好和之前完全不同。這時(shí)候模型沒變但輸入特征的分布已經(jīng)變了模型的判斷自然會(huì)失真。排查這個(gè)問題的正確姿勢(shì)是分兩層看看特征層面的PSI如果你的核心特征分布都發(fā)生了偏移那大概率是客群變了而不是模型本身壞了??捶?jǐn)?shù)層面的PSI如果特征分布沒怎么變但分?jǐn)?shù)分布變了問題可能出在特征計(jì)算的服務(wù)端要查評(píng)分服務(wù)的代碼和數(shù)據(jù)源。這兩個(gè)指標(biāo)分開看能快速定位問題出在哪一層。千萬別一開始就急著重訓(xùn)練模型那樣既費(fèi)時(shí)間也解決不了問題。6.3 關(guān)于解釋性不是合規(guī)部門的事是模型設(shè)計(jì)者的事模型可解釋性在風(fēng)控項(xiàng)目中不是“加分項(xiàng)”而是“必答題”。監(jiān)管審計(jì)的時(shí)候評(píng)審會(huì)問“為什么這個(gè)客戶被拒絕”如果模型設(shè)計(jì)者拿不出來一個(gè)清晰的解釋這個(gè)模型就上不了線。實(shí)操中我做了三件事來保障可解釋性所有入模特征必須有業(yè)務(wù)含義純技術(shù)構(gòu)造的“黑箱特征”不允許入模。每個(gè)模型上線前都要準(zhǔn)備一份“模型說明文檔”包括特征清單、每個(gè)特征的業(yè)務(wù)解釋、WOE方向、系數(shù)權(quán)重、模型局限性等。做個(gè)體解釋時(shí)用SHAP值輔助解釋結(jié)合特征貢獻(xiàn)度給業(yè)務(wù)方提供參考而不是單純給一個(gè)風(fēng)險(xiǎn)分?jǐn)?shù)。從整體來看數(shù)據(jù)科學(xué)在風(fēng)控中的價(jià)值越來越大但能不能真正落地考驗(yàn)的不只是建模能力還有你對(duì)數(shù)據(jù)、業(yè)務(wù)、工程和合規(guī)理解的綜合水平。我個(gè)人碰過最多壁、學(xué)到最多東西的環(huán)節(jié)恰恰不是算法本身而是和數(shù)據(jù)鏈路、業(yè)務(wù)規(guī)則和合規(guī)要求對(duì)接的過程。如果你準(zhǔn)備往這個(gè)方向發(fā)展我最大的建議是先把底層數(shù)據(jù)摸透再把業(yè)務(wù)規(guī)則吃透最后再看模型怎么嵌入決策流這三步走完你的模型才能真正創(chuàng)造價(jià)值。最后再分享一個(gè)小技巧——每個(gè)新項(xiàng)目開始之前花一周時(shí)間把數(shù)據(jù)字典、字段統(tǒng)計(jì)和樣本標(biāo)簽分布詳細(xì)看一遍這周時(shí)間永遠(yuǎn)不會(huì)白費(fèi)。