案例詳解:欺詐檢測中的代價敏感算法

全文共3560字,預計學習時長20分鐘或更長

案例詳解:欺詐檢測中的代價敏感算法


在傳統的二分類分類問題中,我們的目的是儘量減少誤分類,並用準確率、F度量或AUC-ROC曲線等統計量來衡量模型的性能。然而在某些問題中,為了降低總代價最好容許更多的誤分類。如果誤分類產生的代價因樣本而異,我們應該採取基於實例的代價敏感學習方法。

在本文中,我們將根據信用卡欺詐數據集對各種模型進行訓練和測試來解釋基於實例的代價敏感機器學習的概念。請注意,我們為此任務選擇的模型是為了解釋其概念,而不是獲得最佳預測結果。本文提供了代碼片段,完整的代碼可在GitHub上找到。

案例詳解:欺詐檢測中的代價敏感算法

什麼是代價敏感學習?

傳統分類模型假定所有的誤分類具有相同的代價,而代價敏感模型認為不同分類模型間和不同樣本間的代價都不同。

可以看看信用卡交易的案例。未經持卡人授權的交易被視為欺詐性交易(通常在所有交易中佔很小的一部分)。信用卡欺詐檢測系統應自動識別和阻止此類欺詐交易,與此同時不要阻止合法交易。

每種分類問題的相關代價是多少?讓我們假設以下場景:系統沒有識別到欺詐交易,錢款丟失,持卡人需要償還所有交易金額。如果系統檢測到欺詐交易,這筆交易就會被阻止。在這種情況下,因為需要聯繫持卡人更換信用卡(若確實是欺詐交易)或者重新激活信用卡(若實際上是合法交易),所以會產生管理代價。還可以做個簡單假設,即管理代價總是一致的。如果系統將一筆交易標記為合法,系統會自動批准這筆交易,不會產生任何代價。下面是每一種預測方案的相關代價:


案例詳解:欺詐檢測中的代價敏感算法


請注意“正”表示被預測為欺詐的交易,“負”表示被預測為合法的交易。“真”和“假”分別代表預測正確與否。

因為交易代價取決於樣本,預測錯誤的合法交易代價非常低(比如每筆交易代價為0.1美元),而欺詐交易的管理代價會超過賠償代價,甚至還要高(比如每筆交易代價為10000美元)

代價敏感學習的核心是將這些基於實例的代價考慮在內,再做出預測,儘量降低總代價而不是降低誤分類。

案例詳解:欺詐檢測中的代價敏感算法

代價敏感訓練和基於代價分類


來考慮一下以下兩種方法。第一種是用損失函數訓練模型,降低實際代價(以美元計算)而不是誤分類。在這種情況下,需要為損失函數提供四種情形下(假正類、假負類、真正類和真負類)的代價數據,以便模型可以學會相應地做出最佳預測。


案例詳解:欺詐檢測中的代價敏感算法


第二種是訓練一種常規模型,但是在根據最低的預期代價進行預測時,對每個樣本進行分類。在這種情況下,訓練集不需要付出代價。然而,這一方法只適用於預測概率的模型,這一模型常用於計算預期代價。


案例詳解:欺詐檢測中的代價敏感算法


接下來參考兩種模型——運用代價敏感損失函數的模型和預測時會降低預計代價的模型,即“代價敏感模型”和“代價分類模型”。

案例詳解:欺詐檢測中的代價敏感算法

實現和評估模型


這個案例分析使用了一個信用卡欺詐數據集(這一數據集可以在Kaggle上找到),共有284000個樣本和30個特徵。合法交易目標變量為0,欺詐交易目標變量為1。數據極不平衡,只有0.17%的欺詐交易。我們訓練評估了下面五種模型。

1. 常規邏輯迴歸模型(Scikit-learn)

2. 常規人工神經網絡模型(Keras)

3. 代價敏感人工神經網絡模型(Keras)

4. 代價分類邏輯迴歸模型

