用自編碼方法預測罕見事件

1. 問題:罕見事件與非平衡數(shù)據(jù)

發(fā)生概率低于5%的事件被稱作罕見事件(rare events)颊艳,罕見事件形成的數(shù)據(jù)是不平衡數(shù)據(jù)(unbalanced data)——平衡數(shù)據(jù)是指陽性案例與陰性案例相當?shù)臄?shù)據(jù)锦庸,比如各占50%——多數(shù)深度學習方法在平衡數(shù)據(jù)上表現(xiàn)非常好,遇到不平衡數(shù)據(jù)就會出問題凤优。

舉例來說,Kaggle上面有一個識別信用卡詐騙的數(shù)據(jù)巫橄,在28.4萬條交易記錄中膀斋,只有492個記錄是詐騙交易(又叫陽性案例,在這個例子當中是罕見事件)获黔,占總記錄0.172%蚀苛,那么在詐騙和正常交易這兩類記錄上,數(shù)據(jù)就是高度不平衡的玷氏。

在這個例子里堵未,不平衡數(shù)據(jù)帶來的問題是,即便什么算法都不用盏触,只需預測每個記錄為“正常交易”(陰性)渗蟹,正確率仍可高達99.828%(= 1 - 0.172%)。對于多數(shù)項目來說赞辩,預測如果能達到這個準確率已經(jīng)非常好了雌芽,所以使用常用的監(jiān)督學習方法,以追求準確率為目標辨嗽,最終結(jié)果很可能是預測每個交易都正常世落。

拿計量方法做對比的話,比如使用probit或者logit擬合(或者分類)召庞,相當于所有回歸系數(shù)都不顯著岛心。把這組零系數(shù)代入回歸模型,給出的預測自然也是全是零(嚴格的來說篮灼,應該是截距項對應的陽性概率,即0.172%)徘禁。

手頭這個項目就遇到了這個問題诅诱,全部預測都是陰性。你事先知道某個結(jié)論是最優(yōu)的送朱,人工智能跑了幾個小時之后告訴你娘荡,這個結(jié)論確實最優(yōu)干旁,這會大大降低你對人工智能的尊敬。

2. 常見解決辦法

有兩個解決辦法炮沐。第一争群,增加陽性樣本的樣本權(quán)重,相應就降低了陰性樣本的權(quán)重大年,但這會引起過擬合换薄。第二,使用其他精度的測量翔试,而不只是預測值和實際值的差異轻要,比如ROC AUC得分。分別見這里這里垦缅。

由于手頭問題的特殊性冲泥,上兩個方法沒有奏效。

3. 非監(jiān)督學習方法:自編碼

在Rstudio AI Blog找到的這個方法壁涎,由于blog原文對該方法的原理沒有做詳細解釋凡恍,通過這幾天照抄代碼和反復閱讀,獲得了一些理解怔球,在這里記錄一下該方法的思想和實施咳焚。
原文:Predicting Fraud with Autoencoders and Keras

3.1 問題與目標

如前,就是前面提到Kaggle上的預測信用卡詐騙交易庞溜。

3.2 思想與方法

3.2.1 思想

與常用方法不一樣革半,該方法并不利用案例當中詐騙交易和正常交易分類的信息,最終也不會通過x去預測y流码。而是試圖先構(gòu)造出正常交易當中x應該具有什么樣的分布又官,再用實際案例的x跟構(gòu)造出的分布進行比較,差距過大的就是可疑交易漫试。

3.2.2 方法

根據(jù)這一想法六敬,需要實現(xiàn)以下各步驟:

  • a. 確定詐騙交易和正常交易在x分布上確實存在差異
  • b. 構(gòu)造出特征(x)的“正常”分布
  • c. 比較數(shù)據(jù)中x的分布和上一步所構(gòu)造出的分布驾荣,識別詐騙交易
  • d. 調(diào)參

下面進行詳細說明外构。

a. 確定詐騙交易和正常交易在x分布上確實存在差異
(原文Visualization一節(jié))

