在傳統(tǒng)的二分類分類問題中,我們的目的是盡量減少誤分類,并用準(zhǔn)確率、F度量或AUC-ROC曲線等統(tǒng)計(jì)量來衡量模型的性能。然而在某些問題中,為了降低總代價(jià)最好容許更多的誤分類。如果誤分類產(chǎn)生的代價(jià)因樣本而異,我們應(yīng)該采取基于實(shí)例的代價(jià)敏感學(xué)習(xí)方法。
在本文中,我們將根據(jù)信用卡欺詐數(shù)據(jù)集對(duì)各種模型進(jìn)行訓(xùn)練和測(cè)試來解釋基于實(shí)例的代價(jià)敏感機(jī)器學(xué)習(xí)的概念。請(qǐng)注意,我們?yōu)榇巳蝿?wù)選擇的模型是為了解釋其概念,而不是獲得最佳預(yù)測(cè)結(jié)果。本文提供了代碼片段,完整的代碼可在GitHub上找到。
什么是代價(jià)敏感學(xué)習(xí)?
傳統(tǒng)分類模型假定所有的誤分類具有相同的代價(jià),而代價(jià)敏感模型認(rèn)為不同分類模型間和不同樣本間的代價(jià)都不同。
可以看看信用卡交易的案例。未經(jīng)持卡人授權(quán)的交易被視為欺詐性交易(通常在所有交易中占很小的一部分)。信用卡欺詐檢測(cè)系統(tǒng)應(yīng)自動(dòng)識(shí)別和阻止此類欺詐交易,與此同時(shí)不要阻止合法交易。
每種分類問題的相關(guān)代價(jià)是多少?讓我們假設(shè)以下場(chǎng)景:系統(tǒng)沒有識(shí)別到欺詐交易,錢款丟失,持卡人需要償還所有交易金額。如果系統(tǒng)檢測(cè)到欺詐交易,這筆交易就會(huì)被阻止。在這種情況下,因?yàn)樾枰?lián)系持卡人更換信用卡(若確實(shí)是欺詐交易)或者重新激活信用卡(若實(shí)際上是合法交易),所以會(huì)產(chǎn)生管理代價(jià)。還可以做個(gè)簡單假設(shè),即管理代價(jià)總是一致的。如果系統(tǒng)將一筆交易標(biāo)記為合法,系統(tǒng)會(huì)自動(dòng)批準(zhǔn)這筆交易,不會(huì)產(chǎn)生任何代價(jià)。下面是每一種預(yù)測(cè)方案的相關(guān)代價(jià):
請(qǐng)注意“正”表示被預(yù)測(cè)為欺詐的交易,“負(fù)”表示被預(yù)測(cè)為合法的交易。“真”和“假”分別代表預(yù)測(cè)正確與否。
因?yàn)榻灰状鷥r(jià)取決于樣本,預(yù)測(cè)錯(cuò)誤的合法交易代價(jià)非常低(比如每筆交易代價(jià)為0.1美元),而欺詐交易的管理代價(jià)會(huì)超過賠償代價(jià),甚至還要高(比如每筆交易代價(jià)為10000美元)
代價(jià)敏感學(xué)習(xí)的核心是將這些基于實(shí)例的代價(jià)考慮在內(nèi),再做出預(yù)測(cè),盡量降低總代價(jià)而不是降低誤分類。
代價(jià)敏感訓(xùn)練和基于代價(jià)分類
來考慮一下以下兩種方法。第一種是用損失函數(shù)訓(xùn)練模型,降低實(shí)際代價(jià)(以美元計(jì)算)而不是誤分類。在這種情況下,需要為損失函數(shù)提供四種情形下(假正類、假負(fù)類、真正類和真負(fù)類)的代價(jià)數(shù)據(jù),以便模型可以學(xué)會(huì)相應(yīng)地做出最佳預(yù)測(cè)。
第二種是訓(xùn)練一種常規(guī)模型,但是在根據(jù)最低的預(yù)期代價(jià)進(jìn)行預(yù)測(cè)時(shí),對(duì)每個(gè)樣本進(jìn)行分類。在這種情況下,訓(xùn)練集不需要付出代價(jià)。然而,這一方法只適用于預(yù)測(cè)概率的模型,這一模型常用于計(jì)算預(yù)期代價(jià)。
接下來參考兩種模型——運(yùn)用代價(jià)敏感損失函數(shù)的模型和預(yù)測(cè)時(shí)會(huì)降低預(yù)計(jì)代價(jià)的模型,即“代價(jià)敏感模型”和“代價(jià)分類模型”。
實(shí)現(xiàn)和評(píng)估模型
這個(gè)案例分析使用了一個(gè)信用卡欺詐數(shù)據(jù)集(這一數(shù)據(jù)集可以在Kaggle上找到),共有284000個(gè)樣本和30個(gè)特征。合法交易目標(biāo)變量為0,欺詐交易目標(biāo)變量為1。數(shù)據(jù)極不平衡,只有0.17%的欺詐交易。我們訓(xùn)練評(píng)估了下面五種模型。
1. 常規(guī)邏輯回歸模型(Scikit-learn)
2. 常規(guī)人工神經(jīng)網(wǎng)絡(luò)模型(Keras)
3. 代價(jià)敏感人工神經(jīng)網(wǎng)絡(luò)模型(Keras)
4. 代價(jià)分類邏輯回歸模型
5. 代價(jià)分類人工神經(jīng)網(wǎng)絡(luò)模型
在實(shí)踐中,人工神經(jīng)網(wǎng)絡(luò)模型可能不是欺詐檢測(cè)的首選。隨機(jī)森林和GBM這些基于決策樹的模型具有可解釋性的優(yōu)點(diǎn),常常表現(xiàn)得更好。之所以運(yùn)用人工神經(jīng)網(wǎng)絡(luò)模型解釋是因?yàn)樗鄬?duì)簡單地實(shí)現(xiàn)了一個(gè)代價(jià)敏感的損失函數(shù)。此外,如下所示,一個(gè)簡單的人工神經(jīng)網(wǎng)絡(luò)模型能產(chǎn)生相當(dāng)強(qiáng)大的結(jié)果。
為了評(píng)估結(jié)果,我們采用了兩種不同的統(tǒng)計(jì)量。第一種是傳統(tǒng)的F1-score,強(qiáng)調(diào)精確率和召回率,但并不考慮誤分類所產(chǎn)生的代價(jià)。
為了從代價(jià)的角度評(píng)估模型的性能,首先根據(jù)模型預(yù)測(cè)出的假正類、假負(fù)類、真正類和真負(fù)類這四種情況,以及與每種情況相關(guān)的代價(jià),計(jì)算預(yù)測(cè)產(chǎn)生的總代價(jià)。
然后,計(jì)算如果所有結(jié)果都為負(fù)類(即代價(jià)最大時(shí)),所產(chǎn)出的總代價(jià)是多少,并將成本節(jié)約定義為實(shí)際預(yù)測(cè)中降低代價(jià)的分?jǐn)?shù)。
為了評(píng)估模型,本文用了5倍交叉驗(yàn)證,并將數(shù)據(jù)分為5種不同的訓(xùn)練集(80%)和測(cè)試集(20%)。后續(xù)部分呈現(xiàn)出的結(jié)果是指五個(gè)測(cè)試集的平均結(jié)果。
邏輯回歸模型
基礎(chǔ)模型來自Sklearn庫中的常規(guī)邏輯回歸模型。下圖是預(yù)測(cè)概率和交易金額兩者的分布圖。如果沒有代價(jià)敏感分類,欺詐概率和交易金額之間就沒有明顯的關(guān)聯(lián)。
邏輯回歸模型下平均測(cè)試集表現(xiàn)相當(dāng)好,F(xiàn)1-score為0.73,成本節(jié)約為0.48。
人工神經(jīng)網(wǎng)絡(luò)模型
接下來,在Keras構(gòu)建一個(gè)具有三個(gè)完全連接層(50、25和15個(gè)神經(jīng)元)和兩個(gè)dropout層的人工神經(jīng)網(wǎng)絡(luò)模型。兩個(gè)時(shí)期的模型用了50個(gè)神經(jīng)元。使用Keras的順序模型API,其在Python中的實(shí)現(xiàn)如下所示:
from keras.modelsimport Sequential from keras.layers import Dense, Dropout defann(indput_dim, dropout=0.2): model = Sequential([ Dense(units=50, input_dim=indput_dim,activation='relu'), Dropout(dropout), Dense(units=25, activation='relu'), Dropout(dropout), Dense(15, activation='relu'), Dense(1, activation='sigmoid')]) return model clf =ann(indput_dim=X_train.shape[1], dropout=0.2) clf.compile(optimizer='adam', loss='binary_crossentropy') clf.fit(X_train, y_train, batch_size=50, epochs=2, verbose=1) clf.predict(X_test, verbose=1)
下面是人工神經(jīng)網(wǎng)絡(luò)模型下預(yù)測(cè)的欺詐概率分布圖。與邏輯回歸模型相似,欺詐概率與交易金額之間沒有明顯的關(guān)系。
在F1-score和成本節(jié)約方面,人工神經(jīng)網(wǎng)絡(luò)模型優(yōu)于邏輯回歸模型。
代價(jià)敏感人工神經(jīng)網(wǎng)絡(luò)模型
情況變得有趣起來了。代價(jià)敏感人工神經(jīng)網(wǎng)絡(luò)模型與常規(guī)人工神經(jīng)網(wǎng)絡(luò)模型相似,在代價(jià)敏感損失函數(shù)方面略有不同。之前的兩個(gè)模型都使用對(duì)數(shù)損失(“二元交叉熵”)作為損失函數(shù):
這個(gè)損失函數(shù)同樣懲罰假負(fù)類和假正類。現(xiàn)在讓我們來看看代價(jià)敏感損失函數(shù)。所有四種可能的結(jié)果(假正類、假負(fù)類、真正類和真負(fù)類)都納入了考慮范圍,每個(gè)結(jié)果都有一個(gè)特定的代價(jià)。代價(jià)敏感損失函數(shù)如下:
請(qǐng)記住,通過第一部分得知,真正類和假正類所產(chǎn)生的代價(jià)都很昂貴(阻止一筆交易所產(chǎn)生的固定管理代價(jià))。真負(fù)類沒有產(chǎn)生代價(jià)(無交易行為),假負(fù)類的代價(jià)是交易金額(假定我們必須償還所有金額)。請(qǐng)注意,這四種結(jié)果所產(chǎn)生的代價(jià),只有假負(fù)類的代價(jià)是基于實(shí)例的。這樣的話,交易金額越高,未識(shí)別出的欺詐交易的懲罰越高,正預(yù)測(cè)產(chǎn)生的管理代價(jià)也隨之增加。因此,損失函數(shù)應(yīng)該訓(xùn)練一種模型,提高其在交易金額偏高時(shí)阻攔可疑交易的可能性。交易金額從0美元到25691美元不等,平均為88美元,假設(shè)固定管理代價(jià)為3美元。
我們?cè)赑ython中分別預(yù)測(cè)了假正類、假負(fù)類、真正類和真負(fù)類的代價(jià)。由于假負(fù)類的代價(jià)取決于實(shí)際情況,因此它們用與樣本數(shù)相同的長度向量表示。
cost_FP = 3 cost_FN = data['Amount'] cost_TP = 3 cost_TN = 0
在Keras中實(shí)現(xiàn)一個(gè)基于實(shí)例的損失函數(shù)是很困難的,因?yàn)镵eras不允許將除了y_true和y_pred以外的參數(shù)傳遞給損失函數(shù)。通過將損失函數(shù)包裝到另一個(gè)函數(shù)中,可以將常變量傳遞給損失函數(shù)。然而,假負(fù)類的代價(jià)取決于實(shí)例。因此,本文使用的技巧是,將假負(fù)類的代價(jià)作為數(shù)字添加到y(tǒng)_true的逗號(hào)后,并在自定義損失函數(shù)中提取它們,同時(shí)將y_true四舍五入為原始整數(shù)值。在Keras中,轉(zhuǎn)換y_true的函數(shù)和自定義損失函數(shù)的實(shí)現(xiàn)如下所示:
importkeras.backend as K defcreate_y_input(y_train, c_FN): y_str =pd.Series(y_train).reset_index(drop=True). Apply(lambda x: str(int(x))) c_FN_str = pd.Series(c_FN).reset_index(drop=True). apply(lambda x:'0'*(5-len(str(int(x)))) + str(int(x)) return y_str + '.' + c_FN_str defcustom_loss(c_FP, c_TP, c_TN): def loss_function(y_input, y_pred): y_true = K.round(y_input) c_FN = (y_input - y_true) * 1e5 cost = y_true * K.log(y_pred) *c_FN + y_true * K.log(1 - y_pred)* c_TP) + (1 - y_true) * K.log(1 -y_pred) * c_FP + (1 - y_true) *K.log(y_pred) * c_TN) return - K.mean(cost, axis=-1) return loss_function
然后用定義函數(shù)來創(chuàng)建y_input向量,訓(xùn)練代價(jià)敏感的人工神經(jīng)網(wǎng)絡(luò)模型并進(jìn)行預(yù)測(cè):
y_input =create_y_input(y_train, cost_FN_train).apply(float) clf = ann(indput_dim=X_train.shape[1], dropout=0.2) clf.compile(optimizer='adam', loss=custom_loss(cost_FP, cost_TP, cost_TN)) clf.fit(X_train, y_input, batch_size=50, epochs=2, verbose=1) clf.predict(X_test, verbose=1)
通過下面的分布圖,可以看到代價(jià)敏感學(xué)習(xí)的效果。隨著交易金額的增加,預(yù)測(cè)結(jié)果總體向右擴(kuò)展(欺詐概率更高)。請(qǐng)注意,在這種情況下,由于問題的性質(zhì)和損失函數(shù)的定義,“預(yù)測(cè)欺詐概率”是指“我們要把這筆交易認(rèn)定為欺詐交易嗎?”而不是“這筆交易是欺詐交易嗎?”
評(píng)估結(jié)果顯示了代價(jià)敏感學(xué)習(xí)的預(yù)期效果。成本節(jié)約增加了5%,F(xiàn)1-score也降低了類似的幅度。代價(jià)敏感分類的結(jié)果是誤分類的數(shù)量越多,誤分類的總成本越低。
代價(jià)分類模型
與具有自定義損失函數(shù)的代價(jià)敏感模型不同,代價(jià)分類模型根據(jù)預(yù)測(cè)概率計(jì)算預(yù)期成本。預(yù)測(cè)合法和欺詐交易的預(yù)期代價(jià)計(jì)算如下:
然后分類器會(huì)選擇產(chǎn)生最低預(yù)期代價(jià)的預(yù)測(cè)結(jié)果。
因此,本文使用了常規(guī)邏輯回歸模型和人工神經(jīng)網(wǎng)絡(luò)模型來得到概率預(yù)測(cè)結(jié)果,并根據(jù)預(yù)期成本對(duì)預(yù)測(cè)進(jìn)行了重新分類。下圖顯示了邏輯回歸模型下代價(jià)相關(guān)分類的效果。預(yù)測(cè)概率的分布沒有因?yàn)槌R?guī)邏輯回歸模型的分布而改變。然而,對(duì)于代價(jià)相關(guān)的分類,隨著交易金額的增加,該模型傾向于將欺詐概率較小的交易識(shí)別為欺詐性交易。在圖的右側(cè),我們看到,即使欺詐概率接近1,金額非常小的交易也會(huì)被預(yù)測(cè)為合法交易。因?yàn)楦鶕?jù)假定,真正類產(chǎn)生的管理代價(jià)為3美元。
根據(jù)預(yù)期成本對(duì)預(yù)測(cè)進(jìn)行分類,可在成本節(jié)約方面獲得更好的結(jié)果(而根據(jù)F1-score進(jìn)行分類,結(jié)果明顯較差)。在人工神經(jīng)網(wǎng)絡(luò)模型下實(shí)現(xiàn)代價(jià)敏感損失函數(shù)的同時(shí),代價(jià)分類人工神經(jīng)網(wǎng)絡(luò)模型能夠?qū)⒊杀窘档?0%。
結(jié)論
本文闡述了兩種基于信用卡欺詐預(yù)測(cè)的代價(jià)敏感分類的基本方法。
代價(jià)敏感訓(xùn)練模型需要自定義損失函數(shù),而代價(jià)分類模型只需要每一類的概率和每一結(jié)果產(chǎn)生的代價(jià)來對(duì)交易進(jìn)行分類。在樣例中,代價(jià)分類模型以大量誤分類為代價(jià),實(shí)現(xiàn)了較好的成本節(jié)約。此外,代價(jià)分類模型更容易實(shí)現(xiàn),因?yàn)樗恍枰?xùn)練自定義損失函數(shù)。但是代價(jià)分類方法只適用于預(yù)測(cè)概率的模型,正好邏輯回歸模型和人工神經(jīng)網(wǎng)絡(luò)模型很適合預(yù)測(cè)概率。然而,欺詐檢測(cè)中廣泛采用基于決策樹的模型,通常將預(yù)測(cè)結(jié)果直接分為不同類,使得代價(jià)分類方法行不通。基于決策樹模型的代價(jià)敏感方法在概念上與本文中介紹的方法相似,其實(shí)現(xiàn)更為復(fù)雜。
留言 點(diǎn)贊 關(guān)注
我們一起分享AI學(xué)習(xí)與發(fā)展的干貨
歡迎關(guān)注全平臺(tái)AI垂類自媒體 “讀芯術(shù)”