5. 代價分類人工神經網絡模型

在實踐中,人工神經網絡模型可能不是欺詐檢測的首選。隨機森林和GBM這些基於決策樹的模型具有可解釋性的優點,常常表現得更好。之所以運用人工神經網絡模型解釋是因為它相對簡單地實現了一個代價敏感的損失函數。此外,如下所示,一個簡單的人工神經網絡模型能產生相當強大的結果。

為了評估結果,我們採用了兩種不同的統計量。第一種是傳統的F1-score,強調精確率和召回率,但並不考慮誤分類所產生的代價。


案例詳解:欺詐檢測中的代價敏感算法


為了從代價的角度評估模型的性能,首先根據模型預測出的假正類、假負類、真正類和真負類這四種情況,以及與每種情況相關的代價,計算預測產生的總代價。


案例詳解:欺詐檢測中的代價敏感算法


然後,計算如果所有結果都為負類(即代價最大時),所產出的總代價是多少,並將成本節約定義為實際預測中降低代價的分數。


案例詳解:欺詐檢測中的代價敏感算法


為了評估模型,本文用了5倍交叉驗證,並將數據分為5種不同的訓練集(80%)和測試集(20%)。後續部分呈現出的結果是指五個測試集的平均結果。

邏輯迴歸模型

基礎模型來自Sklearn庫中的常規邏輯迴歸模型。下圖是預測概率和交易金額兩者的分佈圖。如果沒有代價敏感分類,欺詐概率和交易金額之間就沒有明顯的關聯。


案例詳解:欺詐檢測中的代價敏感算法


邏輯迴歸模型下平均測試集表現相當好,F1-score為0.73,成本節約為0.48。


案例詳解:欺詐檢測中的代價敏感算法


案例詳解:欺詐檢測中的代價敏感算法



人工神經網絡模型

接下來,在Keras構建一個具有三個完全連接層(50、25和15個神經元)和兩個dropout層的人工神經網絡模型。兩個時期的模型用了50個神經元。使用Keras的順序模型API,其在python中的實現如下所示:

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)


下面是人工神經網絡模型下預測的欺詐概率分佈圖。與邏輯迴歸模型相似,欺詐概率與交易金額之間沒有明顯的關係。


案例詳解:欺詐檢測中的代價敏感算法



在F1-score和成本節約方面,人工神經網絡模型優於邏輯迴歸模型。

案例詳解:欺詐檢測中的代價敏感算法



案例詳解:欺詐檢測中的代價敏感算法



代價敏感人工神經網絡模型

情況變得有趣起來了。代價敏感人工神經網絡模型與常規人工神經網絡模型相似,在代價敏感損失函數方面略有不同。之前的兩個模型都使用對數損失(“二元交叉熵”)作為損失函數:


案例詳解:欺詐檢測中的代價敏感算法



這個損失函數同樣懲罰假負類和假正類。現在讓我們來看看代價敏感損失函數。所有四種可能的結果(假正類、假負類、真正類和真負類)都納入了考慮範圍,每個結果都有一個特定的代價。代價敏感損失函數如下:


案例詳解:欺詐檢測中的代價敏感算法



請記住,通過第一部分得知,真正類和假正類所產生的代價都很昂貴(阻止一筆交易所產生的固定管理代價)。真負類沒有產生代價(無交易行為),假負類的代價是交易金額(假定我們必須償還所有金額)。請注意,這四種結果所產生的代價,只有假負類的代價是基於實例的。這樣的話,交易金額越高,未識別出的欺詐交易的懲罰越高,正預測產生的管理代價也隨之增加。因此,損失函數應該訓練一種模型,提高其在交易金額偏高時阻攔可疑交易的可能性。交易金額從0美元到25691美元不等,平均為88美元,假設固定管理代價為3美元。

我們在Python中分別預測了假正類、假負類、真正類和真負類的代價。由於假負類的代價取決於實際情況,因此它們用與樣本數相同的長度向量表示。

