金融风控实战——迁移学习
遷移學(xué)習(xí)
為什么做遷移?
源域樣本和目標域樣本分布有區(qū)別,目標域樣本量又不夠。
場景
思考我們平時建模會使用到遷移學(xué)習(xí)的一些場景:
1)新開了某個消費分期的場景只有少量樣本,需要用其他場景的數(shù)據(jù)進行建模;
2)業(yè)務(wù)被迫停止3個月后項目重啟,大部分訓(xùn)練樣本比較老舊,新的訓(xùn)練樣本又不夠;
3)在某個新的國家開展了類似國內(nèi)的業(yè)務(wù),因為國情不同,顯然部分特征分布是不同的;
主要任務(wù)
縮小邊緣分布之間和條件分布下的差異。
幾個基本概念:
-
Domain(域):包括兩部分:feature space(特征空間)和probability(概率)。所以當(dāng)domain不同的時候,分兩種情況。可能是feature space不同,也可能是feature space一樣但probability不同;
-
Task(任務(wù)):包括兩部分: label space(標記空間)和objective predictive function(目標預(yù)測函數(shù))。同理,當(dāng)task不同的時候,也分兩種情況。可能是label space不同,也可能是label space一樣但function不同;
-
Source(源)是用于訓(xùn)練模型的域/任務(wù);
-
Targe(任務(wù))是要用前者的模型對自己的數(shù)據(jù)進行預(yù)測/分類/聚類等機器學(xué)習(xí)任務(wù)的域/任務(wù)。
通常我們說的遷移學(xué)習(xí)就是指將知識從源域遷移到目標域的過程。
比如我們有大量英短銀漸層的圖片,和少量美短起司的照片,想訓(xùn)練一個判別當(dāng)前的貓是不是美短起司的學(xué)習(xí)器。如果我們用英短銀漸層圖片來作為樣本,顯然訓(xùn)練的模型是不能用來判別美短起司的,用美短起司的樣本來訓(xùn)練,樣本量又太小。這時候我們可能會使用英短銀漸層來訓(xùn)練一個卷積神經(jīng)網(wǎng)絡(luò),然后將這個網(wǎng)絡(luò)的中間結(jié)構(gòu)取出來作為目標模型的前半部分,然后在少量的美短起司的樣本上再繼續(xù)學(xué)習(xí)后面的幾層網(wǎng)絡(luò)(再訓(xùn)練、再學(xué)習(xí))。熟悉卷積神經(jīng)網(wǎng)絡(luò)的同學(xué)可能知道,CNN的前幾層主要學(xué)習(xí)的是輪廓和局部形狀等共性特征。這樣通過前面的學(xué)習(xí),我們就知道了貓咪的共性,再通過對起司的學(xué)習(xí)得到細節(jié)上的差異。
然后在提遷移學(xué)習(xí)前,首先說另一種學(xué)習(xí)方法,叫做增量學(xué)習(xí)。
增量學(xué)習(xí)主要關(guān)注的是災(zāi)難性遺忘(Catastrophic forgetting),平衡新知識與舊知識之間的關(guān)系。但我們可以用它來模擬神經(jīng)網(wǎng)絡(luò)中的finetune.
Xgboost提供兩種增量訓(xùn)練的方式:
- 一種是在當(dāng)前迭代樹的基礎(chǔ)上增加新樹,原樹不變;(層遷移,兩只小貓咪的例子)
- 另一種是當(dāng)前迭代樹結(jié)構(gòu)不變,重新計算葉節(jié)點權(quán)重,同時也可增加新樹。 (fine—tuning)
增量學(xué)習(xí)有什么用呢?
我們可以仿照神經(jīng)網(wǎng)絡(luò)中的基于模型的遷移學(xué)習(xí),先用一部分樣本訓(xùn)練前幾棵樹,然后用新的樣本學(xué)習(xí)后面的樹,通常我們可能用源域與目標域的混合數(shù)據(jù)訓(xùn)練前幾棵樹,以得到更好的表達能力,最后用目標域的數(shù)據(jù)訓(xùn)練后面幾棵樹。
import xgboost as xgb from sklearn.datasets import load_digits # 訓(xùn)練數(shù)據(jù)xgb_params_01 = {}digits_2class = load_digits(2) X_2class = digits_2class['data'] y_2class = digits_2class['target']dtrain_2class = xgb.DMatrix(X_2class, label=y_2class)gbdt_03 = xgb.train(xgb_params_01, dtrain_2class, num_boost_round=3) # 訓(xùn)練三棵樹的模型gbdt_03a = xgb.train(xgb_params_01, dtrain_2class, num_boost_round=7, xgb_model=gbdt_03) # 在原模型基礎(chǔ)上繼續(xù)訓(xùn)練深度學(xué)習(xí)常見的遷移方法
- 模型再優(yōu)化(fine—tuning,小量樣本調(diào)優(yōu),會造成過擬合,我們就會做一些遷移的手段,比如說保守訓(xùn)練,先用原模型的參數(shù)作為基礎(chǔ)繼續(xù)再用新的數(shù)據(jù)集做訓(xùn)練,這樣我們就能在這些參數(shù)上面加一些正則化,保證參數(shù)的改變不會太大)
- 層遷移(兩只小貓咪)
- 域?qū)惯w移(兩個domain,M1國內(nèi)(大量的樣本)、M2國外(少量樣本),我們希望模型最大化label準確率,最小化domain分類準確率,我希望模型能區(qū)分好人還是壞人,而不能區(qū)分這個人屬于M1的域還是M2的域)
M1國內(nèi)有l(wèi)abel,M2國外無label。M1+M2=TM,TM打來自于M1還是M2的標簽
目前有突破的遷移學(xué)習(xí)算法基本上可以概括這幾類:
基于實例的遷移學(xué)習(xí)方法 (可以保留模型的解釋性,本門課的重點)
- 代表有Dai等人提出的基于實例的 TrAdaBoost 遷移學(xué)習(xí)算法。當(dāng)目標域中的樣本被錯誤地分類之后,可以認為這個樣本是很難分類的,因此增大這個樣本的權(quán)重,在下一次的訓(xùn)練中這個樣本所占的比重變大 。如果源域中的一個樣本被錯誤地分類了,可以認為這個樣本對于目標數(shù)據(jù)是不同的,因此降低這個樣本的權(quán)重,降低這個樣本在分類器中所占的比重。
基于特征的遷移學(xué)習(xí)方法
可以分為基于特征選擇的遷移學(xué)習(xí)方法和基于特征映射的遷移學(xué)習(xí)方法。
-
基于特征選擇的遷移學(xué)習(xí)方法是識別出源領(lǐng)域與目標領(lǐng)域中共有的特征表示,然后利用這些特征進行知識遷移。
-
基于特征映射的遷移學(xué)習(xí)方法是把各個領(lǐng)域的數(shù)據(jù)從原始高維特征空間映射到低維特征空間,在該低維空間下,源領(lǐng)域數(shù)據(jù)與目標領(lǐng)域數(shù)據(jù)擁有相同的分布。這樣就可以利用低維空間表示的有標簽的源領(lǐng)域樣本數(shù)據(jù)訓(xùn)練分類器,對目標測試數(shù)據(jù)進行預(yù)測。
基于模型的遷移學(xué)習(xí)方法
- 由源域?qū)W習(xí)到的模型應(yīng)用到目標域上,再根據(jù)目標域?qū)W習(xí)新的模型。該方法首先針對已有標記的數(shù)據(jù),利用決策樹構(gòu)建魯棒性的行為識別模型,然后針對無標定數(shù)據(jù),利用K-Means聚類等方法尋找最優(yōu)化的標定參數(shù)。比如 TRCNN等
我們平時用的最多的就是基于實例的遷移學(xué)習(xí)方法,今天主要圍繞樣本的選擇上做展開。
下面介紹幾個統(tǒng)計概念
聯(lián)合分布(joint distribution)
很多情況下,我們對于幾個變量同時的取值有關(guān)問題感興趣,例如我們需要知道事件“ lntellegence = high 且Grade= A”的概率。分析這樣的事件,則需要考慮兩個隨機變量的聯(lián)合分布(joint distribution)。下圖為聯(lián)合分布的一個例子。
from IPython.display import Image Image(filename='./image/1.png', width=600)
上圖表示了隨機變量 I,D,GI,D,GI,D,G的一個聯(lián)合分布,其中包含3個變量,分別是:III(學(xué)生智力,有0和1兩個取值)、DDD(試卷難度,有0和1兩個取值)、GGG(成績等級,有1、2、3三個取值)。故而這三個離散的隨機變量共有 2×2×3=122×2×3=122×2×3=12種聯(lián)合分布狀態(tài)。
上表中我們可以讀出系統(tǒng)取值為這 12 個聯(lián)合分布狀態(tài)中任一個的概率,例如:P(I=0,D=0,G=1)=0.126.P(I=0,D=0,G=1)=0.126.P(I=0,D=0,G=1)=0.126.
條件分布
當(dāng)對于一組隨機變量,考慮其中某些變量取值特定值時,其余變量的分布是一種條件分布問題。
可以看到,條件分布率就是在邊緣分布率的基礎(chǔ)上都加上“另一個隨機變量取定某值”這個條件。
簡單來說,對于二緯離散隨機變量有:
P(X=xi∣Y=yj)=P(X=xi,Y=yj)P(Y=yj)P(X=x_i|Y=y_j)=\frac{P(X=x_i,Y=y_j)}{P(Y=y_j)}P(X=xi?∣Y=yj?)=P(Y=yj?)P(X=xi?,Y=yj?)?
為在 Y=yjY=y_jY=yj? 條件下 X 的條件分布率. (其中iii為固定的),也稱作該聯(lián)合分布在YYY上的條件分布。
回到 3.2 中例子來看,下圖中表是概率的聯(lián)合分布,表中隨便去掉所有包含某個值的行,就能對分布表進行縮減。
例如可以去掉所有 GGG 不為 1 的行,這樣就只剩下了 1、4、7、10 行,這樣他們的概率之和就不為 1 了,所以需要重新標準化(Renormalization),從而推得原聯(lián)合分布在 GGG 上的條件分布4。如圖為推導(dǎo)過程。
Image(filename='./image/2.png', width=600)
剔除無關(guān)取值(GGG 不為 1 的行)
標準化得到的值
即得到之前的聯(lián)合分布在變量 Grade(g)Grade(g)Grade(g)上的條件分布為上圖右邊的表格。
反之也可以把所有含有某個值得行相加,這就是接下來要講的邊緣化(Marginalization)。由此可得上圖中聯(lián)合分布在變量 D 上的邊緣分布如下圖右表。
Image(filename='./image/5.png', width=600)邊緣分布
一旦定義了隨機變量,我們就可以在能夠用 XXX 描述的事件上考慮分布。這個分布通常稱為隨機變量 XXX 的邊緣分布(marginal distribution) ,記為 P(X) . 這時單獨只考慮 XXX 的取值,與其它隨機變量取什么值的概率無關(guān)了。
例如,3.2 中聯(lián)合分布例子里,III 的邊緣分布為:
P(I=0)=0.126+0.168+0.126+0.009+0.045+0.126P(I=0)=0.126+0.168+0.126+0.009+0.045+0.126 P(I=0)=0.126+0.168+0.126+0.009+0.045+0.126
P(I=1)=0.252+0.0224+0.0056+0.06+0.036+0.024P(I=1)=0.252+0.0224+0.0056+0.06+0.036+0.024 P(I=1)=0.252+0.0224+0.0056+0.06+0.036+0.024
獨立同分布
我們建模的時候一直在強調(diào)獨立同分布,那么什么叫 獨立同分布?
獨立同分布即指變量均服從同一種分布,并且變量之間是相互獨立的(在多數(shù)情況下其實是不滿足的,但往往選擇忽略并不緊密的聯(lián)系)。例如隨機變量X1和X2,兩個變量獨立即指X1的出現(xiàn)并不影響X2,同理X2的出現(xiàn)并不影響X1,并且X1和X2所在的樣本集具有相同的分布形狀和分布參數(shù)。
對離散隨機變量具有相同的分布律,對連續(xù)隨機變量則有相同的概率密度函數(shù),有著相同的分布函數(shù),相同的期望和方差。
P(I=1)=0.252+0.0224+0.0056+0.06+0.036+0.024P(I=1)=0.252+0.0224+0.0056+0.06+0.036+0.024 P(I=1)=0.252+0.0224+0.0056+0.06+0.036+0.024
再回想一下我們的主要任務(wù):
縮小邊緣分布之間和條件分布下的差異。
實現(xiàn)方法
剛剛說了我們的主要任務(wù)是 縮小邊緣分布和條件分布下的差異。
那么如何實現(xiàn)這兩個目標呢?
1)縮小訓(xùn)練集與測試集的邊緣分布的距離,通常的做法是清洗訓(xùn)練樣本,去除一些異常點或者減少他們的權(quán)重。這樣可以將訓(xùn)練樣本的分布與測試樣本的分布保持一致。
2)如果想減少條件分布的差異呢?用決策樹舉例子,我們還需要在決策樹劃分的每一層的樣本中,重復(fù)上述過程,才可以保證條件概率分布也是相近的。
我們這里不得不介紹一下另一個Boosting的樹模型–AdaBoost
這是它的迭代過程。
Image(filename='./image/6.png', width=500)
如果不搞清楚他的原理,看Tradaboost代碼可能會一臉問號。
TrAdaboost
簡述
它是Adaboost學(xué)習(xí)方法發(fā)展而來,作者是Wenyuan Dai。TrAdaboost算法是用來解決訓(xùn)練集和測試集分布不同的問題。在遷移學(xué)習(xí)的某些情況下,一個訓(xùn)練集中會包含大量的輔助訓(xùn)練樣本和少量的源訓(xùn)練樣本,我們會將兩個不同分布的訓(xùn)練集放在一起訓(xùn)練,這種方法也稱為基于實例的遷移學(xué)習(xí)方法。
原理
1)Tradaboost是由Adaboost算法演變而來的,我們先來看Adaboost算法的基本思想:當(dāng)一個訓(xùn)練樣本被錯誤分類,算法就會認為這個樣本是難分類的,就相應(yīng)地給此樣本增加樣本權(quán)重,下次訓(xùn)練時這個樣本被分錯的概率就會降低。
2)類似地,在一個包含源訓(xùn)練數(shù)據(jù)和輔助訓(xùn)練數(shù)據(jù)的訓(xùn)練集中,TrAdaboost算法也會對訓(xùn)練樣本進行權(quán)重調(diào)整,對于源數(shù)據(jù)樣本,權(quán)重調(diào)整策略跟Adaboost差不多:如果一個源訓(xùn)練樣本被錯誤分類,根據(jù)這一次源樣本訓(xùn)練時的錯誤率進行調(diào)整,增加權(quán)重,降低下次訓(xùn)練時的分類誤差;對于輔助訓(xùn)練樣本:當(dāng)它們被誤分類后,算法則認為它們是與目標數(shù)據(jù)很不同的,于是降低它們的權(quán)重,權(quán)重調(diào)整的依據(jù)是Hedge(b);
3)Tradaboost通過提升多個弱分類器,對后半(N/2~N)個弱分類器進行綜合投票,得出最后的決策。
Image(filename='./image/10.png', width=500)
TrAdaBoost 和 AdaBoost 主要區(qū)別在于:
1)TrAdaBoost 的輸入是 Ds (源域)和 Dt (目標域)對應(yīng)的兩個數(shù)據(jù)集,并從 Ds 中只選取對學(xué)習(xí)任務(wù) Tt 最有用的知識;
2)TrAdaBoost 在計算模型誤差時,僅考慮在 Dt 上的誤差;
3)TrAdaBoost 在 Ds 和 Dt 中使用不同的樣本調(diào)權(quán)方式;
4)TrAdaBoost 僅使用學(xué)習(xí)到的所有基學(xué)習(xí)器中,后訓(xùn)練的半數(shù)基學(xué)習(xí)器來預(yù)測模型效果。
樣本的初始權(quán)重設(shè)置和基分類器選取比較關(guān)鍵。初始權(quán)重設(shè)置是較強的先驗信息,而且,如果初始權(quán)重設(shè)置不當(dāng),也會影響計算穩(wěn)定性。我們可以通過不同領(lǐng)域的樣本比例,或根據(jù)不同類別樣本對應(yīng)的比例,或綜合考慮前二者來設(shè)置初始權(quán)重。另外,基分類器的選取也會影響迭代輪數(shù)、計算穩(wěn)定性和模型最終效果。
案例:跨國家跨場景遷移模型
某知名金融公司在印度新展開的小額現(xiàn)金貸產(chǎn)品,積累了少量Label樣本(約1200條),用于建模樣本量顯然不夠,考慮到雖然國家不同,但借款用戶的本質(zhì)大體相似。考慮從國內(nèi)大額產(chǎn)品的存量客戶上面做遷移,首先制作四個變量。制作變量時要保證國內(nèi)與印度客群都有這個字段并且字段的含義能保證一致。所以當(dāng)前的問題就變成了:將知識從國內(nèi)樣本(源域)遷移至只有少量樣本的印度客群(目標域)。
import pandas as pd from sklearn.metrics import roc_auc_score,roc_curve,auc from sklearn.model_selection import train_test_split from sklearn import metrics from sklearn.linear_model import LogisticRegression from sklearn.svm import LinearSVC import numpy as np import random import math from sklearn.calibration import CalibratedClassifierCV data = pd.read_excel("/Users/zhucan/Desktop/tra_sample.xlsx") data.head() data.shape #(95806, 6) data.type.unique() #array(['target', 'origin', 'offtime'], dtype=object) #offtime國外的樣本的測試集feature_lst = ['zx_score','msg_cnt','phone_num_cnt','register_days'] train = data[data.type == 'target'].reset_index().copy() diff = data[data.type == 'origin'].reset_index().copy() val = data[data.type == 'offtime'].reset_index().copy()print(train.shape) print(diff.shape) val.shape #(14527, 7) #(65304, 7) #(15975, 7)#trans_S, trans_A, label_S, label_A, test train = train.loc[:1200]trans_S = train[feature_lst].copy() #目標域 label_S = train['bad_ind'].copy() trans_S.shape #(1201, 4) trans_A = diff[feature_lst].copy() #源域 label_A = diff['bad_ind'].copy() trans_A.shape #(65304, 4) val_x = val[feature_lst].copy() val_y = val['bad_ind'].copy() test = val_x.copy() test.shape #(15975, 4) lr_model = LogisticRegression(C=0.1,class_weight = 'balanced',solver = 'liblinear') lr_model.fit(trans_S,label_S)y_pred = lr_model.predict_proba(trans_S)[:,1] fpr_lr_train,tpr_lr_train,_ = roc_curve(label_S,y_pred) train_ks = abs(fpr_lr_train - tpr_lr_train).max() print('train_ks : ',train_ks)y_pred = lr_model.predict_proba(test)[:,1] fpr_lr,tpr_lr,_ = roc_curve(val_y,y_pred) val_ks = abs(fpr_lr - tpr_lr).max() print('val_ks : ',val_ks)from matplotlib import pyplot as plt plt.plot(fpr_lr_train,tpr_lr_train,label = 'train LR') plt.plot(fpr_lr,tpr_lr,label = 'evl LR') plt.plot([0,1],[0,1],'k--') plt.xlabel('False positive rate') plt.ylabel('True positive rate') plt.title('ROC Curve') plt.legend(loc = 'best') plt.show() #train_ks : 0.48500238435860754 #val_ks : 0.3887057754389137 trans_data = np.concatenate((trans_A, trans_S), axis=0) trans_label = np.concatenate((label_A, label_S), axis=0)lr_model = LogisticRegression(C=0.3,class_weight = 'balanced',solver = 'liblinear') lr_model.fit(trans_A,label_A)y_pred = lr_model.predict_proba(trans_data)[:,1] fpr_lr_train,tpr_lr_train,_ = roc_curve(trans_label,y_pred) train_ks = abs(fpr_lr_train - tpr_lr_train).max() print('train_ks : ',train_ks)y_pred = lr_model.predict_proba(test)[:,1] fpr_lr,tpr_lr,_ = roc_curve(val_y,y_pred) val_ks = abs(fpr_lr - tpr_lr).max() print('val_ks : ',val_ks)from matplotlib import pyplot as plt plt.plot(fpr_lr_train,tpr_lr_train,label = 'train LR') plt.plot(fpr_lr,tpr_lr,label = 'evl LR') plt.plot([0,1],[0,1],'k--') plt.xlabel('False positive rate') plt.ylabel('True positive rate') plt.title('ROC Curve') plt.legend(loc = 'best') plt.show() #train_ks : 0.4910909493184976 #val_ks : 0.33077621830414 import numpy as np from sklearn import tree#邏輯回歸的學(xué)習(xí)率、權(quán)重的大小,影響整體收斂的快慢 #初始權(quán)重很重要# H 測試樣本分類結(jié)果 # TrainS 目標域樣本 # TrainA 源域樣本 # LabelS 目標域標簽 # LabelA 源域標簽 # Test 測試樣本 # N 迭代次數(shù)#計算weight def calculate_P(weights, label):total = np.sum(weights)return np.asarray(weights / total, order='C')#用邏輯回歸作為基分類器,輸出概率 def train_classify(trans_data, trans_label, test_data, P):clf = LogisticRegression(C=0.3,class_weight = 'balanced',solver='liblinear')clf.fit(trans_data, trans_label, sample_weight=P[:, 0])return clf.predict_proba(test_data)[:,1],clf#計算在目標域上面的錯誤率 def calculate_error_rate(label_R, label_H, weight):total = np.sum(weight)return np.sum(weight[:, 0] / total * np.abs(label_R - label_H)) #預(yù)測-真實#根據(jù)邏輯回歸輸出的score的得到標簽,注意這里不能用predict直接輸出標簽 def put_label(score_H,thred):new_label_H = []for i in score_H:if i <= thred:new_label_H.append(0)else:new_label_H.append(1)return new_label_H#指定迭代次數(shù),相當(dāng)于集成模型中基模型的數(shù)量 N=500trans_data = np.concatenate((trans_A, trans_S), axis=0) trans_label = np.concatenate((label_A, label_S), axis=0)row_A = trans_A.shape[0] row_S = trans_S.shape[0] row_T = test.shape[0]test_data = np.concatenate((trans_data, test), axis=0)# 初始化權(quán)重 weights_A = np.ones([row_A, 1])/row_A weights_S = np.ones([row_S, 1])/row_S*2 weights = np.concatenate((weights_A, weights_S), axis=0)bata = 1 / (1 + np.sqrt(2 * np.log(row_A / N)))# 存儲每次迭代的標簽和bata值? bata_T = np.zeros([1, N]) # 存每一次迭代的 error_rate / (1 - error_rate) result_label = np.ones([row_A + row_S + row_T, N])predict = np.zeros([row_T])trans_data = np.asarray(trans_data, order='C') trans_label = np.asarray(trans_label, order='C') test_data = np.asarray(test_data, order='C')best_ks = -1 #最優(yōu)KS best_round = -1 #最優(yōu)基模型數(shù)量 best_model = -1 #最優(yōu)模型# 初始化結(jié)束for i in range(N):P = calculate_P(weights, trans_label)result_label[:, i],model = train_classify(trans_data, trans_label,test_data, P)score_H = result_label[row_A:row_A + row_S, i]pctg = np.sum(data.bad_ind)/len(data.bad_ind)thred = pd.DataFrame(score_H).quantile(1-pctg)[0]label_H = put_label(score_H,thred)error_rate = calculate_error_rate(label_S, label_H,weights[row_A:row_A + row_S, :])if error_rate > 0.5:error_rate = 0.5if error_rate == 0:N = ibreak # 防止過擬合# error_rate = 0.001bata_T[0, i] = error_rate / (1 - error_rate)# 調(diào)整目標域樣本權(quán)重for j in range(row_S):weights[row_A + j] = weights[row_A + j] * np.power(bata_T[0, i],(-np.abs(result_label[row_A + j, i] - label_S[j])))# 調(diào)整源域樣本權(quán)重for j in range(row_A):weights[j] = weights[j] * np.power(bata, np.abs(result_label[j, i] - label_A[j]))y_pred = result_label[(row_A + row_S):,i]fpr_lr_train,tpr_lr_train,_ = roc_curve(val_y,y_pred)train_ks = abs(fpr_lr_train - tpr_lr_train).max()print('test_ks : ',train_ks,'當(dāng)前第',i+1,'輪')if train_ks > best_ks :best_ks = train_ksbest_round = ibest_model = model #test_ks : 0.15578884442899515 當(dāng)前第 1 輪 #test_ks : 0.14516536326608226 當(dāng)前第 2 輪 #test_ks : 0.15162300261719303 當(dāng)前第 3 輪 #test_ks : 0.1558032631518237 當(dāng)前第 4 輪 # . . . #test_ks : 0.38762651455043984 當(dāng)前第 498 輪 #test_ks : 0.38762651455043984 當(dāng)前第 499 輪 #test_ks : 0.38762651455043984 當(dāng)前第 500 輪y_pred = best_model.predict_proba(trans_S)[:,1] fpr_lr_train,tpr_lr_train,_ = roc_curve(label_S,y_pred) train_ks = abs(fpr_lr_train - tpr_lr_train).max() print('train_ks : ',train_ks)y_pred = best_model.predict_proba(test)[:,1] fpr_lr,tpr_lr,_ = roc_curve(val_y,y_pred) val_ks = abs(fpr_lr - tpr_lr).max() print('val_ks : ',val_ks)from matplotlib import pyplot as plt plt.plot(fpr_lr_train,tpr_lr_train,label = 'train LR') plt.plot(fpr_lr,tpr_lr,label = 'evl LR') plt.plot([0,1],[0,1],'k--') plt.xlabel('False positive rate') plt.ylabel('True positive rate') plt.title('ROC Curve') plt.legend(loc = 'best') plt.show() #train_ks : 0.4629947544110634 #val_ks : 0.39846160021324123總結(jié)
以上是生活随笔為你收集整理的金融风控实战——迁移学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lesson 16.4 卷积遇见深度学习
- 下一篇: 金融风控实战——有监督分箱