日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

「实战案例」基于Python语言开发的信用评分卡

發(fā)布時(shí)間:2023/12/20 python 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 「实战案例」基于Python语言开发的信用评分卡 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

信用風(fēng)險(xiǎn)計(jì)量模型可以包括跟個(gè)人信用評(píng)級(jí),企業(yè)信用評(píng)級(jí)和國(guó)家信用評(píng)級(jí)。人信用評(píng)級(jí)有一系列評(píng)級(jí)模型組成,常見(jiàn)是A卡(申請(qǐng)?jiān)u分卡)、B卡(行為模型)、C卡(催收模型)和F卡(反欺詐模型)。 今天我們展示的是個(gè)人信用評(píng)級(jí)模型的開(kāi)發(fā)過(guò)程,數(shù)據(jù)采用kaggle上知名的give me some credit數(shù)據(jù)集。
今天,給各位數(shù)據(jù)粉帶來(lái)的是比較熟悉的一個(gè)經(jīng)典數(shù)據(jù)挖掘應(yīng)用案例——金融常見(jiàn)信用評(píng)分卡的開(kāi)發(fā)解析。

基于Python語(yǔ)言開(kāi)發(fā)信用評(píng)分卡

Part 1 學(xué)會(huì)信用評(píng)分卡,我都能干什么?

01、信用評(píng)分卡的應(yīng)用場(chǎng)景

與信用評(píng)分卡掛鉤的信用評(píng)級(jí)在全球金融領(lǐng)域有廣泛應(yīng)用。它涉及到公司管理,企業(yè)債發(fā)行,企業(yè)融資,企業(yè)上市,企業(yè)并購(gòu),個(gè)人炒股和購(gòu)買(mǎi)公司債券等多個(gè)場(chǎng)景。

企業(yè)債發(fā)行

企業(yè)主體信用評(píng)級(jí)越高,意味著該企業(yè)抗風(fēng)險(xiǎn)能力、盈利能力越強(qiáng),發(fā)債融資成本越低。作為企業(yè)董事會(huì),管理者,決策者應(yīng)該了解企業(yè)主要財(cái)務(wù)指標(biāo),了解自身企業(yè)評(píng)級(jí)。

企業(yè)發(fā)債時(shí)都需要評(píng)級(jí)。國(guó)內(nèi)評(píng)級(jí)這塊主要分為AAA、AA+、AA、AA-、A+。企業(yè)評(píng)級(jí)過(guò)低會(huì)限制某些工具的發(fā)行額度、交易場(chǎng)所可質(zhì)押性等等

如果是評(píng)級(jí)太低,企業(yè)發(fā)行債券沒(méi)人買(mǎi)。目前廣大投資者的投資門(mén)檻是AA。

企業(yè)上市

企業(yè)上市融資時(shí)也需要信用評(píng)級(jí)。目前國(guó)內(nèi)只有優(yōu)質(zhì)企業(yè)才能上市融資,上市牌照是很難拿的。如果財(cái)務(wù)指標(biāo)和資質(zhì)不達(dá)標(biāo),則不能上市。

企業(yè)并購(gòu)

企業(yè)并購(gòu)是企業(yè)之間的兼并和收購(gòu)行為。如果收購(gòu)方不能很好了解對(duì)方企業(yè)評(píng)級(jí),買(mǎi)來(lái)的企業(yè)可能是包裝過(guò)的垃圾企業(yè)。失敗企業(yè)并購(gòu)會(huì)讓企業(yè)背上巨大債務(wù)負(fù)擔(dān)。

個(gè)人炒股

個(gè)人炒股投資者如果不懂企業(yè)評(píng)級(jí),也難以買(mǎi)到優(yōu)質(zhì)股,容易被人忽悠買(mǎi)到垃圾股。建議不會(huì)數(shù)據(jù)科學(xué)的人趁早離開(kāi)股市和金融投資,否則可能欠下巨額債務(wù)。

如果個(gè)人通過(guò)學(xué)習(xí)機(jī)器學(xué)習(xí)模型,可以識(shí)別有價(jià)值企業(yè),股票,債券,財(cái)富升值概率顯著高于不懂模型的人。

本案我們主要聚焦的是【金融信貸】場(chǎng)景中的信用評(píng)分卡開(kāi)發(fā)實(shí)施全過(guò)程。

評(píng)分卡模型建模流程

典型的信用評(píng)分卡模型如圖1-1所示。信用風(fēng)險(xiǎn)評(píng)級(jí)模型的主要開(kāi)發(fā)流程如下:
(1) 獲取數(shù)據(jù),包括申請(qǐng)貸款客戶(hù)的數(shù)據(jù)。數(shù)據(jù)包括客戶(hù)各個(gè)維度,包括年齡,性別,收入,職業(yè),家人數(shù)量,住房情況,消費(fèi)情況,債務(wù)等等。
(2) 數(shù)據(jù)預(yù)處理,主要工作包括數(shù)據(jù)清洗、缺失值處理、異常值處理、數(shù)據(jù)類(lèi)型轉(zhuǎn)換等等。我們需要把原始數(shù)據(jù)層層轉(zhuǎn)化為可建模數(shù)據(jù)。
(3) EDA探索性數(shù)據(jù)分析和描述性統(tǒng)計(jì),包括統(tǒng)計(jì)總體數(shù)據(jù)量大小,好壞客戶(hù)占比,數(shù)據(jù)類(lèi)型有哪些,變量缺失率,變量頻率分析直方圖可視化,箱形圖可視化,變量相關(guān)性可視化等。
(4) 變量選擇,通過(guò)統(tǒng)計(jì)學(xué)和機(jī)器學(xué)習(xí)的方法,篩選出對(duì)違約狀態(tài)影響最顯著的變量。常見(jiàn)變量選擇方法很多,包括iv,feature importance,方差等等 。另外缺失率太高的變量也建議刪除。無(wú)業(yè)務(wù)解釋性變量且沒(méi)有價(jià)值變量也建議刪除。
(5) 模型開(kāi)發(fā),評(píng)分卡建模主要難點(diǎn)是woe分箱,分?jǐn)?shù)拉伸,變量系數(shù)計(jì)算。其中woe分箱是評(píng)分卡中難點(diǎn)中難點(diǎn),需要豐富統(tǒng)計(jì)學(xué)知識(shí)和業(yè)務(wù)經(jīng)驗(yàn)。目前分箱算法多達(dá)50多種,沒(méi)有統(tǒng)一金標(biāo)準(zhǔn),一般是先機(jī)器自動(dòng)分箱,然后再手動(dòng)調(diào)整分箱,最后反復(fù)測(cè)試模型最后性能,擇優(yōu)選取最優(yōu)分箱算法。
(6) 模型驗(yàn)證,核實(shí)模型的區(qū)分能力、預(yù)測(cè)能力、穩(wěn)定性、排序能力等等,并形成模型評(píng)估報(bào)告,得出模型是否可以使用的結(jié)論。模型驗(yàn)證不是一次性完成,而是當(dāng)建模后,模型上線(xiàn)前,模型上線(xiàn)后定期驗(yàn)證。模型開(kāi)發(fā)和維護(hù)是一個(gè)循環(huán)周期,不是一次完成。
(7) 信用評(píng)分卡,根據(jù)邏輯回歸的變量系數(shù)和WOE值來(lái)生成評(píng)分卡。評(píng)分卡方便業(yè)務(wù)解釋,已使用幾十年,非常穩(wěn)定,深受金融行業(yè)喜愛(ài)。其方法就是將Logistic模型概率分轉(zhuǎn)換為300-900分的標(biāo)準(zhǔn)評(píng)分的形式。
(8) 建立評(píng)分卡模型系統(tǒng),根據(jù)信用評(píng)分卡方法,建立計(jì)算機(jī)自動(dòng)信用化評(píng)分系統(tǒng)。美國(guó)傳統(tǒng)產(chǎn)品FICO有類(lèi)似功能,FICO底層語(yǔ)言是Java。目前流行Java,python或R多種語(yǔ)言構(gòu)建評(píng)分卡自動(dòng)化模型系統(tǒng)。