cost_FP = 3
cost_FN = data['Amount']
cost_TP = 3
cost_TN = 0


在Keras中實現一個基於實例的損失函數是很困難的,因為Keras不允許將除了y_true和y_pred以外的參數傳遞給損失函數。通過將損失函數包裝到另一個函數中,可以將常變量傳遞給損失函數。然而,假負類的代價取決於實例。因此,本文使用的技巧是,將假負類的代價作為數字添加到y_true的逗號後,並在自定義損失函數中提取它們,同時將y_true四捨五入為原始整數值。在Keras中,轉換y_true的函數和自定義損失函數的實現如下所示:

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


然後用定義函數來創建y_input向量,訓練代價敏感的人工神經網絡模型並進行預測:

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)


通過下面的分佈圖,可以看到代價敏感學習的效果。隨著交易金額的增加,預測結果總體向右擴展(欺詐概率更高)。請注意,在這種情況下,由於問題的性質和損失函數的定義,“預測欺詐概率”是指“我們要把這筆交易認定為欺詐交易嗎?”而不是“這筆交易是欺詐交易嗎?”


案例詳解:欺詐檢測中的代價敏感算法



評估結果顯示了代價敏感學習的預期效果。成本節約增加了5%,F1-score也降低了類似的幅度。代價敏感分類的結果是誤分類的數量越多,誤分類的總成本越低。


案例詳解:欺詐檢測中的代價敏感算法




案例詳解:欺詐檢測中的代價敏感算法



代價分類模型

與具有自定義損失函數的代價敏感模型不同,代價分類模型根據預測概率計算預期成本。預測合法和欺詐交易的預期代價計算如下:


案例詳解:欺詐檢測中的代價敏感算法



然後分類器會選擇產生最低預期代價的預測結果。

因此,本文使用了常規邏輯迴歸模型和人工神經網絡模型來得到概率預測結果,並根據預期成本對預測進行了重新分類。下圖顯示了邏輯迴歸模型下代價相關分類的效果。預測概率的分佈沒有因為常規邏輯迴歸模型的分佈而改變。然而,對於代價相關的分類,隨著交易金額的增加,該模型傾向於將欺詐概率較小的交易識別為欺詐性交易。在圖的右側,我們看到,即使欺詐概率接近1,金額非常小的交易也會被預測為合法交易。因為根據假定,真正類產生的管理代價為3美元。


案例詳解:欺詐檢測中的代價敏感算法



根據預期成本對預測進行分類,可在成本節約方面獲得更好的結果(而根據F1-score進行分類,結果明顯較差)。在人工神經網絡模型下實現代價敏感損失函數的同時,代價分類人工神經網絡模型能夠將成本降低10%。


案例詳解:欺詐檢測中的代價敏感算法


案例詳解:欺詐檢測中的代價敏感算法



案例詳解:欺詐檢測中的代價敏感算法


結論


本文闡述了兩種基於信用卡欺詐預測的代價敏感分類的基本方法。

代價敏感訓練模型需要自定義損失函數,而代價分類模型只需要每一類的概率和每一結果產生的代價來對交易進行分類。在樣例中,代價分類模型以大量誤分類為代價,實現了較好的成本節約。此外,代價分類模型更容易實現,因為它不需要訓練自定義損失函數。但是代價分類方法只適用於預測概率的模型,正好邏輯迴歸模型和人工神經網絡模型很適合預測概率。然而,欺詐檢測中廣泛採用基於決策樹的模型,通常將預測結果直接分為不同類,使得代價分類方法行不通。基於決策樹模型的代價敏感方法在概念上與本文中介紹的方法相似,其實現更為複雜。

案例詳解:欺詐檢測中的代價敏感算法

留言 點贊 關注

我們一起分享AI學習與發展的乾貨

歡迎關注全平臺AI垂類自媒體 “讀芯術”

相關推薦

推薦中...