譯者 | 朱先忠
審校 | 重樓
“生成對(duì)抗性網(wǎng)絡(luò)”(GANs)在生成與過(guò)去的真實(shí)數(shù)據(jù)無(wú)法區(qū)分的真實(shí)合成數(shù)據(jù)方面表現(xiàn)出了卓越的性能。不幸的是,GANs因?yàn)槠淙狈β殬I(yè)道德的的應(yīng)用程序deepfakes而引起了公眾的注意。
本文實(shí)例將使用GANs作為數(shù)據(jù)增強(qiáng)工具,試圖解決與不平衡數(shù)據(jù)集相關(guān)的欺詐檢測(cè)這一經(jīng)典問(wèn)題。更具體地說(shuō),GANs可以生成少數(shù)欺詐類(lèi)的真實(shí)合成數(shù)據(jù),并將不平衡的數(shù)據(jù)集完美平衡地轉(zhuǎn)換。
簡(jiǎn)介
原則上,欺詐檢測(cè)是二元分類(lèi)算法的一種應(yīng)用:對(duì)每筆交易進(jìn)行分類(lèi),無(wú)論是否是欺詐類(lèi)型的交易。其實(shí),欺詐類(lèi)型的交易往往只占交易領(lǐng)域的一小部分。一般來(lái)說(shuō),欺詐交易屬于少數(shù)類(lèi)別;因此,數(shù)據(jù)集高度不平衡。欺詐交易越少,交易系統(tǒng)就越健全。這一點(diǎn)是非常簡(jiǎn)單和直觀的。
一個(gè)矛盾的問(wèn)題是這種健全的條件很可能是過(guò)去欺詐偵查極具挑戰(zhàn)性的主要原因之一。這僅僅是因?yàn)榉诸?lèi)算法很難學(xué)習(xí)少數(shù)類(lèi)別欺詐的概率分布。
一般來(lái)說(shuō),數(shù)據(jù)集越平衡,分類(lèi)預(yù)測(cè)器的性能就越好。換句話(huà)說(shuō),數(shù)據(jù)集越不平衡(或越不平衡),分類(lèi)器的性能就越差。
這描繪了欺詐檢測(cè)的經(jīng)典問(wèn)題:具有高度不平衡數(shù)據(jù)集的二分類(lèi)應(yīng)用程序。
在這種情況下,我們可以使用生成對(duì)抗性網(wǎng)絡(luò)(GANs)作為數(shù)據(jù)增強(qiáng)工具來(lái)生成少數(shù)欺詐類(lèi)別的真實(shí)合成數(shù)據(jù),以便更為平衡地轉(zhuǎn)換整個(gè)數(shù)據(jù)集,從而提高欺詐檢測(cè)分類(lèi)器模型的性能。
本文將分為以下幾個(gè)部分展開(kāi)探討:
- 第1節(jié):算法概述(GANs的雙層優(yōu)化體系結(jié)構(gòu))
- 第2節(jié):欺詐數(shù)據(jù)集
- 第3節(jié):用于數(shù)據(jù)增強(qiáng)的GANs的Python代碼解析
- 第4節(jié):欺詐檢測(cè)概述(基準(zhǔn)場(chǎng)景與GANs場(chǎng)景)
- 第5節(jié):結(jié)論
總的來(lái)說(shuō),我將主要介紹GANs的相關(guān)主題(包括算法和代碼)。對(duì)于GANs之外的模型開(kāi)發(fā)的其他方面的內(nèi)容,如數(shù)據(jù)預(yù)處理和分類(lèi)器算法,我將只概述其過(guò)程,而不討論其細(xì)節(jié)。在這種情況下,本文假設(shè)讀者對(duì)二進(jìn)制分類(lèi)器算法(特別是我為欺詐檢測(cè)選擇的集成分類(lèi)器)有基本的了解,并對(duì)數(shù)據(jù)清理和預(yù)處理也有大致的了解。
有關(guān)詳細(xì)代碼,歡迎讀者訪(fǎng)問(wèn)以下鏈接:
第1節(jié):算法概述(GANs的雙層優(yōu)化體系架構(gòu))
GANs是一種特殊類(lèi)型的生成算法,由兩個(gè)神經(jīng)網(wǎng)絡(luò)組成:生成網(wǎng)絡(luò)(生成器)和對(duì)抗性網(wǎng)絡(luò)(鑒別器)。其中,生成器試圖生成真實(shí)的合成數(shù)據(jù),鑒別器將合成數(shù)據(jù)與真實(shí)數(shù)據(jù)區(qū)分開(kāi)來(lái)。
最初的GANs是在一篇標(biāo)題為《生成對(duì)抗性網(wǎng)絡(luò)》的開(kāi)創(chuàng)性的論文(Goodfellow等人共同發(fā)表,Generative Adversarial Nets,2014年出版,原文地址:https://arxiv.org/abs/1406.2661)中引入的。最初的GANs的合著者用造假者-警察的類(lèi)比來(lái)描述GANs:一款迭代游戲,生成器充當(dāng)造假者,鑒別器扮演警察的角色來(lái)檢測(cè)生成器偽造的贗品。
最初的GANs在某種意義上是具有創(chuàng)新性的,它解決并克服了過(guò)去訓(xùn)練深度生成算法的傳統(tǒng)困難。作為其核心,它被設(shè)計(jì)為具有均衡尋求目標(biāo)設(shè)置(相對(duì)于最大似然導(dǎo)向目標(biāo)設(shè)置)的雙層優(yōu)化架構(gòu)。
從那以后,人們對(duì)GANs的許多變體架構(gòu)進(jìn)行了探索。本文將僅參考原始GANs的原型架構(gòu)。
生成器和鑒別器
再?gòu)?qiáng)調(diào)一下,在GANs的架構(gòu)中,兩個(gè)神經(jīng)網(wǎng)絡(luò)——生成器和鑒別器——相互競(jìng)爭(zhēng)。在這種情況下,競(jìng)爭(zhēng)是通過(guò)前向傳播和后向傳播的迭代進(jìn)行的(根據(jù)神經(jīng)網(wǎng)絡(luò)的一般框架原理)。
一方面,鑒別器是一個(gè)設(shè)計(jì)上的二元分類(lèi)器:它對(duì)每個(gè)樣本是真實(shí)的(標(biāo)簽:1)還是假的/合成的(標(biāo)簽為0)進(jìn)行分類(lèi)。在前向傳播期間向鑒別器饋送真實(shí)樣本和合成樣本;在反向傳播過(guò)程中,它學(xué)習(xí)從混合數(shù)據(jù)饋送中檢測(cè)合成數(shù)據(jù)。
另一方面,生成器被設(shè)計(jì)為一個(gè)噪聲分布。在正向傳播期間向生成器提供真實(shí)樣本。然后,在反向傳播過(guò)程中,生成器學(xué)習(xí)真實(shí)數(shù)據(jù)的概率分布,以便更好地模擬其合成樣本。
然后,通過(guò)“雙層優(yōu)化”框架對(duì)這兩個(gè)代理進(jìn)行交替訓(xùn)練。
雙層訓(xùn)練機(jī)制(雙層優(yōu)化方法)
在最初的GAN論文中,為了訓(xùn)練這兩個(gè)追求完全相反目標(biāo)的代理,合著者設(shè)計(jì)了一個(gè)“雙層優(yōu)化(訓(xùn)練)”架構(gòu),其中一個(gè)內(nèi)部訓(xùn)練塊(鑒別器的訓(xùn)練)嵌套在另一個(gè)高級(jí)訓(xùn)練塊(生成器的訓(xùn)練)中。
下圖說(shuō)明了嵌套訓(xùn)練循環(huán)中的“雙層優(yōu)化”結(jié)構(gòu)。鑒別器在嵌套的內(nèi)部循環(huán)中訓(xùn)練,而生成器在更高級(jí)別的主循環(huán)中訓(xùn)練。
GANs在這種雙層訓(xùn)練架構(gòu)中交替訓(xùn)練這兩個(gè)代理(Goodfellow等人2014年合著論文《生成對(duì)抗性神經(jīng)網(wǎng)絡(luò)(Generative Adversarial Nets)》的第3頁(yè))。換言之,在交替過(guò)程中訓(xùn)練一個(gè)代理時(shí),我們需要凍結(jié)另一個(gè)代理的學(xué)習(xí)過(guò)程(Goodfellow I.于2015年發(fā)表論文第3頁(yè)的結(jié)論)。
Mini-Max優(yōu)化目標(biāo)
除了能夠交替訓(xùn)練這兩個(gè)代理的“雙層優(yōu)化”機(jī)制之外,GANs與傳統(tǒng)神經(jīng)網(wǎng)絡(luò)原型的另一個(gè)獨(dú)特之處是其最小-最大優(yōu)化目標(biāo)。簡(jiǎn)單地說(shuō),與傳統(tǒng)的最大搜索方法(如最大似然)相比,GANs追求均衡搜索優(yōu)化目標(biāo)。
那么,什么是追求平衡的優(yōu)化目標(biāo)呢?
讓我們把這個(gè)問(wèn)題分解開(kāi)來(lái)作解釋。
GANs的兩個(gè)代理有兩個(gè)截然相反的目標(biāo)。雖然鑒別器作為一種二元分類(lèi)器,旨在最大限度地提高對(duì)真實(shí)樣本和合成樣本的混合物進(jìn)行正確分類(lèi)的概率,但生成器的目標(biāo)是最大限度地降低鑒別器正確分類(lèi)合成數(shù)據(jù)的概率:因?yàn)樯善餍枰垓_鑒別器。
在這種情況下,最初GANs的合著者將總體目標(biāo)稱(chēng)為“最小最大游戲”。(Goodfellow等人2014年合著論文的第3頁(yè))
總體而言,GANs的最終最小-最大優(yōu)化目標(biāo)不是搜索這些目標(biāo)函數(shù)中的任何一個(gè)的全局最大值/最小值。相反,它被設(shè)置為尋求一個(gè)平衡點(diǎn),該平衡點(diǎn)可以被解釋為:
- “鞍點(diǎn)是分類(lèi)器的局部最大值和生成器的局部最小值”(Goodfellow I.,2015,第2頁(yè))。
- 其中的兩個(gè)代理都不能再提高它們的性能。
- 其中的生成器學(xué)會(huì)創(chuàng)建的合成數(shù)據(jù)已經(jīng)變得足夠現(xiàn)實(shí),足以欺騙鑒別器。
平衡點(diǎn)在概念上可以用隨機(jī)猜測(cè)的概率0.5(50%)來(lái)表示,對(duì)于鑒別器:D(z)=>0.5。
讓我們根據(jù)GANs的目標(biāo)函數(shù)來(lái)轉(zhuǎn)錄GANs的極大極小優(yōu)化的概念框架。
鑒別器的目標(biāo)是使下圖中的目標(biāo)函數(shù)最大化:
為了解決潛在的飽和問(wèn)題,他們將生成器的原始對(duì)數(shù)似然目標(biāo)函數(shù)的第二項(xiàng)轉(zhuǎn)換如下,并建議將轉(zhuǎn)換后的版本最大化為生成器的目標(biāo):
總體而言,GANs的“雙層優(yōu)化”架構(gòu)可以轉(zhuǎn)化為以下算法:
有關(guān)GANs算法設(shè)計(jì)的更多細(xì)節(jié),請(qǐng)閱讀我的另一篇文章:《生成對(duì)抗性網(wǎng)絡(luò)的Mini-Max優(yōu)化設(shè)計(jì)(Mini-Max Optimization Design of Generative Adversarial Nets):https://towardsdatascience.com/mini-max-optimization-design-of-generative-adversarial-networks-gan-dc1b9ea44a02》。
現(xiàn)在,讓我們開(kāi)始使用數(shù)據(jù)集進(jìn)行實(shí)際的編程分析。
為了強(qiáng)調(diào)GANs算法,我將在本文主要關(guān)注GANs的實(shí)現(xiàn)代碼,只概述一下其余的過(guò)程。
第2節(jié):欺詐數(shù)據(jù)集
為了進(jìn)行欺詐檢測(cè),我從Kaggle網(wǎng)站選擇了以下信用卡交易數(shù)據(jù)集:https://www.kaggle.com/datasets/mlg-ulb/creditcardfraud
數(shù)據(jù)許可證:Database Contents License(DbCL)v1.0。
以下是該數(shù)據(jù)集的簡(jiǎn)要說(shuō)明。
該數(shù)據(jù)集包含284807筆交易。在數(shù)據(jù)集中,我們只有492起欺詐交易(包括29起重復(fù)案件)。
由于欺詐類(lèi)僅占所有交易的0.172%,因此這一部分?jǐn)?shù)據(jù)形成了一個(gè)占極少數(shù)的類(lèi)別。該數(shù)據(jù)集適用于說(shuō)明與不平衡數(shù)據(jù)集相關(guān)的欺詐檢測(cè)的經(jīng)典問(wèn)題。
該數(shù)據(jù)集具有以下30個(gè)特征:
- V1,V2,…V28:這28個(gè)主要成分通過(guò)PCA獲得。出于保護(hù)隱私的目的,未披露數(shù)據(jù)來(lái)源。
- “Time”:每個(gè)事務(wù)與數(shù)據(jù)集的第一個(gè)事務(wù)之間經(jīng)過(guò)的秒數(shù)。
- “Amount”:交易的金額。
- “Class”:標(biāo)簽設(shè)置為“Class”。欺詐情況下為1;否則,為0。
數(shù)據(jù)預(yù)處理:特征選擇
由于數(shù)據(jù)集已經(jīng)被清理得很干凈,如果不是很完美的話(huà),我只需要做幾件事來(lái)清理數(shù)據(jù):消除重復(fù)數(shù)據(jù)和去除異常值。
此后,在數(shù)據(jù)集中給定30個(gè)特征的情況下,我決定運(yùn)行特征選擇,通過(guò)在訓(xùn)練過(guò)程之前消除不太重要的特征來(lái)減少特征的數(shù)量。我選擇了scikit-learn開(kāi)源庫(kù)中的隨機(jī)森林分類(lèi)器中內(nèi)置的特征重要性分?jǐn)?shù)來(lái)估計(jì)所有30個(gè)特征的分?jǐn)?shù)。
下圖顯示了實(shí)驗(yàn)結(jié)果的摘要信息。如果您對(duì)其詳細(xì)的流程感興趣的話(huà),請(qǐng)參閱我上面列出地址處的代碼。
根據(jù)上面條形圖中顯示的結(jié)果,我做出了主觀判斷,選擇了前6個(gè)特征進(jìn)行分析,并從模型構(gòu)建過(guò)程中刪除了所有剩余的不重要特征。
以下是選定的前6個(gè)重要特征。
為了今后的模型構(gòu)建目的,我重點(diǎn)介紹了這6個(gè)選定的特征。在數(shù)據(jù)預(yù)處理之后,我們得到了如下形狀的工作數(shù)據(jù)幀df:
- df.shape=(282513,7)現(xiàn)在,我們希望特征選擇能降低最終模型的復(fù)雜性并穩(wěn)定其性能,同時(shí)保留優(yōu)化二元分類(lèi)器的關(guān)鍵信息。
第3節(jié):用于數(shù)據(jù)增強(qiáng)的GANs的Python代碼解析
現(xiàn)在是我們使用GANs進(jìn)行數(shù)據(jù)增強(qiáng)的時(shí)候了。
那么,我們需要?jiǎng)?chuàng)建多少合成數(shù)據(jù)呢?
首先,我們對(duì)數(shù)據(jù)增強(qiáng)的興趣僅限于模型訓(xùn)練。由于測(cè)試數(shù)據(jù)集中沒(méi)有提供樣本數(shù)據(jù);所以,我們希望保留測(cè)試數(shù)據(jù)集的原始形式。其次,因?yàn)槲覀兊?/span>目的是完美地轉(zhuǎn)換不平衡的數(shù)據(jù)集;所以,我們不想增加占大多數(shù)的非欺詐性質(zhì)的案例。
簡(jiǎn)言之,我們只想增加少數(shù)欺詐類(lèi)型的訓(xùn)練數(shù)據(jù)集,而不想增加其他數(shù)據(jù)集。
現(xiàn)在,讓我們使用分層數(shù)據(jù)拆分方法,將工作數(shù)據(jù)幀按80/20的比例拆分為訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集。
#分離特征和目標(biāo)變量
X = df.drop('Class', axis=1)
y = df['Class']
#將數(shù)據(jù)拆分為訓(xùn)練集和測(cè)試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
#組合訓(xùn)練數(shù)據(jù)集的特征和標(biāo)簽
train_df = pd.concat([X_train, y_train], axis=1)
因此,訓(xùn)練數(shù)據(jù)集的形狀如下:
- train_df.shape=(226010,7)
讓我們看看訓(xùn)練數(shù)據(jù)集的組成(欺詐案例和非欺詐案例)。
# 加載數(shù)據(jù)集(欺詐和非欺詐數(shù)據(jù))
fraud_data = train_df[train_df['Class'] == 1].drop('Class', axis=1).values
non_fraud_data = train_df[train_df['Class'] == 0].drop('Class', axis=1).values
# 計(jì)算要生成的合成欺詐樣本的數(shù)量
num_real_fraud = len(fraud_data)
num_synthetic_samples = len(non_fraud_data) - num_real_fraud
print("# of non-fraud: ", len(non_fraud_data))
print("# of Real Fraud:", num_real_fraud)
print("# of Synthetic Fraud required:", num_synthetic_samples)
# of non-fraud: 225632
# of Real Fraud: 378
# of Synthetic Fraud required: 225254
上面的輸出告訴我們,訓(xùn)練數(shù)據(jù)集(226010)由225632個(gè)非欺詐數(shù)據(jù)和378個(gè)欺詐數(shù)據(jù)組成。換句話(huà)說(shuō),它們之間的差值是225254。這個(gè)數(shù)字是我們需要增加的合成欺詐數(shù)據(jù)(num_synthetic_samples)的數(shù)量,以便與訓(xùn)練數(shù)據(jù)集中這兩個(gè)類(lèi)別的數(shù)量完全匹配。注意,我們確實(shí)保留了原始測(cè)試數(shù)據(jù)集。
接下來(lái),讓我們對(duì)GANs進(jìn)行編碼。
首先,讓我們創(chuàng)建幾個(gè)自定義函數(shù)來(lái)確定兩個(gè)代理:鑒別器和生成器。
對(duì)于生成器,我創(chuàng)建了一個(gè)噪聲分布函數(shù)build_generator(),它需要兩個(gè)參數(shù):
latent_dim(噪聲的維度)作為其輸入的形狀,以及其輸出的形狀output_dim——對(duì)應(yīng)于特征的數(shù)量。
#定義生成器網(wǎng)絡(luò)
def build_generator(latent_dim, output_dim):
model = Sequential()
model.add(Dense(64, input_shape=(latent_dim,)))
model.add(Dense(128, activation='sigmoid'))
model.add(Dense(output_dim, activation='sigmoid'))
return model
對(duì)于鑒別器,我創(chuàng)建了一個(gè)自定義函數(shù)build_descriminator(),它接受一個(gè)input_dim參數(shù),對(duì)應(yīng)于特性的數(shù)量。
#定義鑒別器網(wǎng)絡(luò)
def build_discriminator(input_dim):
model = Sequential()
model.add(Input(input_dim))
model.add(Dense(128, activation='sigmoid'))
model.add(Dense(1, activation='sigmoid'))
return model
然后,我們可以調(diào)用這些函數(shù)來(lái)創(chuàng)建生成器和鑒別器。在這里,對(duì)于生成器,我隨便將latent_dim設(shè)置為32:如果您愿意,當(dāng)然也可以使用其它的值。
#生成器輸入噪聲的尺寸
latent_dim = 32
#構(gòu)造生成器和鑒別器模型
generator = build_generator(latent_dim, fraud_data.shape[1])
discriminator = build_discriminator(fraud_data.shape[1])
在這個(gè)階段,我們需要編譯鑒別器,它稍后將嵌套在主(更高)優(yōu)化循環(huán)中。我們可以使用以下參數(shù)設(shè)置來(lái)編譯鑒別器。
- 鑒別器的損失函數(shù):二值分類(lèi)器的通用交叉熵?fù)p失函數(shù)。
- 評(píng)價(jià)指標(biāo):準(zhǔn)確度和召回率。
# 編譯鑒別器模型
from keras.metrics import Precision, Recall
discriminator.compile(optimizer=Adam(learning_rate=0.0002, beta_1=0.5), loss='binary_crossentropy', metrics=[Precision(), Recall()])
對(duì)于生成器,我們將在構(gòu)建主(上)優(yōu)化循環(huán)時(shí)對(duì)其進(jìn)行編譯。
在這個(gè)階段,我們可以定義生成器的自定義目標(biāo)函數(shù),如下所示。請(qǐng)記住,推薦的目標(biāo)是最大化以下公式:
注意,上面返回值前面的負(fù)號(hào)是必需的,因?yàn)槟J(rèn)情況下?lián)p失函數(shù)被設(shè)計(jì)為最小化。
然后,我們便可以構(gòu)建雙層優(yōu)化架構(gòu)的主(上)循環(huán)build_GANs(generator, discriminator)。在這個(gè)主循環(huán)中,我們隱式編譯生成器。在這種情況下,當(dāng)我們編譯主循環(huán)時(shí),我們需要使用生成器的自定義目標(biāo)函數(shù)generator_loss_log_d。
如上所述,當(dāng)我們訓(xùn)練生成器時(shí),我們需要凍結(jié)鑒別器。
#結(jié)合生成器和鑒別器,構(gòu)建并編譯GANs主優(yōu)化循環(huán)
def build_gan(generator, discriminator):
discriminator.trainable = False
model = Sequential()
model.add(generator)
model.add(discriminator)
model.compile(optimizer=Adam(learning_rate=0.0002, beta_1=0.5), loss=generator_loss_log_d)
return model
# 調(diào)用主循環(huán)函數(shù)
gan = build_gan(generator, discriminator)
在上面的最后一行,GANs調(diào)用build_gan()函數(shù),以便使用Keras框架中的model.train_on_batch()方法實(shí)現(xiàn)下面的批處理訓(xùn)練。
注意,當(dāng)我們訓(xùn)練鑒別器時(shí),我們需要凍結(jié)生成器的訓(xùn)練;當(dāng)我們訓(xùn)練生成器時(shí),我們需要凍結(jié)鑒別器的訓(xùn)練。
這是在雙層優(yōu)化框架下結(jié)合兩個(gè)代理的交替訓(xùn)練過(guò)程的批量訓(xùn)練代碼。
# 設(shè)置超參數(shù)
epochs = 10000
batch_size = 32
#訓(xùn)練GANs的循環(huán)
for epoch in range(epochs):
#訓(xùn)練鑒別器(凍結(jié)發(fā)生器)
discriminator.trainable = True
generator.trainable = False
#從真實(shí)的欺詐數(shù)據(jù)中隨機(jī)抽樣
real_fraud_samples = fraud_data[np.random.randint(0, num_real_fraud, batch_size)]
# 使用生成器生成虛假欺詐樣本數(shù)據(jù)
noise = np.random.normal(0, 1, size=(batch_size, latent_dim))
fake_fraud_samples = generator.predict(noise)
#為真實(shí)和偽造的欺詐樣本數(shù)據(jù)創(chuàng)建標(biāo)簽
real_labels = np.ones((batch_size, 1))
fake_labels = np.zeros((batch_size, 1))
#訓(xùn)練針對(duì)真?zhèn)纹墼p樣本的鑒別器
d_loss_real = discriminator.train_on_batch(real_fraud_samples, real_labels)
d_loss_fake = discriminator.train_on_batch(fake_fraud_samples, fake_labels)
d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)
#訓(xùn)練生成器(凍結(jié)鑒別器)
discriminator.trainable = False
generator.trainable = True
#生成合成欺詐樣本并創(chuàng)建標(biāo)簽以訓(xùn)練生成器
noise = np.random.normal(0, 1, size=(batch_size, latent_dim))
valid_labels = np.ones((batch_size, 1))
# 訓(xùn)練生成器生成“欺騙”鑒別器的樣本
g_loss = gan.train_on_batch(noise, valid_labels)
#打印進(jìn)度
if epoch % 100 == 0:
print(f"Epoch: {epoch} - D Loss: {d_loss} - G Loss: {g_loss}")
這里,我即興想到一個(gè)問(wèn)題,請(qǐng)你回答一下。
下面我們摘錄了上面代碼中與生成器訓(xùn)練相關(guān)的內(nèi)容。
你能解釋一下這個(gè)代碼是做什么的嗎?
# 生成合成欺詐樣本并創(chuàng)建標(biāo)簽以訓(xùn)練生成器
noise = np.random.normal(0, 1, size=(batch_size, latent_dim))
valid_labels = np.ones((batch_size, 1))
在第一行中,noise生成合成數(shù)據(jù)。在第二行中,valid_labels指定合成數(shù)據(jù)的標(biāo)簽。
為什么我們需要用1來(lái)標(biāo)記它,這應(yīng)該是真實(shí)數(shù)據(jù)的標(biāo)簽?你沒(méi)有發(fā)現(xiàn)代碼違反直覺(jué)嗎?
女士們,先生們,歡迎來(lái)到造假者的世界!
這就是訓(xùn)練生成器創(chuàng)建可以欺騙鑒別器的樣本的標(biāo)記魔法!
現(xiàn)在,讓我們使用經(jīng)過(guò)訓(xùn)練的生成器為少數(shù)欺詐類(lèi)型創(chuàng)建合成數(shù)據(jù)。
#訓(xùn)練后,使用生成器創(chuàng)建合成欺詐數(shù)據(jù)
noise = np.random.normal(0, 1, size=(num_synthetic_samples, latent_dim))
synthetic_fraud_data = generator.predict(noise)
#將結(jié)果轉(zhuǎn)換為Pandas DataFrame格式
fake_df = pd.DataFrame(synthetic_fraud_data, columns=features.to_list())
最后,創(chuàng)建合成數(shù)據(jù)。
在下一節(jié)中,我們可以將這些合成的欺詐數(shù)據(jù)與原始訓(xùn)練數(shù)據(jù)集相結(jié)合,使整個(gè)訓(xùn)練數(shù)據(jù)集完全平衡。我希望此完全平衡的訓(xùn)練數(shù)據(jù)集能夠提高欺詐檢測(cè)分類(lèi)模型的性能。
第4節(jié):欺詐檢測(cè)概述(基準(zhǔn)場(chǎng)景與GANs場(chǎng)景)
我們一再?gòu)?qiáng)調(diào),本項(xiàng)目中使用的GANs僅用于數(shù)據(jù)增強(qiáng),而不用于分類(lèi)。
首先,我們需要一個(gè)基準(zhǔn)模型作為比較的基礎(chǔ),以便評(píng)估基于GANs的數(shù)據(jù)增強(qiáng)對(duì)欺詐檢測(cè)模型性能的改進(jìn)。
作為一種二值分類(lèi)器算法,我選擇了Ensemble方法來(lái)構(gòu)建欺詐檢測(cè)模型。作為基準(zhǔn)場(chǎng)景,我只使用原始的不平衡數(shù)據(jù)集開(kāi)發(fā)了一個(gè)欺詐檢測(cè)模型:因此,沒(méi)有數(shù)據(jù)增強(qiáng)。然后,對(duì)于通過(guò)GANs進(jìn)行數(shù)據(jù)增強(qiáng)的第二種場(chǎng)景,我可以使用完全平衡的訓(xùn)練數(shù)據(jù)集訓(xùn)練相同的算法,該數(shù)據(jù)集包含由GANs創(chuàng)建的合成欺詐數(shù)據(jù)。
- 基準(zhǔn)場(chǎng)景:沒(méi)有數(shù)據(jù)增強(qiáng)的集成分類(lèi)器
- GANs場(chǎng)景:使用GANs數(shù)據(jù)增強(qiáng)的集成分類(lèi)器(Ensemble Classifier)
基準(zhǔn)場(chǎng)景:沒(méi)有數(shù)據(jù)增強(qiáng)的集成
接下來(lái),讓我們定義基準(zhǔn)場(chǎng)景(沒(méi)有數(shù)據(jù)增強(qiáng))。我決定使用集成分類(lèi)器:用投票法作為元學(xué)習(xí)器,這將包括以下3個(gè)基本學(xué)習(xí)器:
- 梯度增強(qiáng)
- 決策樹(shù)
- 隨機(jī)森林
由于原始數(shù)據(jù)集特別不平衡——而不是準(zhǔn)確性方面,所以我將從以下3個(gè)選項(xiàng)中選擇評(píng)估指標(biāo):準(zhǔn)確性、召回率和F1分?jǐn)?shù)。
以下自定義函數(shù)ensemble_training(X_train,y_train)定義了訓(xùn)練和驗(yàn)證過(guò)程。
def ensemble_training(X_train, y_train):
#初始化基礎(chǔ)學(xué)習(xí)器
gradient_boosting = GradientBoostingClassifier(random_state=42)
decision_tree = DecisionTreeClassifier(random_state=42)
random_forest = RandomForestClassifier(random_state=42)
#定義基型模型
base_models = {
'RandomForest': random_forest,
'DecisionTree': decision_tree,
'GradientBoosting': gradient_boosting
}
# 初始化元學(xué)習(xí)器
meta_learner = VotingClassifier(estimators=[(name, model) for name, model in base_models.items()], voting='soft')
# 用于存儲(chǔ)訓(xùn)練和驗(yàn)證指標(biāo)的列表
train_f1_scores = []
val_f1_scores = []
# 將訓(xùn)練集進(jìn)一步拆分為訓(xùn)練集和驗(yàn)證集
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.25, random_state=42, stratify=y_train)
# 訓(xùn)練和驗(yàn)證
for model_name, model in base_models.items():
model.fit(X_train, y_train)
#訓(xùn)練指標(biāo)
train_predictions = model.predict(X_train)
train_f1 = f1_score(y_train, train_predictions)
train_f1_scores.append(train_f1)
#使用校驗(yàn)集合的校驗(yàn)指標(biāo)
val_predictions = model.predict(X_val)
val_f1 = f1_score(y_val, val_predictions)
val_f1_scores.append(val_f1)
# 在整個(gè)訓(xùn)練集中訓(xùn)練元學(xué)習(xí)器
meta_learner.fit(X_train, y_train)
return meta_learner, train_f1_scores, val_f1_scores, base_models
下一個(gè)函數(shù)ensemble_evaluations(meta_learner, X_train, y_train, X_test, y_test)負(fù)責(zé)計(jì)算元學(xué)習(xí)器級(jí)別的性能評(píng)估指標(biāo)。
def ensemble_evaluations(meta_learner,X_train, y_train, X_test, y_test):
#兩個(gè)訓(xùn)練的GANs測(cè)試數(shù)據(jù)集上集成模型的指標(biāo)
ensemble_train_predictions = meta_learner.predict(X_train)
ensemble_test_predictions = meta_learner.predict(X_test)
#計(jì)算集成模型的指標(biāo)
ensemble_train_f1 = f1_score(y_train, ensemble_train_predictions)
ensemble_test_f1 = f1_score(y_test, ensemble_test_predictions)
# 計(jì)算訓(xùn)練和測(cè)試數(shù)據(jù)集的精度和召回率
precision_train = precision_score(y_train, ensemble_train_predictions)
recall_train = recall_score(y_train, ensemble_train_predictions)
precision_test = precision_score(y_test, ensemble_test_predictions)
recall_test = recall_score(y_test, ensemble_test_predictions)
#輸出訓(xùn)練和測(cè)試數(shù)據(jù)集的精度、召回率和f1分?jǐn)?shù)
print("Ensemble Model Metrics:")
print(f"Training Precision: {precision_train:.4f}, Recall: {recall_train:.4f}, F1-score: {ensemble_train_f1:.4f}")
print(f"Test Precision: {precision_test:.4f}, Recall: {recall_test:.4f}, F1-score: {ensemble_test_f1:.4f}")
return ensemble_train_predictions, ensemble_test_predictions, ensemble_train_f1, ensemble_test_f1, precision_train, recall_train, precision_test, recall_test
下面,讓我們來(lái)看一看基準(zhǔn)集成分類(lèi)器的性能數(shù)據(jù)。
Training Precision: 0.9811, Recall: 0.9603, F1-score: 0.9706
Test Precision: 0.9351, Recall: 0.7579, F1-score: 0.8372
可見(jiàn),在元學(xué)習(xí)器水平上,基準(zhǔn)模型生成了0.8372的合理水平的F1分?jǐn)?shù)。
接下來(lái),讓我們轉(zhuǎn)到使用GANs進(jìn)行數(shù)據(jù)增強(qiáng)的場(chǎng)景。我們想看看使用GAN的場(chǎng)景的性能是否能優(yōu)于基準(zhǔn)場(chǎng)景。
GANs場(chǎng)景:通過(guò)GANs增強(qiáng)數(shù)據(jù)進(jìn)行欺詐檢測(cè)
最后,我們將原始的不平衡訓(xùn)練數(shù)據(jù)集(包括非欺詐和欺詐案例)train_df和GAN生成的合成欺詐數(shù)據(jù)集fake_df相結(jié)合,構(gòu)建了一個(gè)完全平衡的數(shù)據(jù)集。在這里,我們不將測(cè)試數(shù)據(jù)集包含在此過(guò)程中,以便將其保留為原始數(shù)據(jù)集。
wdf = pd.concat([train_df, fake_df], axis=0)
我們將使用混合平衡數(shù)據(jù)集訓(xùn)練相同的集成方法,看看它是否會(huì)優(yōu)于基準(zhǔn)模型。
現(xiàn)在,我們需要將混合平衡的數(shù)據(jù)集拆分為特征和標(biāo)簽。
X_mixed = wdf[wdf.columns.drop("Class")]
y_mixed = wdf["Class"]
請(qǐng)記住,當(dāng)我早些時(shí)候運(yùn)行基準(zhǔn)場(chǎng)景時(shí),我已經(jīng)定義了必要的自定義函數(shù)來(lái)訓(xùn)練和評(píng)估集成分類(lèi)器。我也可以在此使用這些自定義函數(shù)并使用組合起來(lái)的平衡數(shù)據(jù)來(lái)訓(xùn)練相同的Ensemble算法。
我們可以將特征和標(biāo)簽(X_mixed,y_mixed)傳遞到自定義集成分類(lèi)器函數(shù)Ensemble_training()中。
meta_learner_GANs, train_f1_scores_GANs, val_f1_scores_GANs, base_models_GANs=ensemble_training(X_mixed, y_mixed)
最后,我們可以使用測(cè)試數(shù)據(jù)集對(duì)模型進(jìn)行評(píng)估。
ensemble_evaluations(meta_learner_GANs, X_mixed, y_mixed, X_test, y_test)
結(jié)果如下:
Ensemble Model Metrics:
Training Precision: 1.0000, Recall: 0.9999, F1-score: 0.9999
Test Precision: 0.9714, Recall: 0.7158, F1-score: 0.8242
結(jié)論
現(xiàn)在,我們終于可以評(píng)估GANs的數(shù)據(jù)增強(qiáng)是否如我所期望的那樣提高了分類(lèi)器的性能了。
讓我們來(lái)比較一下基準(zhǔn)場(chǎng)景和GANs場(chǎng)景之間的評(píng)估指標(biāo)。
以下是基準(zhǔn)場(chǎng)景的結(jié)果:
# The Benchmark Scenrio without data augmentation by GANs
Training Precision: 0.9811, Recall: 0.9603, F1-score: 0.9706
Test Precision: 0.9351, Recall: 0.7579, F1-score: 0.8372
以下是GANs場(chǎng)景的結(jié)果:
Training Precision: 1.0000, Recall: 0.9999, F1-score: 0.9999
Test Precision: 0.9714, Recall: 0.7158, F1-score: 0.8242
當(dāng)我們回顧訓(xùn)練數(shù)據(jù)集上的評(píng)估結(jié)果時(shí),很明顯,在所有三個(gè)評(píng)估指標(biāo)中,GANs場(chǎng)景的表現(xiàn)都優(yōu)于基準(zhǔn)場(chǎng)景。
然而,當(dāng)我們關(guān)注樣本外測(cè)試數(shù)據(jù)的結(jié)果時(shí),GANs情景僅在精度方面優(yōu)于基準(zhǔn)情景(基準(zhǔn)場(chǎng)景:0.935相對(duì)于GANs場(chǎng)景:0.9714):在召回和F1得分方面未能做到這一點(diǎn)(基準(zhǔn)場(chǎng)景:0.7579;0.8372相對(duì)于GANs場(chǎng)景:0.7158;0.8242)。
更高的精度意味著,與基準(zhǔn)場(chǎng)景相比,該模型對(duì)欺詐交易的預(yù)測(cè)中包含的非欺詐交易比例更低。
召回率較低意味著,該模型未能檢測(cè)到某些類(lèi)型的實(shí)際欺詐交易。
這兩個(gè)比較表明:雖然GANs的數(shù)據(jù)增強(qiáng)成功地模擬了訓(xùn)練數(shù)據(jù)集中的真實(shí)欺詐數(shù)據(jù),但未能捕捉到樣本外測(cè)試數(shù)據(jù)集中實(shí)際欺詐案例的多樣性。
GANs在模擬訓(xùn)練數(shù)據(jù)的特定概率分布方面做得太好了。具有諷刺意味的是,使用GANs作為數(shù)據(jù)增強(qiáng)工具,考慮到對(duì)訓(xùn)練數(shù)據(jù)的過(guò)擬合,導(dǎo)致了所產(chǎn)生的欺詐檢測(cè)(分類(lèi))模型的泛化能力較差。
很矛盾的是,上面提供的這個(gè)特定的例子提出了一個(gè)反直覺(jué)的情況,即與更簡(jiǎn)單的傳統(tǒng)算法相比,更復(fù)雜的算法可能不一定能保證更好的性能。
此外,我們還可以考慮到另一個(gè)意想不到的后果,即碳能耗問(wèn)題:在模型開(kāi)發(fā)中添加耗能高的算法可能會(huì)增加我們?nèi)粘I钪惺褂脵C(jī)器學(xué)習(xí)的碳能耗。這種情況展示了一個(gè)不必要的浪費(fèi)能耗的例子,此時(shí)不必要地浪費(fèi)了能量而沒(méi)有提供更好的性能。
在這里,我想給您留下一些關(guān)于機(jī)器學(xué)習(xí)能耗知識(shí)的鏈接,供參考:
- https://spectrum.ieee.org/ai-energy-consumption
- https://www.cell.com/joule/fulltext/S2542-4351(23)00365-3?_returnURL=https%3A%2F%2Flinkinghub.elsevier.com%2Fretrieve%2Fpii%2FS2542435123003653%3Fshowall%3Dtrue
今天,我們已經(jīng)擁有許多的GANs變體。在未來(lái)的文章中,我想探索GANs的其他變體,看看是否有任何變體可以捕獲更廣泛的原始樣本多樣性,從而提高欺詐檢測(cè)器的性能。
參考資料
- Borji, A. (2018, 10 24)。Pros and Cons of GAN Evaluation Measures,鏈接地址: https://arxiv.org/abs/1802.03446。
- Goodfellow, I. (2015, 5 21). On distinguishability criteria for estimating generative models,鏈接地址:https://arxiv.org/abs/1412.6515。
- Goodfellow, I. J., Pouget-Abadie, J., Mirza, M., Xu, B., Warde-Farley, D., Ozairy, S., . . . Bengioz, Y. (2014, 6 10). Generative Adversarial Nets,鏈接地址:https://arxiv.org/abs/1406.2661。
- Goodfellow, I. J., Pouget-Abadie, J., Mirza, M., Xu, B., Warde-Farley, D., Ozairy, S., . . . Bengioz, Y. (2014, 6 10). Generative Adversarial Networks,鏈接地址:https://arxiv.org/abs/1406.2661。
- Knight, W. (2018, 8 17). Fake America great again. Retrieved from MIT Technology,鏈接地址:https://www.technologyreview.com/2018/08/17/240305/fake-america-great-again/。
- Suginoo, M. (2024, 1 13). Mini-Max Optimization Design of Generative Adversarial Networks (GAN) ,鏈接地址:
https://towardsdatascience.com/mini-max-optimization-design-of-generative-adversarial-networks-gan-dc1b9ea44a02。
譯者介紹
朱先忠,51CTO社區(qū)編輯,51CTO專(zhuān)家博客、講師,濰坊一所高校計(jì)算機(jī)教師,自由編程界老兵一枚。
原文標(biāo)題:Fraud Detection with Generative Adversarial Nets (GANs),作者:Michio Suginoo