這是該方法能夠奏效的前提,因此必須事先予以確認播掷。不過审编,這一步本身只是一個描述性統(tǒng)計,并不涉及深度學習歧匈。

在原文中垒酬,Visualization那一節(jié)提供了快速瀏覽和比較所有變量在兩類案例中的分布的代碼。使用pipe的話只需要一行代碼,這是個具有普適性的神技能勘究,值得多敲幾遍記住矮湘。

當?shù)贸龇植嫉膱D以后,也建議停下來想一下每個變量為什么會有這樣的分布口糕,對陽性案例和陰性案例來說分別意味著什么缅阳,這是進一步完善模型的基礎(chǔ)。

b. 構(gòu)造出特征(x)的“正尘懊瑁”分布
(原文
Model definitionTraining the model**兩節(jié))

這一步使用的方法就是自編碼(autoencoder)十办,原文給出了兩個對自編碼方法進行介紹的鏈接,可以沿著細讀伏伯。這些年的經(jīng)驗是橘洞,讀一個充滿術(shù)語和數(shù)學的正式材料,只有能夠使用非正式表達解釋清楚说搅,才算是真正理解這個材料炸枣。所以接下來就使用白話記錄自己的理解。

首先要回答的問題是弄唧,x的分布本來就存在适肠,只需要把初始樣本中的正常交易拿過來就能得到,為什么還要大費周折用自編碼進行重構(gòu)候引?

我猜的答案是侯养,初始數(shù)據(jù)中包含很多噪音,直接拿來當做比較的基礎(chǔ)可能得不到任何有用的信息澄干。打個比方逛揩,使用初始數(shù)據(jù)作為對照基礎(chǔ),就像用一張充滿噪點的照片去找人麸俘,只能看出照片上有張人臉辩稽,但無法辨認出是誰。用這樣的照片找人从媚,給你一百張人臉(記住當中可能只有一個是照片上的人逞泄,因此是個高度不平衡數(shù)據(jù)),最佳策略是不管拿出的是哪張人臉拜效,都回答這不是我要找的人喷众,正確概率高達99%。而隨機抽一個就說這是要找的人紧憾,答錯的概率是99%(所以你看到千,同樣是劃水,是否講究技術(shù)稻励,結(jié)果簡直是天壤之別父阻∮混日子也得有人工智能來指導望抽,理性躺平才是人生贏家)加矛。積極的解決辦法是,找人之前就要先把噪點去掉煤篙,autoencoder就是降噪的一個方法斟览,理論上能把照片上人臉的核心特征提煉出來。

去掉噪音的過程是辑奈,先把所有的x硬往一個低維度的層里面塞(比如x包括20個變量苛茂,第一層只規(guī)定往外吐10個變量),在這個過程中鸠窗,不那么重要的特征就被擠掉了(所謂的降維)妓羊,然后再把低維度的數(shù)據(jù)還原到x的維度。在迭代過程中稍计,算法的目標是讓還原出來的x和初始數(shù)據(jù)的x盡量靠近躁绸。這時候就能看出來為什么第一步要使用低于x維度的層,如果層的維度跟x的維度一樣臣嚣,最后得出的結(jié)果一定是讓還原出來的x跟初始數(shù)據(jù)中的x一樣净刮,取得最大擬合,噪音完全被保留了下來硅则。

所以在原文中淹父,除了最后一層,每一層units都小于x的維度怎虫。

同時暑认,我們也得到了使用autoencoder的條件,就是x包含的變量當中要具有相當?shù)南嚓P(guān)性大审,也就是說某些變量包含的信息可以由其他變量推導出來蘸际,這些變量就是降維的目標。用計量的語言說饥努,x里面要有多重共線性捡鱼,或者多重共非線性一旦x中各變量是高度不相關(guān)的酷愧,就喪失了使用autoencoder的基礎(chǔ)驾诈,硬擠的話會擠掉很重要的東西。

