個推異常值檢測和實戰應用
阿新 • • 發佈:2021-01-28
日前,由又拍雲舉辦的大資料與 AI 技術實踐|Open Talk 杭州站沙龍在杭州西溪科創園順利舉辦。本次活動邀請了有贊、個推、方得智慧、又拍雲等公司核心技術開發者,現場分享各自領域的大資料技術經驗和心得。以下內容整理自個推資深演算法工程師令狐沖現場分享:
令狐沖(花名),個推資深演算法工程師,目前負責個推深度學習相關研發工作,對 AI 演算法有深入的瞭解及豐富的實踐經驗,擅長將大資料分析與深度學習神經網路相結合,為業務落地輸出演算法產品化能力。
大家好,我是來自個推的令狐沖,今天主要分享大資料中的異常值檢測和實戰應用,圍繞研究背景、異常值檢測方法、異常檢測實戰應用等話題,結合相關實戰資料介紹異常值檢測演算法的最新進展情況。
## 研究背景
異常值檢測是大資料分析中一個重要的研究方向,實時異常值自動檢測有助於運營人員快速發現系統異常問題。我們常說的異常值通常是相對於正常值來表述的,要結合實際業務來講一個值是否正常,也就說這是一個業務描述。如果我們要解決一個業務問題,首先要做的就是將這個問題數學化,將業務描述轉化為數學描述,這樣你才可以使用適合的演算法或使用其他分析方法來解決。
對於異常值而言,從數學上看可以看做一個離群點。當然在實際業務中,考慮到業務的結合情況不同,有些異常值看似是離群點,但是從全域性業務上看也可能是一個正常值。具體情況需要結合結果來分析,不過我們大致可以使用離群點來代表異常值。
![](https://upload-images.jianshu.io/upload_images/80097-e88ecaca6282ff45.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
上圖為異常值描述圖,從圖中我們可以看到在迴歸時有一些值不在迴歸線上,這些就是離群點。當我們在做聚類或分類的時候,這些孤立的值可能就是我們的異常值。
**異常值檢測相比其他人熱門專案而言是一個比較小眾的方向,但是它在流量監控、金融欺詐、系統故障檢測等場景下也是有較多應用的:**
- 流量監控:運維同學平常都比較關心流量檢測,比如當服務訪問出現異常的時候,需要第一時間找出問題
- 金融場景:金融場景涉及到的東西很多,因此異常檢測我們以其中的金融欺詐舉例:正常情況下的金融轉賬或消費是一個低頻事件,但是當一個賬號在短時間內多次轉賬或消費時就可能存在金融詐騙的風險
- 系統故障檢測:這個在工業界用的較多,因為一個工業系統內會安裝各種各樣的感測器,這些感測器會實時傳送系統內部件狀態的資料,當這些系統內部件發生故障時往往會產生異常訊號,如果能及時檢測出異常訊號找出異常原因就可以挽回大量的損失
## 異常值檢測方法
接下來和大家談一下異常值檢測的方法。業內對於異常值檢測方法都有不同的觀點,總結下來就會有很多的分類,因此今天我們只談我的觀點。在我看來異常值檢測方法可以分為兩種,一種是“基於統計的方法”,稍微瞭解一點統計的話應該知道,統計是有分佈的,比如典型的 3σ 原則和箱體圖;另一種則是“基於模型的方法”,也就是通過構建模型來區分正常值和異常值。
## 基於統計的異常值檢測
![](https://upload-images.jianshu.io/upload_images/80097-38e2611fab4ff558.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
如上圖所示,左圖是我們經常聽到的 3σ 法則,3σ 法則比較簡單但很實用,它是一個經驗法則,具體是什麼意思呢?其實 σ 是標準差,當我們檢測資料服從正常的統計分佈時,我們可以將超過 3σ 的資料認為是異常資料。它的標準均值為 0,從標準分佈圖來看,大約有 0.3% 的資料為異常值。當然如果你的均值是非 0 分佈,你可以把均值加上去。不過由於 3σ 法則是一個經驗法則,還是比較粗糙的,因此在實際工作中,建議大家只在某些特定的場景下使用它。
右圖是箱體圖,在資料的統計分析中特別常用,比如我們用 pandas 做處理時就經常使用這個方式處理異常值。如圖所示構成箱體的一般是分界位的四分之一到四分之三,而分界則是左邊箱體的邊界減去箱體長度的某一倍數,通常我們這個倍數為 1.5 倍,異常值則是超過最左邊和最右邊邊界的值。
![](https://upload-images.jianshu.io/upload_images/80097-5972fff8a4d1c154.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
上圖是兩種統計方式的對應關係。假設資料分佈是一個純粹的正態分佈,我們可以看到箱體圖對應的 σ 值只有 2.7σ 左右,不到 3σ 。當然很多時候我們並不知道它的具體分佈是什麼,需要根據樣本的方差、標準差來求 σ,如果你實在不知道是什麼分佈,可以將它假設為是一個正態分佈。因為正態分佈是自然界一個比較“和諧“的分佈,一般場景中就算有偏差也不會過於離譜。
基於統計的異常值檢測有兩個明顯的優點:一個是是簡單方便,因為我們既不需要考慮它的鮮豔,也不需要考慮它的特殊分佈;第二個則是因為這是基於統計學來的,有較好的數學基礎。當然它的缺點也很明顯:首先是需要較多的樣本資料,其次是高維資料比較難處理。上圖展示的是一維分佈,處理起來還比較簡單,高維資料中聯合分佈會涉及到一些相關性,處理起來就會比較困難。
## 基於模型的異常值檢測
接下來我們來談一談基於模型的異常值檢測。在我們談具體模型之前,我們需要先知道如果從分類的角度來看正常值和異常值,那它就是一個二分類問題,儘管它因為正常值多而異常值少的原因比常規的二分類問題特殊一些。因此我們可以把它看做一個樣本不均衡、分類不均勻的數學分類問題。
**有監督模型**
確認了問題型別後,我先具體介紹一下有監督模型,通過這個常見的分類演算法,比如 k- 最近鄰,可以知道到底是正常還是異常的標籤。除此外還有典型的二分類模型支援向量機 SVM。同時因為樣本不均衡的原因,也衍生出了 oneclassSVM。
![](https://upload-images.jianshu.io/upload_images/80097-4698842aadcaea47.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
那分類模型具體是如何進行異常值檢測的呢?簡單舉個例子,大家可以看一下上圖。我們常規的 SVM 是使用一個超平面將正負樣本分開。但是如果只有一個類,或者說負樣本極少的時候要怎麼辦呢?我可以使用超球面將正樣本包含,然後將超球面以外的當做異常樣本,通過這種方式去進行異常值檢測。
![](https://upload-images.jianshu.io/upload_images/80097-806f04c2216830de.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
接著說一下現在比較多的神經網路深度學習的方法是如何用在異常值檢測上的。一般來說神經網路方法比較多的用在分類問題上,如果你需要將它使用在異常值檢測上,你可以輸入一個樣本值,令其經過一個隱藏層,經過 decoder 層進行編碼得到輸出向量。如果是正常的樣本我們就讓 input 和 output 儘可能的接近,將它壓縮到隱藏層也就是壓縮到一個 code 內,然後用它來進行表徵。後續需要通過各種方式,比如均方誤差損失等,訓練網路減少輸入和輸出的誤差,當這個網路能夠達到正常值輸入計算結果落實較小、異常值輸入計算結果落實較大時,就可以用來進行異常值檢測了。
上圖我們可以看到右邊對左邊的模型進行了改進,不止是一層編碼層,而是構造了中間的 code 分佈,通過這個分佈右邊的穩定性會比左邊好。
**無監督模型**
剛剛介紹的是有監督模型,但是實際上我們做異常值檢測時更多的還是使用無監督模型。因為異常值是很少的,而且還會出現沒有遇到的情況,這就導致你標註的異常點會非常的少。所以我們更多的是通過無監督的學習方法,讓異常值能夠比較完整的表徵出來。
![](https://upload-images.jianshu.io/upload_images/80097-cd60d8fb3f3a4fcc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
無監督模型比較典型的是下列三類:
- 密度聚類:DBSCAN
- 孤立森林:IsolationForest(IF)
- 隨機剪下森林:RadomCutForest(RCF)
密度聚類這裡就不用細講了,參考上圖左側,大家可以看一下。
孤立森林最早是由周志華教授團隊提出的,聽名字大家可能覺得和隨機森林或者 adboosting 這些方法相似,其實不止名字相似本質上也和這些方法相似。孤立森林是通過將一些樣本或者一些點構造為多棵樹,讓這些值快速的到達葉子節點,之後根據每個點對應的樹的深度來計算該點的平均深度。由於異常值和其他值不一樣,會出現一些異常的現象,我們就可以通過設定閾值來快速的檢測異常值。
隨機剪下森林是由英文 RadomCutForest 直譯過來的,簡寫為 RCF。它其實和孤立森林的整體思路是相同的,都是經過構造樹來處理。但是因為我們構造樹的時候需要選取樣本,而隨機剪下森林在取樣方法上更好一些,能夠更有效的處理多維度的相關性。同時因為隨機剪下森林有更好的整合模組,所以在實戰程度上比較推薦使用這個方法。
**剛才也講過隨機剪下森林和孤立森林的整體思路是相同的,那它們之間有什麼區別?**大家可以參考下圖瞭解一下。左邊的公式是一些數學對映,裡面 c(n) 代表樣本的平均深度。右圖中的紅線代表 s,也就是最後的異常值得分。藍色曲線是構造的預設正弦曲線,異常值則是在某一時段讓曲線的一段成為直線的部分。
![孤立森林和隨機剪下森林的區別](https://upload-images.jianshu.io/upload_images/80097-ddea142dcdc90233.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
上圖右側上方的圖表展示的是孤立森林演算法的結果圖。我們可以看到圖中有兩個異常值,孤立森林演算法在計算異常值得分 s 時,對於後面的突變點會有突然增高,這裡我們可以設定一個合適的閾值來找出對應的點。
上圖右側下方的圖表展示的是隨機剪下森林演算法的結果圖。我們可以明顯看到雖然在整體上比較相似,但是該演算法即便是前面較小的跳變點也可以精準找出,這就是隨機剪下森林比孤立森林演算法有優勢的地方。
##異常值檢測實戰應用
說完了檢測方法,我們接下來看一下異常值檢測在實戰中的應用。下面是某應用(app)的日活進行監測, 其日活並不是穩定不變的,比如促銷活動時日活會變高,但當日活突然變低時則需要我們去排查是否統計日誌或資料流本身出了問題。
![](https://upload-images.jianshu.io/upload_images/80097-fe03c1902d4ea037.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
上圖是某應用 2016 年 8 月到 2019 年 9 月的日活統計。這麼直接一看就可以看到它有很多的突變點,這些點可能就是它的異常行為。而異常值檢測要做的就是使用統計或者機器學習的方法將這些異常點找出來。
**當成靜止資料時的異常值檢測**
![](https://upload-images.jianshu.io/upload_images/80097-db631d4cd3fb824b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
上圖是將之前的日活統計當成整體資料後檢測的結果,這是一個靜止的資料。我們可以看到左圖 3σ 法則的檢測效果並不好,只檢測出了少數的幾個點;而右圖使用孤立森林演算法則的優勢則可以很明顯的看到,它基本能夠將人眼看到的異常全部檢測出來,而且還有一些人眼沒看到需要區域性放大才能發現的資料,它也能夠檢測出來。
**當成流式資料時的異常值檢測**
在實際操作中我們會遇到很多流失資料的情況,不能夠單純的將資料當做靜止的均值資料看,所以我們現在來看一下流式資料的異常值檢測。
![](https://upload-images.jianshu.io/upload_images/80097-39b9d65cd5133494.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
在檢測實時資料時,基於統計的方法可以使用滑動窗方式來檢測,讓窗去滑動更新,而我們只需要統計窗的情況就好。使用這種方式後 3σ 法則就可以將絕大部分的突變點都檢測出來了,當然很明顯的可以看到右圖中使用 RCF(隨機剪下森林演算法能夠檢測到的突變點更多,不過現在這張圖我沒有放大,但是 RCF 其實將區域性的小異常也檢測出來了。
**無論是靜止資料還是流式資料,我們都可以明顯看到基於 RCF 的方法檢測的更準確一些,但是這並不代表我們可以完全放棄基於統計的方法。**當我們在檢測那些資料量很大而且異常點的損失較少的資料時,我們仍然可以使用基於統計的方法。雖然它的精準度不如 RCF,但是它操作簡單。目前大多數沒有接觸異常值檢測的公司使用的都是基於統計的方法,通過設定一個 3σ 閾值或使用箱體圖來進行異常值判斷。而在對異常值檢測有較深接觸後,RCF 就成為了異常檢測的主流。
下圖是基於不同異變點所作的演算法總結:
![](https://upload-images.jianshu.io/upload_images/80097-9c18cd2ee4ae1998.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 時序變點異常:對於這種時間點的突變,使用統計演算法就可以比較好的檢測出來;
- 時序折點異常:對於這種不是一個點的跳動而是臺階式跳動的異常,可以使用 RCF(隨機剪下森林) 演算法來檢測;
- 時序週期異常:對於這種週期異常的檢測,推薦的檢測方法是流式圖演算法。這裡說的圖演算法其實是指圖神經網路。這點我之前並沒有提到,是因為目前圖演算法還處於一個初步階段,它的研究並不成熟,把圖神經網路和異常值檢測結合起來的運用還特別的少。但是因為圖神經網路現在的發展很快,所以在未來它一定會在異常值檢測方面有很好的效果。
講到現在其實我們已經看了很多具體的演算法例子,但是如果一定要說哪種演算法最好,沒有辦法給出一個唯一答案,**畢竟具體的選擇需要和你的實際業務結合起來,合適才是最好的。**
#### 推薦閱讀
[微服務架構下 CI/CD 如何落地](https://www.upyun.com/tech/article/602/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E4%B8%8B%20CI%2FCD%20%E5%A6%82%E4%BD%95%E8%90%BD%E5%9C%B0.html)
[有贊統一接入層架構演進](https://www.upyun.com/tech/article/600/%E6%9C%89%E8%B5%9E%E7%BB%9F%E4%B8%80%E6%8E%A5%E5%85%A5%E5%B1%82%E6%9E%B6%E6%9E%84%E6%BC%94%E8%BF%