(9)模型監(jiān)控,著時(shí)間推移,模型區(qū)分能力,例如ks,auc會(huì)逐步下降,模型穩(wěn)定性也會(huì)發(fā)生偏移。我們需要專(zhuān)業(yè)模型監(jiān)控團(tuán)隊(duì),當(dāng)監(jiān)控到模型區(qū)分能力下降顯著或模型穩(wěn)定性發(fā)生較大偏移時(shí),我們需要重新開(kāi)發(fā)模型,迭代模型。模型監(jiān)控團(tuán)隊(duì)?wèi)?yīng)該每日按時(shí)郵件發(fā)送模型監(jiān)控報(bào)表給相關(guān)團(tuán)隊(duì),特別是開(kāi)發(fā)團(tuán)隊(duì)和業(yè)務(wù)團(tuán)隊(duì)。

02、金融信貸基礎(chǔ)概念

在進(jìn)行項(xiàng)目實(shí)施開(kāi)發(fā)前,對(duì)應(yīng)用場(chǎng)景進(jìn)行深入了解,是我們數(shù)據(jù)人的基本功。

信用風(fēng)險(xiǎn)

信貸業(yè)務(wù),又稱(chēng)貸款業(yè)務(wù),是商業(yè)銀行等信貸機(jī)構(gòu)最重要的資產(chǎn)業(yè)務(wù)和主要贏利手段。信貸機(jī)構(gòu)通過(guò)放款收回本金和利息,扣除成本后獲得利潤(rùn)。對(duì)有貸款需求的用戶(hù),信貸機(jī)構(gòu)首先要對(duì)其未來(lái)的還款表現(xiàn)進(jìn)行預(yù)測(cè),然后將本金借貸給還款概率大的用戶(hù)。但這種借貸關(guān)系,可能發(fā)生信貸機(jī)構(gòu)(通常是銀行)無(wú)法收回所欠本金和利息而導(dǎo)致現(xiàn)金流中斷和回款成本增加的可能性風(fēng)險(xiǎn),這就是信用風(fēng)險(xiǎn),它是金融風(fēng)險(xiǎn)的主要類(lèi)型。

信用評(píng)分

在信貸管理領(lǐng)域,關(guān)于客戶(hù)信用風(fēng)險(xiǎn)的預(yù)測(cè),目前使用最普遍的工具為信用評(píng)分卡,它源于20世紀(jì)的銀行與信用卡中心。在最開(kāi)始的審批過(guò)程中,用戶(hù)的信用等級(jí)由銀行聘用的專(zhuān)家進(jìn)行主觀評(píng)判。而隨著數(shù)據(jù)分析工具的發(fā)展、量化手段的進(jìn)步,各大銀行機(jī)構(gòu)逐漸使用統(tǒng)計(jì)模型將專(zhuān)家的評(píng)判標(biāo)準(zhǔn)轉(zhuǎn)化為評(píng)分卡模型。如今,風(fēng)險(xiǎn)量化手段早已不局限于銀行等傳統(tǒng)借貸機(jī)構(gòu),持牌互聯(lián)網(wǎng)公司的金融部門(mén)、持牌消費(fèi)金融公司等均有成體系的風(fēng)險(xiǎn)量化手段。其應(yīng)用的范圍包括進(jìn)件、貸后管理及催收等。信用評(píng)分不但可以篩選高風(fēng)險(xiǎn)客戶(hù),減少損失發(fā)生,也可以找出相對(duì)優(yōu)質(zhì)的客戶(hù)群,發(fā)掘潛在商機(jī)。

顧名思義,評(píng)分卡是一張有分?jǐn)?shù)刻度和相應(yīng)閾值的表。對(duì)于任何一個(gè)用戶(hù),總能根據(jù)其信息找到對(duì)應(yīng)的分?jǐn)?shù)。將不同類(lèi)別的分?jǐn)?shù)進(jìn)行匯總,就可以得到用戶(hù)的總分?jǐn)?shù)。信用評(píng)分卡,即專(zhuān)門(mén)用來(lái)評(píng)估用戶(hù)信用的一張刻度表,這里我們舉一個(gè)簡(jiǎn)單的例子:假設(shè)我們有一個(gè)評(píng)分卡,包含四個(gè)變量(特征),即居住條件、年齡、貸款目的和現(xiàn)址居住時(shí)長(zhǎng)(見(jiàn)表2-1)

表2-1 簡(jiǎn)單評(píng)分卡

用表2-1這張簡(jiǎn)單的評(píng)分卡,我們能輕而易舉地計(jì)算得分。一個(gè)47歲、租房、在當(dāng)前住址住了10年、想借錢(qián)度假的申請(qǐng)者得到53分(20+17+16+0=53),另一個(gè)25歲、有自己的房產(chǎn)、在當(dāng)前住址住了2年、想借錢(qián)買(mǎi)二手車(chē)的人也同樣得到53分(5+30+9+9=53)。同樣地,一個(gè)38歲、與父母同住、在當(dāng)前住址住了18個(gè)月、想借錢(qián)裝修的人也得到53分(15+20+4+14=53)。事實(shí)上,我們一共有七個(gè)組合可以得到53分,他們雖然各自情況都不一樣,但對(duì)貸款機(jī)構(gòu)來(lái)說(shuō)代表了同樣的風(fēng)險(xiǎn)水平。該評(píng)分系統(tǒng)采用了補(bǔ)償機(jī)制,即借款人的缺點(diǎn)可以用優(yōu)點(diǎn)去彌補(bǔ)。