最后還要把低維數(shù)據(jù)還原到高維溶浴,不然在下一步?jīng)]辦法跟初始數(shù)據(jù)的x分布作比較乍迄。相當于原來的照片有256個像素點,雖然當中有噪音士败,還原來回也得是256個像素點闯两。

實操中褥伴,要使用陰性樣本來訓練模型。

c. 比較數(shù)據(jù)中x的分布和上一步所構(gòu)造出的分布漾狼,識別詐騙交易
(原文Making Prediction一節(jié))

這一步也就是機器學習里的預測重慢。

我們要做的是拿構(gòu)造出x分布與每一個需要預測的案例比較,挑出來相差遠的逊躁,模型就可以發(fā)出警報似踱。那么在這一步需要確定兩個問題,第一稽煤,如何比較分布相差遠近核芽;第二,定義差距多大時發(fā)出警報酵熙。

第三步的完整過程在原文的Making Prediction部分轧简。簡單說,比較差異使用ROC AUC得分匾二,可以通過Metric包實現(xiàn)哮独。確定警報差距門檻值,可以采取最大精度原則假勿,也可以采取最小成本原則(因為無法徹底排除偽陽性的可能借嗽,將一個正常交易識別為詐騙,銀行損失一個交易转培,也就損失一筆手續(xù)費)恶导,兩個原則存在一定的消長關(guān)系,但是使用不同原則結(jié)果可能差不了太多浸须。

d. 調(diào)參
(原文Tuning with CloudML一節(jié))

操作上調(diào)參應該在預測之前惨寿,但我急于理解這種方法,調(diào)參部分就跳過去了删窒。再加上原文里是調(diào)用Google的CouldML進行調(diào)參裂垦,先學會以后再說吧。

至于數(shù)據(jù)處理(Preprocessing一節(jié))肌索,沒有什么特別值得說的操作蕉拢。

4 潛在的擴展

這種方法并不保證通過降噪去掉的只有一種罕見事件,如果樣本里诚亚、或者真實世界晕换、存在多個罕見事件,假定所構(gòu)造的正常分布非常有效站宗,即可以通過對比這個分布識別出罕見事件闸准,我們?nèi)匀徊恢涝摵币娛录儆谀膫€類別,因此可能需要進一步分類梢灭。

另外夷家,如果所使用的數(shù)據(jù)是時間序列或者面板數(shù)據(jù)蒸其,那么可能需要gru或者lstm層,這類層的具體表現(xiàn)如何库快,還不得而知摸袁。


跑個題。

參加過一個高科技EFT基金的路演缺谴,演講者是復旦物理系博士但惶,好像高中還拿過奧數(shù)金牌耳鸯。路演當中提到了人工智能湿蛔,說西方科學家曾經(jīng)斷言中國人做不了科研,因為中國文化里沒有分析县爬,沒有理論建構(gòu)的意識(我沒有查是哪個科學家說得這種話阳啥,以及即便有這個人,他的這一說法是否得到了其他同行的認可)财喳。但自打有了人工智能察迟,一切不再是問題,因為通過數(shù)理分析建立起來的最優(yōu)原則和各種定理耳高,人工智能通過大量迭代的數(shù)值運算都能建立起來扎瓶。換句話說,就算沒有推理能力泌枪,不用建構(gòu)概荷,讓人工智能這個傻子反復跑,最終也能到達那里碌燕。

博士口才出眾误证,講得激情四射,讓我差點忘了他推銷的是ETF修壕,一個用不著智力投入的被動投資工具愈捅。

事實上,缺了分析慈鸠,AI照樣可以垃圾進垃圾出蓝谨。


Update:在面板/時間序列數(shù)據(jù)使用自編碼方法

Step-by-step understanding LSTM Autoencoder layersLSTM Autoencoder for Extreme Rare Event Classification in Keras

雖然上述教程是基于python青团,轉(zhuǎn)成R并不難譬巫。比如,原文中的代碼

