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 definition和Training 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 layers和LSTM 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里得多加一個逗號烟馅。