總的來(lái)說(shuō),信用評(píng)分卡就是通過(guò)用數(shù)據(jù)對(duì)客戶(hù)還款能力和還款意愿進(jìn)行定量評(píng)估的系統(tǒng)。從20世紀(jì)發(fā)展至今,其種類(lèi)已非常多,目前應(yīng)用最廣泛最多的主要分為以下四種:

  • 申請(qǐng)?jiān)u分卡(ApplicationCard):申請(qǐng)?jiān)u分卡通常用于貸前客戶(hù)的進(jìn)件審批。在沒(méi)有歷史平臺(tái)表現(xiàn)的客群中,外部征信數(shù)據(jù)及用戶(hù)的資產(chǎn)質(zhì)量數(shù)據(jù)通常是影響客戶(hù)申請(qǐng)?jiān)u分的主要因素。
  • 行為評(píng)分卡(BehaviorCard):行為評(píng)分卡用于貸中客戶(hù)的升降額度管理,主要目的是預(yù)測(cè)客戶(hù)的動(dòng)態(tài)風(fēng)險(xiǎn)。由于客戶(hù)在平臺(tái)上已有歷史數(shù)據(jù),通??蛻?hù)在該平臺(tái)的歷史表現(xiàn)對(duì)行為評(píng)分卡的影響最大。
  • 催收評(píng)分卡(CollectionCard):催收評(píng)分卡一般用于貸后管理,主要使用催收記錄作為數(shù)據(jù)進(jìn)行建模。通過(guò)催收評(píng)分對(duì)用戶(hù)制定不同的貸后管理策略,從而實(shí)現(xiàn)催收人員的合理配置。
  • 反欺詐評(píng)分卡(Anti-fraudCard):反欺詐評(píng)分卡通常用于貸前新客戶(hù)可能存在的欺詐行為的預(yù)測(cè)管理,適用于個(gè)人和機(jī)構(gòu)融資主體。

其中前三種就是我們俗稱(chēng)的“ABC”卡。A卡一般可做貸款0-1年的信用分析;B卡則是在申請(qǐng)人一定行為后,有了較大消費(fèi)行為數(shù)據(jù)后的分析,一般為3-5年;C卡則對(duì)數(shù)據(jù)要求更大,需加入催收后客戶(hù)反應(yīng)等屬性數(shù)據(jù)。

四種評(píng)分卡中,最重要的就是申請(qǐng)?jiān)u分卡,目的是把風(fēng)險(xiǎn)控制在貸前的狀態(tài);也就是減少交易對(duì)手未能履行約定契約中的義務(wù)而造成經(jīng)濟(jì)損失的風(fēng)險(xiǎn)。違約風(fēng)險(xiǎn)包括了個(gè)人違約、公司違約、主權(quán)違約,本案例只講個(gè)人違約。

案例背景

發(fā)放貸款給合適的客戶(hù)是銀行收入的一大來(lái)源,在條件允許的范圍內(nèi),銀行希望貸出去的錢(qián)越多越好,貸款多意味著對(duì)應(yīng)的收入也多,但是如果把錢(qián)貸給了信用不好的人或者企業(yè),就會(huì)面臨貸款收不回來(lái)的情況。

對(duì)于貸款申請(qǐng)的審批,傳統(tǒng)人工審批除了受審批人員的專(zhuān)業(yè)度影響外,也會(huì)受到其主觀影響,另一方面專(zhuān)業(yè)人員的培養(yǎng)通常也需要一個(gè)較長(zhǎng)的周期。 而信用評(píng)分卡技術(shù)的變量、評(píng)分標(biāo)準(zhǔn)和權(quán)重都是給定的。同一筆業(yè)務(wù),只要錄入要素相同,就會(huì)給出一個(gè)參考結(jié)果。既提高了審批效率也減少了人為因素的干擾,如人工審批過(guò)程中的隨意性和不一致性。確保了貸款審批標(biāo)準(zhǔn)的客觀性、標(biāo)準(zhǔn)化和一致性;保證風(fēng)險(xiǎn)特征相近的貸款申請(qǐng)能夠得到相似的審批結(jié)果,如審批通過(guò)與否、授信額度、利率水平等。

信用評(píng)分卡技術(shù)在20世紀(jì)50年代即廣泛應(yīng)用于消費(fèi)信貸,尤其是在信用卡領(lǐng)域。隨著信息技術(shù)的發(fā)展和數(shù)據(jù)的豐富,信用評(píng)分卡技術(shù)也被用于對(duì)小微企業(yè)貸款的評(píng)估,最初是擁有大量客戶(hù)數(shù)據(jù)信息的大型銀行。如富國(guó)銀行1993年首先在小微企業(yè)貸款領(lǐng)域應(yīng)用信用評(píng)分卡技術(shù)。隨后,美國(guó)很多社區(qū)銀行等中小銀行也開(kāi)始廣泛應(yīng)用小微企業(yè)信用評(píng)分系統(tǒng)。

現(xiàn)中國(guó)的某銀行信用卡中心的貸款申請(qǐng)業(yè)務(wù)近期又增長(zhǎng)了10%,原來(lái)的申請(qǐng)?jiān)u分卡已出現(xiàn)數(shù)據(jù)偏移,監(jiān)測(cè)到審批準(zhǔn)確度有下降趨勢(shì)。作為信用卡中心的風(fēng)控建模分析師,小王接到風(fēng)控總監(jiān)下發(fā)的任務(wù):基于近兩年的歷史數(shù)據(jù)(見(jiàn)“數(shù)據(jù)集介紹”的Train_data.csv),重新建立一張“申請(qǐng)?jiān)u分卡”用于預(yù)測(cè)申請(qǐng)者未來(lái)是否會(huì)發(fā)生90天以上的逾期行為,以此來(lái)判斷給哪些客戶(hù)予以發(fā)放,哪些客戶(hù)予以拒絕。

數(shù)據(jù)集介紹

  • 訓(xùn)練數(shù)據(jù):Train_data.csv。該數(shù)據(jù)即有特征X又有標(biāo)簽y,是小王用來(lái)建模的數(shù)據(jù)。
  • 預(yù)測(cè)數(shù)據(jù):Predict_data.csv。該數(shù)據(jù)只有特征X沒(méi)有標(biāo)簽y,為小王需要預(yù)測(cè)的數(shù)據(jù)。也即新進(jìn)的申請(qǐng)信用卡的客戶(hù)相關(guān)信息。

基于Python語(yǔ)言開(kāi)發(fā)信用評(píng)分卡

Part 2 信用評(píng)分卡如何做數(shù)據(jù)準(zhǔn)備工作

導(dǎo)入相關(guān)依賴(lài)模塊

# 加載所需包

%matplotlib inline

import matplotlib.pyplot as plt

import numpy as np

import pandas as pd

import os

import woe.feature_process as fp

import woe.eval as eval

from collections import Counter

from sklearn.model_selection import train_test_split

import seaborn as sns

plt.rc(‘font’, family=‘SimHei’, size=13) # 顯示中文