# define model
model = Sequential()
model.add(LSTM(128, activation='relu', input_shape=(timesteps,n_features), return_sequences=True))
model.add(LSTM(64, activation='relu', return_sequences=False))
model.add(RepeatVector(timesteps))
model.add(LSTM(64, activation='relu', return_sequences=True))
model.add(LSTM(128, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(n_features)))

model.compile(optimizer='adam', loss='mse')

model.summary()

對應的R代碼應該是

model <- keras_model_sequential() %>%
  layer_lstm(units = 128, 
                    input_shape = c(timesteps, n_features), 
                    return_sequences = TRUE) %>%
  layer_lstm(units = 64, activation = "relu")  # return_sequences 默認為 FALSE
  layer_repeat_vector(timesteps) %>%
  layer_lstm(units = 64, activation = "relu",
                    return_sequences = TRUE) %>%
  layer_lstm(units = 128, activation = "relu", 
                    return_sequences = TRUE) %>%
  time_distributed(layer_dense(units = n_features)) 

model %>% compile(
  optimizer = "adam",
  loss = "mse")

summary(model)
      

作為練習壶冒,也可以用GRU替換LSTM缕题,并嘗試其他激活函數(shù)。

最后胖腾,非常重要的是烟零,訓練模型時要注意兩點:(1)使用陰性案例作為樣本瘪松,這是因為因為要獲取正常案例的核心特征;(2)模型的輸出也是樣本的特征(x)锨阿,而不是標簽(y)宵睦,這是因為訓練的目的是獲取X的分布。

對照前面信用卡欺詐的案例的代碼看起來就很清楚

model %>% fit(
  x = x_train[y_train == 0,], 
  y = x_train[y_train == 0,], 
  ...
  validation_data = list(x_test[y_test == 0,], x_test[y_test == 0,]), 
  ...
)

x = x_train[y_train == 0,], y = x_train[y_train == 0,] 和后來驗證集的定義同時實現(xiàn)上述兩個要求墅诡。

對面板/時間序列數(shù)據(jù)壳嚎,由于包含時間維度,代碼相應改成x = x_train[y_train == 0, ,], y = x_train[y_train == 0, ,]末早,也就是在樣本選擇的index里得多加一個逗號烟馅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市然磷,隨后出現(xiàn)的幾起案子郑趁,更是在濱河造成了極大的恐慌,老刑警劉巖姿搜,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寡润,死亡現(xiàn)場離奇詭異,居然都是意外死亡舅柜,警方通過查閱死者的電腦和手機梭纹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來致份,“玉大人变抽,你說我怎么就攤上這事≈伲” “怎么了瞬沦?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雇锡。 經(jīng)常有香客問我逛钻,道長,這世上最難降的妖魔是什么锰提? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任曙痘,我火速辦了婚禮炫欺,結(jié)果婚禮上富稻,老公的妹妹穿的比我還像新娘。我一直安慰自己讼稚,他們只是感情好谅年,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布茧痒。 她就那樣靜靜地躺著,像睡著了一般融蹂。 火紅的嫁衣襯著肌膚如雪旺订。 梳的紋絲不亂的頭發(fā)上弄企,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音区拳,去河邊找鬼拘领。 笑死,一個胖子當著我的面吹牛樱调,可吹牛的內(nèi)容都是我干的约素。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼笆凌,長吁一口氣:“原來是場噩夢啊……” “哼圣猎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起菩颖,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤样漆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后晦闰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鳍怨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年呻右,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鞋喇。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡声滥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出侦香,到底是詐尸還是另有隱情落塑,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布罐韩,位于F島的核電站憾赁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏散吵。R本人自食惡果不足惜龙考,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望矾睦。 院中可真熱鬧晦款,春花似錦、人聲如沸枚冗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赁温。三九已至坛怪,卻和暖如春州藕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酝陈。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工床玻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沉帮。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓锈死,卻偏偏與公主長得像,于是被迫代替她去往敵國和親穆壕。 傳聞我的和親對象是個殘疾皇子待牵,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容