个推异常值检测和实战应用
日前,由又拍云舉辦的大數(shù)據(jù)與 AI 技術(shù)實(shí)踐|Open Talk 杭州站沙龍?jiān)诤贾菸飨苿?chuàng)園順利舉辦。本次活動(dòng)邀請了有贊、個(gè)推、方得智能、又拍云等公司核心技術(shù)開發(fā)者,現(xiàn)場分享各自領(lǐng)域的大數(shù)據(jù)技術(shù)經(jīng)驗(yàn)和心得。以下內(nèi)容整理自個(gè)推資深算法工程師令狐沖現(xiàn)場分享:
令狐沖(花名),個(gè)推資深算法工程師,目前負(fù)責(zé)個(gè)推深度學(xué)習(xí)相關(guān)研發(fā)工作,對 AI 算法有深入的了解及豐富的實(shí)踐經(jīng)驗(yàn),擅長將大數(shù)據(jù)分析與深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)相結(jié)合,為業(yè)務(wù)落地輸出算法產(chǎn)品化能力。
大家好,我是來自個(gè)推的令狐沖,今天主要分享大數(shù)據(jù)中的異常值檢測和實(shí)戰(zhàn)應(yīng)用,圍繞研究背景、異常值檢測方法、異常檢測實(shí)戰(zhàn)應(yīng)用等話題,結(jié)合相關(guān)實(shí)戰(zhàn)數(shù)據(jù)介紹異常值檢測算法的最新進(jìn)展情況。
研究背景
異常值檢測是大數(shù)據(jù)分析中一個(gè)重要的研究方向,實(shí)時(shí)異常值自動(dòng)檢測有助于運(yùn)營人員快速發(fā)現(xiàn)系統(tǒng)異常問題。我們常說的異常值通常是相對于正常值來表述的,要結(jié)合實(shí)際業(yè)務(wù)來講一個(gè)值是否正常,也就說這是一個(gè)業(yè)務(wù)描述。如果我們要解決一個(gè)業(yè)務(wù)問題,首先要做的就是將這個(gè)問題數(shù)學(xué)化,將業(yè)務(wù)描述轉(zhuǎn)化為數(shù)學(xué)描述,這樣你才可以使用適合的算法或使用其他分析方法來解決。
對于異常值而言,從數(shù)學(xué)上看可以看做一個(gè)離群點(diǎn)。當(dāng)然在實(shí)際業(yè)務(wù)中,考慮到業(yè)務(wù)的結(jié)合情況不同,有些異常值看似是離群點(diǎn),但是從全局業(yè)務(wù)上看也可能是一個(gè)正常值。具體情況需要結(jié)合結(jié)果來分析,不過我們大致可以使用離群點(diǎn)來代表異常值。
上圖為異常值描述圖,從圖中我們可以看到在回歸時(shí)有一些值不在回歸線上,這些就是離群點(diǎn)。當(dāng)我們在做聚類或分類的時(shí)候,這些孤立的值可能就是我們的異常值。
異常值檢測相比其他人熱門項(xiàng)目而言是一個(gè)比較小眾的方向,但是它在流量監(jiān)控、金融欺詐、系統(tǒng)故障檢測等場景下也是有較多應(yīng)用的:
-
流量監(jiān)控:運(yùn)維同學(xué)平常都比較關(guān)心流量檢測,比如當(dāng)服務(wù)訪問出現(xiàn)異常的時(shí)候,需要第一時(shí)間找出問題
-
金融場景:金融場景涉及到的東西很多,因此異常檢測我們以其中的金融欺詐舉例:正常情況下的金融轉(zhuǎn)賬或消費(fèi)是一個(gè)低頻事件,但是當(dāng)一個(gè)賬號在短時(shí)間內(nèi)多次轉(zhuǎn)賬或消費(fèi)時(shí)就可能存在金融詐騙的風(fēng)險(xiǎn)
-
系統(tǒng)故障檢測:這個(gè)在工業(yè)界用的較多,因?yàn)橐粋€(gè)工業(yè)系統(tǒng)內(nèi)會(huì)安裝各種各樣的傳感器,這些傳感器會(huì)實(shí)時(shí)傳送系統(tǒng)內(nèi)部件狀態(tài)的數(shù)據(jù),當(dāng)這些系統(tǒng)內(nèi)部件發(fā)生故障時(shí)往往會(huì)產(chǎn)生異常信號,如果能及時(shí)檢測出異常信號找出異常原因就可以挽回大量的損失
異常值檢測方法
接下來和大家談一下異常值檢測的方法。業(yè)內(nèi)對于異常值檢測方法都有不同的觀點(diǎn),總結(jié)下來就會(huì)有很多的分類,因此今天我們只談我的觀點(diǎn)。在我看來異常值檢測方法可以分為兩種,一種是“基于統(tǒng)計(jì)的方法”,稍微了解一點(diǎn)統(tǒng)計(jì)的話應(yīng)該知道,統(tǒng)計(jì)是有分布的,比如典型的 3σ 原則和箱體圖;另一種則是“基于模型的方法”,也就是通過構(gòu)建模型來區(qū)分正常值和異常值。
基于統(tǒng)計(jì)的異常值檢測
如上圖所示,左圖是我們經(jīng)常聽到的 3σ 法則,3σ 法則比較簡單但很實(shí)用,它是一個(gè)經(jīng)驗(yàn)法則,具體是什么意思呢?其實(shí) σ 是標(biāo)準(zhǔn)差,當(dāng)我們檢測數(shù)據(jù)服從正常的統(tǒng)計(jì)分布時(shí),我們可以將超過 3σ 的數(shù)據(jù)認(rèn)為是異常數(shù)據(jù)。它的標(biāo)準(zhǔn)均值為 0,從標(biāo)準(zhǔn)分布圖來看,大約有 0.3% 的數(shù)據(jù)為異常值。當(dāng)然如果你的均值是非 0 分布,你可以把均值加上去。不過由于 3σ 法則是一個(gè)經(jīng)驗(yàn)法則,還是比較粗糙的,因此在實(shí)際工作中,建議大家只在某些特定的場景下使用它。
右圖是箱體圖,在數(shù)據(jù)的統(tǒng)計(jì)分析中特別常用,比如我們用 pandas 做處理時(shí)就經(jīng)常使用這個(gè)方式處理異常值。如圖所示構(gòu)成箱體的一般是分界位的四分之一到四分之三,而分界則是左邊箱體的邊界減去箱體長度的某一倍數(shù),通常我們這個(gè)倍數(shù)為 1.5 倍,異常值則是超過最左邊和最右邊邊界的值。
上圖是兩種統(tǒng)計(jì)方式的對應(yīng)關(guān)系。假設(shè)數(shù)據(jù)分布是一個(gè)純粹的正態(tài)分布,我們可以看到箱體圖對應(yīng)的 σ 值只有 2.7σ 左右,不到 3σ 。當(dāng)然很多時(shí)候我們并不知道它的具體分布是什么,需要根據(jù)樣本的方差、標(biāo)準(zhǔn)差來求 σ,如果你實(shí)在不知道是什么分布,可以將它假設(shè)為是一個(gè)正態(tài)分布。因?yàn)檎龖B(tài)分布是自然界一個(gè)比較“和諧“的分布,一般場景中就算有偏差也不會(huì)過于離譜。
基于統(tǒng)計(jì)的異常值檢測有兩個(gè)明顯的優(yōu)點(diǎn):一個(gè)是是簡單方便,因?yàn)槲覀兗炔恍枰紤]它的鮮艷,也不需要考慮它的特殊分布;第二個(gè)則是因?yàn)檫@是基于統(tǒng)計(jì)學(xué)來的,有較好的數(shù)學(xué)基礎(chǔ)。當(dāng)然它的缺點(diǎn)也很明顯:首先是需要較多的樣本數(shù)據(jù),其次是高維數(shù)據(jù)比較難處理。上圖展示的是一維分布,處理起來還比較簡單,高維數(shù)據(jù)中聯(lián)合分布會(huì)涉及到一些相關(guān)性,處理起來就會(huì)比較困難。
基于模型的異常值檢測
接下來我們來談一談基于模型的異常值檢測。在我們談具體模型之前,我們需要先知道如果從分類的角度來看正常值和異常值,那它就是一個(gè)二分類問題,盡管它因?yàn)檎V刀喽惓V瞪俚脑虮瘸R?guī)的二分類問題特殊一些。因此我們可以把它看做一個(gè)樣本不均衡、分類不均勻的數(shù)學(xué)分類問題。
有監(jiān)督模型
確認(rèn)了問題類型后,我先具體介紹一下有監(jiān)督模型,通過這個(gè)常見的分類算法,比如 k- 最近鄰,可以知道到底是正常還是異常的標(biāo)簽。除此外還有典型的二分類模型支持向量機(jī) SVM。同時(shí)因?yàn)闃颖静痪獾脑?#xff0c;也衍生出了 oneclassSVM。
那分類模型具體是如何進(jìn)行異常值檢測的呢?簡單舉個(gè)例子,大家可以看一下上圖。我們常規(guī)的 SVM 是使用一個(gè)超平面將正負(fù)樣本分開。但是如果只有一個(gè)類,或者說負(fù)樣本極少的時(shí)候要怎么辦呢?我可以使用超球面將正樣本包含,然后將超球面以外的當(dāng)做異常樣本,通過這種方式去進(jìn)行異常值檢測。
接著說一下現(xiàn)在比較多的神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)的方法是如何用在異常值檢測上的。一般來說神經(jīng)網(wǎng)絡(luò)方法比較多的用在分類問題上,如果你需要將它使用在異常值檢測上,你可以輸入一個(gè)樣本值,令其經(jīng)過一個(gè)隱藏層,經(jīng)過 decoder 層進(jìn)行編碼得到輸出向量。如果是正常的樣本我們就讓 input 和 output 盡可能的接近,將它壓縮到隱藏層也就是壓縮到一個(gè) code 內(nèi),然后用它來進(jìn)行表征。后續(xù)需要通過各種方式,比如均方誤差損失等,訓(xùn)練網(wǎng)絡(luò)減少輸入和輸出的誤差,當(dāng)這個(gè)網(wǎng)絡(luò)能夠達(dá)到正常值輸入計(jì)算結(jié)果落實(shí)較小、異常值輸入計(jì)算結(jié)果落實(shí)較大時(shí),就可以用來進(jìn)行異常值檢測了。
上圖我們可以看到右邊對左邊的模型進(jìn)行了改進(jìn),不止是一層編碼層,而是構(gòu)造了中間的 code 分布,通過這個(gè)分布右邊的穩(wěn)定性會(huì)比左邊好。
無監(jiān)督模型
剛剛介紹的是有監(jiān)督模型,但是實(shí)際上我們做異常值檢測時(shí)更多的還是使用無監(jiān)督模型。因?yàn)楫惓V凳呛苌俚?#xff0c;而且還會(huì)出現(xiàn)沒有遇到的情況,這就導(dǎo)致你標(biāo)注的異常點(diǎn)會(huì)非常的少。所以我們更多的是通過無監(jiān)督的學(xué)習(xí)方法,讓異常值能夠比較完整的表征出來。
無監(jiān)督模型比較典型的是下列三類:
-
密度聚類:DBSCAN
-
孤立森林:IsolationForest(IF)
-
隨機(jī)剪切森林:RadomCutForest(RCF)
密度聚類這里就不用細(xì)講了,參考上圖左側(cè),大家可以看一下。
孤立森林最早是由周志華教授團(tuán)隊(duì)提出的,聽名字大家可能覺得和隨機(jī)森林或者 adboosting 這些方法相似,其實(shí)不止名字相似本質(zhì)上也和這些方法相似。孤立森林是通過將一些樣本或者一些點(diǎn)構(gòu)造為多棵樹,讓這些值快速的到達(dá)葉子節(jié)點(diǎn),之后根據(jù)每個(gè)點(diǎn)對應(yīng)的樹的深度來計(jì)算該點(diǎn)的平均深度。由于異常值和其他值不一樣,會(huì)出現(xiàn)一些異常的現(xiàn)象,我們就可以通過設(shè)置閾值來快速的檢測異常值。
隨機(jī)剪切森林是由英文 RadomCutForest 直譯過來的,簡寫為 RCF。它其實(shí)和孤立森林的整體思路是相同的,都是經(jīng)過構(gòu)造樹來處理。但是因?yàn)槲覀儤?gòu)造樹的時(shí)候需要選取樣本,而隨機(jī)剪切森林在采樣方法上更好一些,能夠更有效的處理多維度的相關(guān)性。同時(shí)因?yàn)殡S機(jī)剪切森林有更好的集成模塊,所以在實(shí)戰(zhàn)程度上比較推薦使用這個(gè)方法。
**剛才也講過隨機(jī)剪切森林和孤立森林的整體思路是相同的,那它們之間有什么區(qū)別?**大家可以參考下圖了解一下。左邊的公式是一些數(shù)學(xué)映射,里面 c(n) 代表樣本的平均深度。右圖中的紅線代表 s,也就是最后的異常值得分。藍(lán)色曲線是構(gòu)造的預(yù)設(shè)正弦曲線,異常值則是在某一時(shí)段讓曲線的一段成為直線的部分。
上圖右側(cè)上方的圖表展示的是孤立森林算法的結(jié)果圖。我們可以看到圖中有兩個(gè)異常值,孤立森林算法在計(jì)算異常值得分 s 時(shí),對于后面的突變點(diǎn)會(huì)有突然增高,這里我們可以設(shè)置一個(gè)合適的閾值來找出對應(yīng)的點(diǎn)。
上圖右側(cè)下方的圖表展示的是隨機(jī)剪切森林算法的結(jié)果圖。我們可以明顯看到雖然在整體上比較相似,但是該算法即便是前面較小的跳變點(diǎn)也可以精準(zhǔn)找出,這就是隨機(jī)剪切森林比孤立森林算法有優(yōu)勢的地方。
##異常值檢測實(shí)戰(zhàn)應(yīng)用
說完了檢測方法,我們接下來看一下異常值檢測在實(shí)戰(zhàn)中的應(yīng)用。下面是某應(yīng)用(app)的日活進(jìn)行監(jiān)測, 其日活并不是穩(wěn)定不變的,比如促銷活動(dòng)時(shí)日活會(huì)變高,但當(dāng)日活突然變低時(shí)則需要我們?nèi)ヅ挪槭欠窠y(tǒng)計(jì)日志或數(shù)據(jù)流本身出了問題。
上圖是某應(yīng)用 2016 年 8 月到 2019 年 9 月的日活統(tǒng)計(jì)。這么直接一看就可以看到它有很多的突變點(diǎn),這些點(diǎn)可能就是它的異常行為。而異常值檢測要做的就是使用統(tǒng)計(jì)或者機(jī)器學(xué)習(xí)的方法將這些異常點(diǎn)找出來。
當(dāng)成靜止數(shù)據(jù)時(shí)的異常值檢測
上圖是將之前的日活統(tǒng)計(jì)當(dāng)成整體數(shù)據(jù)后檢測的結(jié)果,這是一個(gè)靜止的數(shù)據(jù)。我們可以看到左圖 3σ 法則的檢測效果并不好,只檢測出了少數(shù)的幾個(gè)點(diǎn);而右圖使用孤立森林算法則的優(yōu)勢則可以很明顯的看到,它基本能夠?qū)⑷搜劭吹降漠惓H繖z測出來,而且還有一些人眼沒看到需要局部放大才能發(fā)現(xiàn)的數(shù)據(jù),它也能夠檢測出來。
當(dāng)成流式數(shù)據(jù)時(shí)的異常值檢測
在實(shí)際操作中我們會(huì)遇到很多流失數(shù)據(jù)的情況,不能夠單純的將數(shù)據(jù)當(dāng)做靜止的均值數(shù)據(jù)看,所以我們現(xiàn)在來看一下流式數(shù)據(jù)的異常值檢測。
在檢測實(shí)時(shí)數(shù)據(jù)時(shí),基于統(tǒng)計(jì)的方法可以使用滑動(dòng)窗方式來檢測,讓窗去滑動(dòng)更新,而我們只需要統(tǒng)計(jì)窗的情況就好。使用這種方式后 3σ 法則就可以將絕大部分的突變點(diǎn)都檢測出來了,當(dāng)然很明顯的可以看到右圖中使用 RCF(隨機(jī)剪切森林算法能夠檢測到的突變點(diǎn)更多,不過現(xiàn)在這張圖我沒有放大,但是 RCF 其實(shí)將局部的小異常也檢測出來了。
**無論是靜止數(shù)據(jù)還是流式數(shù)據(jù),我們都可以明顯看到基于 RCF 的方法檢測的更準(zhǔn)確一些,但是這并不代表我們可以完全放棄基于統(tǒng)計(jì)的方法。**當(dāng)我們在檢測那些數(shù)據(jù)量很大而且異常點(diǎn)的損失較少的數(shù)據(jù)時(shí),我們?nèi)匀豢梢允褂没诮y(tǒng)計(jì)的方法。雖然它的精準(zhǔn)度不如 RCF,但是它操作簡單。目前大多數(shù)沒有接觸異常值檢測的公司使用的都是基于統(tǒng)計(jì)的方法,通過設(shè)置一個(gè) 3σ 閾值或使用箱體圖來進(jìn)行異常值判斷。而在對異常值檢測有較深接觸后,RCF 就成為了異常檢測的主流。
下圖是基于不同異變點(diǎn)所作的算法總結(jié):
-
時(shí)序變點(diǎn)異常:對于這種時(shí)間點(diǎn)的突變,使用統(tǒng)計(jì)算法就可以比較好的檢測出來;
-
時(shí)序折點(diǎn)異常:對于這種不是一個(gè)點(diǎn)的跳動(dòng)而是臺階式跳動(dòng)的異常,可以使用 RCF(隨機(jī)剪切森林) 算法來檢測;
-
時(shí)序周期異常:對于這種周期異常的檢測,推薦的檢測方法是流式圖算法。這里說的圖算法其實(shí)是指圖神經(jīng)網(wǎng)絡(luò)。這點(diǎn)我之前并沒有提到,是因?yàn)槟壳皥D算法還處于一個(gè)初步階段,它的研究并不成熟,把圖神經(jīng)網(wǎng)絡(luò)和異常值檢測結(jié)合起來的運(yùn)用還特別的少。但是因?yàn)閳D神經(jīng)網(wǎng)絡(luò)現(xiàn)在的發(fā)展很快,所以在未來它一定會(huì)在異常值檢測方面有很好的效果。
講到現(xiàn)在其實(shí)我們已經(jīng)看了很多具體的算法例子,但是如果一定要說哪種算法最好,沒有辦法給出一個(gè)唯一答案,畢竟具體的選擇需要和你的實(shí)際業(yè)務(wù)結(jié)合起來,合適才是最好的。
總結(jié)
以上是生活随笔為你收集整理的个推异常值检测和实战应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网页出现不河蟹弹窗?那是被劫持了!
- 下一篇: Flink 在又拍云日志批处理中的实践