plt.rcParams[‘a(chǎn)xes.unicode_minus’] = False # 用來(lái)正常顯示負(fù)

import sys

sys.path.append(‘E:\大數(shù)據(jù)實(shí)驗(yàn)室_教研部案例集\自定義函數(shù)’) # 添加自定義函數(shù)文件所在的環(huán)境路徑

from summary_df import data_summary #用于數(shù)據(jù)探查

from score_scale import score_scale

from score_predict import score_predict

數(shù)據(jù)探索

os.chdir(r"E:\大數(shù)據(jù)實(shí)驗(yàn)室_教研部案例集\案例1_信用評(píng)分卡\data")

data_org = pd.read_csv(“Train_data.csv”)

data_summary(data_org)

數(shù)據(jù)準(zhǔn)備

數(shù)據(jù)清洗-ALL數(shù)據(jù)

data_org.drop_duplicates(inplace=True)

#data_org.shape

#(149391, 11)

  • 可見(jiàn)數(shù)據(jù)中存在重復(fù)行。

a = Counter(data_org[‘Label’])

print(“原數(shù)據(jù)集的正負(fù)樣本量為:”,a)

print(“原數(shù)據(jù)集好壞樣本的比例為:{:.5f}”.format(a[0]/a[1]))

原數(shù)據(jù)集的正負(fù)樣本量為: Counter({0: 139382, 1: 10009})

原數(shù)據(jù)集好壞樣本的比例為:13.92567

  • result: 我們知道一般建模所需的好壞客戶(hù)樣本比率約為3:1~5:1。評(píng)分卡建模通常要求正負(fù)樣本的數(shù)量都不少于1500個(gè)。但樣本量也并非越大越好,當(dāng)總樣本量超過(guò)50000個(gè)時(shí),模型的效果將不再隨著樣本量的增加而有顯著變化了,而且數(shù)據(jù)處理與模型訓(xùn)練過(guò)程也較為耗時(shí)。
  • 這里我們需要對(duì)樣本做欠采樣(Subsampling):
  • 負(fù)樣本取10000條
  • 正樣本取40000條

數(shù)據(jù)篩選與數(shù)據(jù)平衡

from sklearn.utils import shuffle

data_org = shuffle(data_org) # 全體數(shù)據(jù)做隨機(jī)打亂

data_bad = data_org[data_org[‘Label’]==1] # 壞客戶(hù)

data_good = data_org[data_org[‘Label’]==0] # 好客戶(hù)

data_bad_select = data_bad.iloc[:10000,:] #選前10000條壞客戶(hù)

data_good_select = data_good.iloc[:40000,:] #選前40000條好客戶(hù)

data_select = pd.concat([data_bad_select,data_good_select]) #最終數(shù)據(jù)

# data_select.shape

#(50000, 11)

拆分訓(xùn)練集和測(cè)試集

from sklearn.model_selection import train_test_split

from collections import Counter

# 數(shù)據(jù)提取與數(shù)據(jù)分割

X = data_select.drop([‘Label’],axis=1) # 特征列

y = data_select[‘Label’] # 標(biāo)簽列

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,random_state=0)

print(“訓(xùn)練集正負(fù)樣本數(shù)據(jù)量:{}”.format(Counter(y_train)))

print(“測(cè)試集正負(fù)樣本數(shù)據(jù)量:{}”.format(Counter(y_test)))

訓(xùn)練集正負(fù)樣本數(shù)據(jù)量:Counter({0: 28017, 1: 6983})

測(cè)試集正負(fù)樣本數(shù)據(jù)量:Counter({0: 11983, 1: 3017})

數(shù)據(jù)清洗-訓(xùn)練數(shù)據(jù)

缺失值處理

查看缺失值分布情況

import missingno as msno # 處理缺失值的包,需要安裝

msno.matrix(X_train)

plt.show()

plt.imshow(~X_train.isna(),aspect=“auto”)

plt.gray()

缺失值處理的常用方法:

缺失值處理方法的選擇,主要依據(jù)是業(yè)務(wù)邏輯和缺失值占比,在對(duì)預(yù)測(cè)結(jié)果的影響盡可能小的情況下,對(duì)缺失值進(jìn)行處理以滿(mǎn)足算法需求,所以要理解每個(gè)缺失值處理方法帶來(lái)的影響,下面的缺失值處理方法沒(méi)有特殊說(shuō)明均是對(duì)特征(列)的處理:

  • 占比較多:如80%以上,直接刪除該變量
    • 如果某些行缺失值占比較多,或者缺失值所在字段是苛刻的必須有值的,刪除行
  • 占比一般:如30%-80%:將缺失值作為單獨(dú)的一個(gè)分類(lèi)
    • 如果特征是連續(xù)的,則其他已有值分箱
    • 如果特征是分類(lèi)的,考慮其他分類(lèi)是否需要重分箱
  • 占比少:10%-30%:多重插補(bǔ):認(rèn)為若干特征之間有相關(guān)性,則可以相互預(yù)測(cè)缺失值
    • 需滿(mǎn)足的假設(shè):MAR:Missing At Random:數(shù)據(jù)缺失的概率僅和已觀測(cè)的數(shù)據(jù)相關(guān),即缺失的概率與未知的數(shù)據(jù)無(wú)關(guān),即與變量的具體數(shù)值無(wú)關(guān)
    • 迭代(循環(huán))次數(shù)可能的話(huà)超過(guò)40,選擇所有的變量甚至額外的輔助變量
    • 詳細(xì)的計(jì)算過(guò)程參考:Multiple Imputation by Chained Equations: What is it and how does it work?
  • 占比較少:10%以下,單一值替換,如中位數(shù),眾數(shù),或者從業(yè)務(wù)理解上用0值、特殊值填充
  • 在決策樹(shù)中可以將缺失值處理融合到算法里:按比重分配
  • 這里的占比并不是固定的,例如缺失值占比只有5%,仍可以用第二種方法,主要依據(jù)業(yè)務(wù)邏輯和算法需求

    本數(shù)據(jù)的缺失值處理邏輯:

    • 對(duì)于信用評(píng)分卡來(lái)說(shuō),由于所有變量都需要分箱,故這里缺失值作為單獨(dú)的箱子即可
    • 對(duì)于最后一列Dependents,缺失值占比只有2.56%,作為單獨(dú)的箱子信息不夠,故做單一值填補(bǔ),這列表示家庭人口數(shù),有右偏的傾向,且屬于計(jì)數(shù)的數(shù)據(jù),故使用中位數(shù)填補(bǔ)
    • 這里沒(méi)必要進(jìn)行多重插補(bǔ),下面的多重插補(bǔ)只是為了讓讀者熟悉此操作

    單一值替換填充缺失值

    # Dependents的缺失值用其中位數(shù)替換

    NOD_median = X_train[“Dependents”].median()

    X_train[“Dependents”].fillna(NOD_median,inplace=True) # fillna填補(bǔ)缺失值的函數(shù),這里用中位數(shù)填補(bǔ)

    X_train[“Dependents”].fillna(NOD_median,inplace=True) # 對(duì)測(cè)試集填充缺失值

    #MonthlyIncome 列的缺失值超過(guò)5%,可作為單獨(dú)的一個(gè)分類(lèi)處理。這里統(tǒng)一將賦值為-8

    X_train[“MonthlyIncome”].fillna(-8,inplace=True)

    X_train[“MonthlyIncome”].fillna(-8,inplace=True)

    C:\Anaconda3\lib\site-packages\pandas\core\generic.py:6287: SettingWithCopyWarning:

    A value is trying to be set on a copy of a slice from a DataFrame

    See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

    self._update_inplace(new_data)

    check數(shù)據(jù)是否還有缺失值

    a = data_summary(X_train)

    data_missing_summary = a[a[‘percent’]<1]

    if

    data_missing_summary.shape[0]==0:

    print(‘?dāng)?shù)據(jù)已經(jīng)沒(méi)有缺失值!’)

    else:

    print(‘?dāng)?shù)據(jù)還存在缺失值,請(qǐng)輸出數(shù)據(jù)框data_missing_summary查看缺失情況!’)

    數(shù)據(jù)已經(jīng)沒(méi)有缺失值!

    異常值處理

    異常值處理的常用方法:

  • 刪除對(duì)應(yīng)的樣本數(shù)據(jù),即所在的行
  • 替換成缺失值,當(dāng)缺失值處理
  • 蓋帽法處理
  • 結(jié)合業(yè)務(wù)邏輯和算法需求判斷是否需要處理異常值以及如何處理,一般情況下蓋帽法即可,即將極端異常的值改成不那么異常的極值。不過(guò)一些算法例如決策樹(shù)中連續(xù)變量的異常值也可以不做處理。

    自定義蓋帽法函數(shù)

    蓋帽法將某連續(xù)變量均值上下三倍標(biāo)準(zhǔn)差范圍外的記錄替換為均值上下三倍標(biāo)準(zhǔn)差值,即蓋帽處理。

    def cap(x,lower=True,upper=True):

    “”"

    函數(shù)功能:蓋帽法處理異常值。

    參數(shù)解釋:

    x: 表示輸入的Series對(duì)象

    lower:表示是否替換1%分位數(shù)

    upper:表示是否替換99%分位數(shù)

    “”"

    # 生成分位數(shù):1%和99%的分位數(shù)

    quantile = [0.01,0.99]

    Q01,Q99=x.quantile(quantile).values.tolist()

    #替換異常值為指定的分位數(shù)

    if lower:

    out = x.mask(x<Q01,Q01)

    if upper:

    out = x.mask(x>Q99,Q99)

    return(x)

    # 先保留原數(shù)據(jù)X_train蓋帽法中的極端值,以備后面訓(xùn)練集和預(yù)測(cè)集處理其異常值時(shí)使用

    df_min_max = X_train.apply(lambda x:x.quantile([0.01,0.99]))

    #蓋帽法處理異常值

    X_train = X_train.apply(cap)

    data_summary(X_train)

    數(shù)據(jù)清洗-測(cè)試集數(shù)據(jù)

    # 用訓(xùn)練的信息填充

    X_test[“Dependents”].fillna(NOD_median,inplace=True) # 對(duì)測(cè)試集填充缺失值

    X_test[“MonthlyIncome”].fillna(-8,inplace=True)

    def cap2(x,df_min_max,lower=True,upper=True):

    “”"

    函數(shù)功能:用訓(xùn)練集中的蓋帽法極端值處理測(cè)試集的異常值。

    參數(shù)解釋:

    x: 表示輸入的Series對(duì)象;

    df_min_max:是訓(xùn)練集中的蓋帽法極端值數(shù)據(jù)框。

    “”"

    col_name = x.name

    Q01,Q99 = df_min_max[col_name].values

    #替換異常值為指定的分位數(shù)

    if lower:

    out = x.mask(x<Q01,Q01)

    if upper:

    out = x.mask(x>Q99,Q99)

    return(x)

    # 用訓(xùn)練集中的蓋帽法極端值處理測(cè)試集的異常值

    for itr in df_min_max.columns:

    X_test[itr] = cap2(X_test[itr],df_min_max)

    # 合并數(shù)據(jù)X,Y

    data_train = pd.concat([X_train,y_train],axis=1)

    data_test = pd.concat([X_test,y_test],axis=1)

    訓(xùn)練數(shù)據(jù)特征處理

    WOE分箱

    我們要制作評(píng)分卡,最終想要得到的結(jié)果是要給各個(gè)特征進(jìn)?分檔,以便業(yè)務(wù)?員能夠根據(jù)新客戶(hù)填寫(xiě)的信息為客戶(hù)打分。我們知道變量(即特征)的形態(tài)可分為離散型和連續(xù)型,離散型天然就是分檔的,因此,我們需要重點(diǎn)如何使連續(xù)變量分檔,即連續(xù)變量離散化。

    連續(xù)變量離散化,我們也常稱(chēng)為分箱或者分組操作。它是評(píng)分卡制作過(guò)程中?個(gè)非常重要的步驟,是評(píng)分卡最難,也是最核?的思路。目的就是使擁有不同屬性的客戶(hù)被分成不同的類(lèi)別,進(jìn)而評(píng)上不同的分?jǐn)?shù)。在評(píng)分卡建模流程中,我們常用WOE(Weight of Evidence,跡象權(quán)數(shù))方法對(duì)變量進(jìn)行分箱。

    WOE分箱的好處:

    • 避免變量值中出現(xiàn)極端值(Outliers)的情形,
    • 減少模型過(guò)度配適(Overfitting)的現(xiàn)象。

    Python代碼實(shí)現(xiàn)woe

    “”"

    woe分箱, iv and transform:

    woe包的使用條件:因變量y的列名必須為"target",列值必須為0或1.

    “”"

    data_train.rename(columns={‘Label’: ‘target’}, inplace=True) # 修改列名為"target"

    civ_dict ={}

    all_cnt = len(data_train) # 所有樣本數(shù)據(jù)量

    n_positive = sum(data_train[‘target’]) # 正樣本數(shù)據(jù)量

    n_negtive = all_cnt - n_positive # 負(fù)樣本數(shù)據(jù)量

    for column in set(data_train.columns)-set([“target”]):

    if data_train[column].dtypes == ‘object’:

    civ = fp.proc_woe_discrete(data_train, column, n_positive, n_negtive, 0.05*all_cnt, alpha=0.02)

    else:

    civ = fp.proc_woe_continuous(data_train, column, n_positive, n_negtive, 0.05*all_cnt, alpha=0.02)

    civ_dict[column]=civ

    --------------process continuous variable:Age---------------

    -----------process continuous variable:Dependents-----------

    -------process continuous variable:OverDue_60_89days--------

    ---------process continuous variable:OverDue_90days---------

    ----------process continuous variable:CreditLoans-----------

    -----------process continuous variable:DebtRatio------------

    -------process continuous variable:OverDue_30_59days--------

    ---------process continuous variable:MortgageLoans----------

    -----process continuous variable:AvailableBalanceRatio------

    ---------process continuous variable:MonthlyIncome----------

    變量的IV值

    用與之相關(guān)的另一個(gè)重要概念,IV值(Information Value,信息值)則用來(lái)衡量該變量(特征)對(duì)好壞客戶(hù)的預(yù)測(cè)能力。

    查看每個(gè)變量對(duì)應(yīng)的IV值

    civ_df = eval.eval_feature_detail(list(civ_dict.values()),out_path=’

    output_feature_detail_20210218.csv’) # 輸出分箱結(jié)果

    # 整理輸出每個(gè)變量的IV值

    iv_result_a = civ_df[[‘var_name’,‘iv’]].drop_duplicates()

    iv_result = iv_result_a[‘iv’]

    iv_result.index = iv_result_a[‘var_name’].values

    Age

    Dependents

    OverDue_60_89days

    OverDue_90days

    CreditLoans

    DebtRatio

    OverDue_30_59days

    MortgageLoans

    AvailableBalanceRatio

    MonthlyIncome

    # 查看每個(gè)變量的IV值

    iv_result.sort_values().plot(kind=“barh”)

    iv_result.sort_values(ascending=False)

    AvailableBalanceRatio 1.173317

    OverDue_90days 0.845325

    OverDue_30_59days 0.723239

    OverDue_60_89days 0.574336

    MonthlyIncome 0.084926

    DebtRatio 0.082108

    CreditLoans 0.073128

    Age 0.063129

    MortgageLoans 0.054396

    Dependents 0.035709

    Name: iv, dtype: float64

    • 可見(jiàn)所有的IV值均大于0.02,故這里使用所有變量

    # 刪除iv值過(guò)小的變量

    iv_thre = 0.02 #閾值設(shè)置為0.02

    keep_vars_iv = iv_result[iv_result > iv_thre]# 篩選出iv值(大于閾值)有辨別能力的變量

    keep_vars_iv

    Age 0.063129

    Dependents 0.035709

    OverDue_60_89days 0.574336

    OverDue_90days 0.845325

    CreditLoans 0.073128

    DebtRatio 0.082108

    OverDue_30_59days 0.723239

    MortgageLoans 0.054396

    AvailableBalanceRatio 1.173317

    MonthlyIncome 0.084926

    Name: iv, dtype: float64

    相關(guān)系數(shù)熱力圖

    通過(guò)變量直接的相關(guān)性系數(shù),建立相關(guān)性矩陣,觀察變量之間的關(guān)系,可以進(jìn)行初步的多重共線(xiàn)性篩選。

    全部變量的相關(guān)信息熱力圖

    p_corr = data_train.corr() # 相關(guān)系數(shù)矩陣,對(duì)稱(chēng)矩陣

    p_corr_tril = np.tril(p_corr,0) # 因此取下三角矩陣

    label_col = p_corr.columns

    res= pd.DataFrame(p_corr_tril,columns=label_col,index=label_col)

    sns.heatmap(res,cmap=‘Blues’);

    部分變量相關(guān)度(>threshold)熱力圖

    #只相關(guān)系數(shù)較高的值,比如大于threshold以上的值

    threshold = 0.75 # 閾值,通常取0.75,0.8附近的值

    p_corr_tril[p_corr_tril<=threshold]=0.01 # 相關(guān)度小于threshold的值都置為0.01

    label_col = p_corr.columns

    res2= pd.DataFrame(p_corr_tril,columns=label_col,index=label_col)

    sns.heatmap(res2,cmap=‘Blues’);

    # 查看iv值

    col=[‘OverDue_30_59days’,‘OverDue_60_89days’, ‘OverDue_90days’]

    keep_vars_iv.loc[col]

    OverDue_30_59days 0.723239

    OverDue_60_89days 0.574336

    OverDue_90days 0.845325

    Name: iv, dtype: float64

    • 可以卡看出’OverDue3059days’,‘OverDue6089days’, ‘OverDue90days’這三個(gè)變量之間具有非常高的相關(guān)度。為剔除多重共線(xiàn)性的影響,我們這里只保留IV值最大的變量’OverDue90days’,刪除’OverDue3059days’,‘OverDue6089days’。

    # 經(jīng)過(guò)IV值和相關(guān)度篩選后保留的變量

    keep_vars = set(keep_vars_iv.index) - {‘OverDue_30_59days’,‘OverDue_60_89days’}

    訓(xùn)練集和測(cè)試集WOE特征轉(zhuǎn)換

    keep_var_woe={} # 篩選后保留的變量{變量名:變量名_woe}

    for i in keep_vars:

    keep_var_woe[i] = i+’_woe’

    #WOE特征轉(zhuǎn)換

    for var_name,var_woe in keep_var_woe.items():

    data_train[var_woe] = fp.woe_trans(data_train[var_name], civ_dict[var_name])

    data_test[var_woe] = fp.woe_trans(data_test[var_name], civ_dict[var_name])

    X_train_woe = data_train[keep_var_woe.values()] # train集的WOE特征

    X_test_woe = data_test[keep_var_woe.values()] # test集的WOE特征

    print(“訓(xùn)練集經(jīng)過(guò)WOE轉(zhuǎn)換后的shape:{}”.format(X_train_woe.shape))

    print(“測(cè)試集經(jīng)過(guò)WOE轉(zhuǎn)換后的shape:{}”.format(X_test_woe.shape))

    訓(xùn)練集經(jīng)過(guò)WOE轉(zhuǎn)換后的shape:(35000, 8)

    測(cè)試集經(jīng)過(guò)WOE轉(zhuǎn)換后的shape:(15000, 8)

    基于Python語(yǔ)言開(kāi)發(fā)信用評(píng)分卡

    Part3 信用評(píng)分卡模型構(gòu)建

    邏輯回歸建模

    網(wǎng)格調(diào)參

    from sklearn.linear_model import LogisticRegression

    from sklearn.model_selection import GridSearchCV

    cv_params ={ ‘C’: np.arange(0.1,1,0.1),

    ‘penalty’: [‘l1’, ‘l2’, ‘elasticnet’, ‘none’],

    ‘solver’: [‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’]

    }

    model = LogisticRegression()

    gs = GridSearchCV(estimator=model,

    param_grid=cv_params,

    scoring=‘roc_auc’,

    cv=5,

    verbose=1,

    n_jobs=4)

    gs.fit(X_train_woe,y_train)

    print(‘測(cè)試集得分:{0}’.format(gs.score(X_test_woe,y_test)))

    # print(‘每輪迭代運(yùn)行結(jié)果:{0}’.format(grid_search.scorer_))

    print(‘參數(shù)的最佳取值:{0}’.format(gs.best_params_))

    print(‘最佳模型得分:{0}’.format(gs.best_score_))

    Fitting 5 folds for each of 180 candidates, totalling 900 fits

    測(cè)試集得分:0.8223083325618374

    參數(shù)的最佳取值:{‘C’: 0.4, ‘penalty’: ‘l2’, ‘solver’: ‘liblinear’}

    最佳模型得分:0.8295380458229852

    建模

    from sklearn.linear_model import LogisticRegression

    other_params = {‘C’: 0.4, ‘penalty’: ‘l2’, ‘solver’: ‘liblinear’}

    LR_model = LogisticRegression(**other_params)

    LR_model.fit(X_train_woe, y_train)

    print(“變量名:\n”,list(keep_var_woe.keys()))

    print(“各個(gè)變量系數(shù):\n”,LR_model.coef_)

    print(“常數(shù)項(xiàng):\n”,LR_model.intercept_)

    變量名:

    [‘Age’, ‘Dependents’, ‘CreditLoans’, ‘DebtRatio’, ‘OverDue_90days’, ‘MortgageLoans’, ‘AvailableBalanceRatio’, ‘MonthlyIncome’]

    各個(gè)變量系數(shù):

    [[ 0.32460639 0.60488285 -0.25729929 0.84472115 0.73975662 0.54027275

    0.7871042 0.16668148]]

    常數(shù)項(xiàng):

    [-1.37892239]

    模型評(píng)估

    模型的評(píng)價(jià)指標(biāo)一般有Gini系數(shù)、K-S值和AUC值,基本上都是基于評(píng)分卡分?jǐn)?shù)的。但是從理論上評(píng)分分?jǐn)?shù)是依據(jù)預(yù)測(cè)為正樣本的概率計(jì)算而得,因此基于這個(gè)概率計(jì)算的指標(biāo)也是成立的。

    下面我們用sklearn庫(kù)中的函數(shù)計(jì)算模型的AUC值和K-S值,以此初步判斷模型的優(yōu)劣。

    from sklearn.metrics import confusion_matrix,roc_auc_score,roc_curve, auc,precision_recall_curve

    y_pred_train = LR_model.predict(X_train_woe)

    y_pred_test = LR_model.predict(X_test_woe)

    訓(xùn)練集的混淆矩陣:

    [[27141 876]

    [ 4657 2326]]

    測(cè)試集的混淆矩陣:

    [[11598 385]

    [ 2032 985]]

    # 預(yù)測(cè)的分值

    y_score_train = LR_model.predict_proba(X_train_woe)[:,1] # 通過(guò) LR_model.classes_ 查看哪列是label=1的值

    y_score_test = LR_model.predict_proba(X_test_woe)[:,1]

    # 分別計(jì)算訓(xùn)練集和測(cè)試集的fpr,tpr,thresholds

    train_index = roc_curve(y_train, y_score_train) #計(jì)算fpr,tpr,thresholds

    test_index = roc_curve(y_test, y_score_test) #計(jì)算fpr,tpr,thresholds

    AUC值

    ROC曲線(xiàn)是以在所有可能的截?cái)帱c(diǎn)分?jǐn)?shù)下,計(jì)算出來(lái)的對(duì)評(píng)分模型的誤授率(誤授率表示模型將違約客戶(hù)誤評(píng)為好客戶(hù),進(jìn)行授信業(yè)務(wù)的比率)和1-誤拒率(誤拒率表示模型將正??蛻?hù)誤評(píng)為壞客戶(hù),拒絕其授信業(yè)務(wù)的比率)的數(shù)量所繪制而成的,AUC值為ROC曲線(xiàn)下方的總面積

    # AUC值

    roc_auc_train = roc_auc_score(y_train, y_score_train)

    roc_auc_test = roc_auc_score(y_test, y_score_test)

    print(‘訓(xùn)練集的AUC:’, roc_auc_train)

    print(‘測(cè)試集的AUC:’, roc_auc_test)

    訓(xùn)練集的AUC: 0.8297773383440796

    測(cè)試集的AUC: 0.8223083325618374

    • 訓(xùn)練集和測(cè)試集的AUC值相差不大,沒(méi)有發(fā)生過(guò)擬合的情況

    我們?cè)倮L制訓(xùn)練集的ROC曲線(xiàn)與測(cè)試集的ROC曲線(xiàn)

    KS曲線(xiàn)

    K-S 測(cè)試圖用來(lái)評(píng)估評(píng)分卡在哪個(gè)評(píng)分區(qū)間能夠?qū)⒄?蛻?hù)與違約客戶(hù)分開(kāi)。根據(jù)各評(píng)分分?jǐn)?shù)下好壞客戶(hù)的累計(jì)占比,就可完成K-S測(cè)試圖。

    print(“訓(xùn)練集的KS值為:{}”.format(max(train_index[1]-train_index[0])))

    print(“測(cè)試集的KS值為:{}”.format(max(test_index[1]-test_index[0])))

    訓(xùn)練集的KS值為:0.5117269204064546

    測(cè)試集的KS值為:0.5067980932328976

    # ------------------------- KS 曲線(xiàn)

    ---------------------------

    繪制訓(xùn)練集與測(cè)試集的KS曲線(xiàn)

    result: 從AUC值和K-S值來(lái)看,我們訓(xùn)練的模型對(duì)好壞客戶(hù)已經(jīng)具有非常良好的區(qū)辨能力了。并且訓(xùn)練集和測(cè)試集指標(biāo)接近,沒(méi)有發(fā)生過(guò)擬合的情況。

    需要注意的是實(shí)際業(yè)務(wù)中數(shù)據(jù)需要這樣準(zhǔn)備:模型開(kāi)發(fā)前,我們一般會(huì)將數(shù)據(jù)分為:訓(xùn)練集train、測(cè)試集test、跨時(shí)間數(shù)據(jù)OOT(train和test是同一時(shí)間段數(shù)據(jù),一般三七分,oot是不同時(shí)間段的數(shù)據(jù),用來(lái)驗(yàn)證模型是否適用未來(lái)場(chǎng)景)通過(guò)這樣的技術(shù)保證模型最終可靠穩(wěn)定。

    生成評(píng)分卡

    評(píng)分卡輸出

    # 用自定義的評(píng)分卡函數(shù)score_scale生成評(píng)分卡,參數(shù)可見(jiàn)具體的函數(shù)

    r=score_scale(LR_model,X_train_woe,civ_df,pdo=20,score=600,odds=10)

    # 輸出最終的評(píng)分卡

    r.ScoreCard.to_excel(“ScoreCard.xlsx”,index=False)

    print(“評(píng)分卡最大值和最小值區(qū)間為:{}”.format(r.minmaxscore))

    評(píng)分卡最大值和最小值區(qū)間為:[447, 640]

    基于評(píng)分的KS值

    繪制結(jié)果如下:

    策略建議

    由訓(xùn)練集的KS值可知,570分是好壞樣本的最佳分隔點(diǎn)。測(cè)試集對(duì)其進(jìn)行驗(yàn)證,KS值為569,基本一致。因此我們可在訓(xùn)練集的KS值上下10分內(nèi)可做如下策略:

    • 580分以上的直接予以通過(guò);
    • 560分以上的直接予以拒絕;
    • [560,580]之間的人群,可以加入人工判斷進(jìn)行審核。

    以上只是我們給出的策略建議,實(shí)際問(wèn)題和需求遠(yuǎn)比這里復(fù)雜,風(fēng)控人員可以根據(jù)具體業(yè)務(wù)需求給出更加貼合實(shí)際業(yè)務(wù)的策略建議。

    新數(shù)據(jù)的預(yù)測(cè)

    數(shù)據(jù)準(zhǔn)備

    # 讀取預(yù)測(cè)數(shù)據(jù)

    data_predict = pd.read_csv(“Predict_data.csv”)

    # 缺失值的處理

    data_predict[“Dependents”].fillna(NOD_median,inplace=True) #用訓(xùn)練集填信息充缺失值

    data_predict[“MonthlyIncome”].fillna(-8,inplace=True)

    # 異常值的處理:用訓(xùn)練集中的蓋帽法極端值處理預(yù)測(cè)集的異常值

    for itr in df_min_max.columns:

    data_predict[itr] = cap2(data_predict[itr],df_min_max)

    # WOE特征轉(zhuǎn)換

    for var_name,var_woe in keep_var_woe.items():

    data_predict[var_woe] = fp.woe_trans(data_predict[var_name], civ_dict[var_name])

    X_predict_woe = data_predict[keep_var_woe.values()] # train集的WOE特征

    print(“用于預(yù)測(cè)的數(shù)據(jù)集經(jīng)過(guò)WOE轉(zhuǎn)換后的shape:{}”.format(X_predict_woe.shape))

    用于預(yù)測(cè)的數(shù)據(jù)集經(jīng)過(guò)WOE轉(zhuǎn)換后的shape:(101503, 8)

    預(yù)測(cè)

    # 預(yù)測(cè)客戶(hù)的評(píng)分結(jié)果

    score_result = score_predict(data_predict,r)

    # 預(yù)測(cè)為正樣本的概率

    X_predict_woe = data_predict[keep_var_woe.values()]

    # 合并評(píng)分和概率

    y_score_predict = LR_model.predict_proba(X_predict_woe)[:,1] # 通過(guò) LR_model.classes_ 查看哪列是label=1的值

    y_score_predict = pd.Series(y_score_predict).to_frame(name=‘預(yù)測(cè)為違約客戶(hù)的概率’)

    # 保留用戶(hù)ID、預(yù)測(cè)評(píng)分和預(yù)測(cè)概率三列信息,并輸出

    data_predict_score = score_result[[‘UserID’,‘Score’]].rename(columns={‘Score’:‘預(yù)測(cè)評(píng)分’})

    predict_result = pd.concat([data_predict_score,y_score_predict],axis=1)

    # 生成“策略建議”策列

    cut_off = 570 #切分值

    f = 10 #上下浮動(dòng)值

    fuc = lambda x:‘通過(guò)’ if x>cut_off+f else ‘拒絕’ if x<cut_off-f else ‘人工介入審核’

    predict_result[‘策略建議’] = predict_result[‘預(yù)測(cè)評(píng)分’].map(fuc)

    predict_result.to_excel(“predict_result.xlsx”,index=False)# 輸出預(yù)測(cè)結(jié)果to excel

    predict_result.head(20) #查看前20行

    predict_result.groupby(‘策略建議’).size().to_frame(name=‘人數(shù)統(tǒng)計(jì)’)

    • Result: 這里銀行原本需要審批的客戶(hù)量有105103(=13747+21049+66707。這里經(jīng)過(guò)小王的模型策略,需要人工介入審核的客戶(hù)量降為13747,只占全部的13.08%。而其中86.92%的客戶(hù)都能自動(dòng)決策是通過(guò)還是拒絕。

    結(jié)束語(yǔ)

    至此,我們已經(jīng)用python實(shí)現(xiàn)了一個(gè)申請(qǐng)?jiān)u分卡的開(kāi)發(fā)過(guò)程,并在結(jié)尾給出了策略建議。數(shù)據(jù)化后的風(fēng)控極大提高了銀行的審批效率,這是傳統(tǒng)的人工審核不可比擬的,也正是大數(shù)據(jù)時(shí)代帶給我們的便利。另外需要注意的是,在實(shí)際中,模型上線(xiàn)還需要持續(xù)追蹤模型的表現(xiàn),一般是每個(gè)月月初給全量客戶(hù)打分,并生成前端和后端監(jiān)控報(bào)告。基于Python的信用評(píng)分卡模型主要流程就為大家介紹到這里,但實(shí)操評(píng)分卡建模中有很多細(xì)節(jié),互聯(lián)網(wǎng)上對(duì)這些細(xì)節(jié)描述過(guò)于草率甚至不正確。例如變量缺失率達(dá)到80%-90%就應(yīng)該直接刪除該變量嗎?變量相關(guān)性高達(dá)0.8就可以去掉嗎?經(jīng)驗(yàn)豐富建模人員需要在數(shù)學(xué)理論,業(yè)務(wù)線(xiàn)實(shí)際需求,計(jì)算機(jī)測(cè)試結(jié)果等多方面找到平衡點(diǎn),而不是只從一個(gè)角度思考問(wèn)題。這就像經(jīng)驗(yàn)豐富外科醫(yī)生并不一定完全遵循教科書(shū)的理論。統(tǒng)計(jì)學(xué),機(jī)器學(xué)習(xí),人工智能等領(lǐng)域里有很多爭(zhēng)議地方,并非有完全統(tǒng)一共識(shí)。各位在學(xué)習(xí)時(shí)要保持獨(dú)立思考能力,這樣才能不斷優(yōu)化數(shù)據(jù)科學(xué)知識(shí)。

    基于Python的信用評(píng)分卡模型-give me some credit就為大家介紹到這里了,歡迎各位同學(xué)報(bào)名<python金融風(fēng)控評(píng)分卡模型和數(shù)據(jù)分析微專(zhuān)業(yè)課>,學(xué)習(xí)更多相關(guān)知識(shí)
    https://edu.csdn.net/combo/detail/1927

    版權(quán)聲明:文章來(lái)自公眾號(hào)(python風(fēng)控模型),未經(jīng)許可,不得抄襲。遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

    總結(jié)

    以上是生活随笔為你收集整理的「实战案例」基于Python语言开发的信用评分卡的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。