用Pyador進行『異常檢測』: 開發無監督機器學習工具庫(一)

0. 背景

異常檢測(Anomaly Detection)有非常廣泛的應用場景:

  • 金融業:從海量數據中找到「欺詐案例」
  • 網路安全:從流量數據中找到「侵入者」
  • 在線零售:從交易數據中發現「惡意買家」

換句話來說,就是從茫茫數據中找到那些「長得不一樣」的數據。元芳:「大人,我覺得這些異常點一定有問題!讓我們好好審審它們!」 但檢測異常過程一般都比較複雜,而且實際情況下數據一般都沒有標籤(label),我們並不知道哪些數據是異常點,所以無法直接用簡單的監督學習(Supervised Learning)。

為了方便大家在工作中能輕鬆應對這些複雜的場景,我正在開發一個Python開源工具庫。計劃叫做 py-anomoly-detector -> Python異常值檢測器,簡稱 Pyador。Pyador在菲律賓語中還有「仲裁人、擔保人」的意思,也非常符合我們的立意:讓這個工具庫幫你仲裁難以分辨的異常點。開發Pyador的初衷是在工作中我常常把異常檢測應用於不同領域,積累了不少相關代碼和經驗。同時也想為異常值檢測提供「一站式工具」,讓大家可以輕鬆「調包」,畢竟人生苦短。

Pyador的設計理念是將API抽象到和Sklearn相近的程度,做出一個「傻瓜式」的無監督機器學習工具庫,降低機器學習的門檻。理想情況下,你只需要提供原始數據+必要的參數(或者採用模型的默認參數),Pyador在不需要人為干預的情況下可以直接輸出異常值結果,並給出異常判斷依據。為了進一步簡化使用門檻和提高產出,我計劃集成一些基本的數據清理模塊和可視化模塊,讓你無痛搞定異常值檢測。

因為工具還在開發當中,我希望在評論/私信中得到大家的反饋

  • 你希望這個工具庫提供什麼功能?我可能遺漏了什麼必備功能?
  • 對於我提出的框架思路有什麼批評建議?
  • 如果我們完成了Pyador的開發,你有興趣嘗試使用嗎?

如果你有興趣和我一起開發這個模型,也非常歡迎,請私信我:)

1. 什麼是Pyador?

Pyador是一個基於Python,可以實現對無標籤數據自動進行異常值檢測的Python工具包。計劃是把工具包封裝成Package並上傳到PyPI - the Python Package Index和Github上,方便大家可以通過"pip install pyador"或者Github進行安裝。

通俗的說,調用Pyador你可以將數據導入模型,它會進行簡單的數據清理轉換,並檢測出一系列的「異常點」,同時給出如何判別異常點的一些規則。同時,Pyador還可以將一部分過程可視化,幫助大家更好的理解你的數據。為了提高模型的有效性,我們會提供多種封裝好的異常值檢測方法供大家選擇,這將作為API的參數可以人為修改。

Pyador依賴於:numpy, pandas, matlibplot, sklearn。我會在最大程度的避免重造輪子,以整合工作為主。

Pyador的主要功能包括

  • 自動數據清理: a. 移除固定值變數 b. 處理缺失值 c. 自動轉換變數格式
  • 自動異常值檢測:使用密度估計等無監督學習找到數據中的異常值
  • 自動生成分類規則:使用找到的異常值,結合正常數據,用決策樹模型輸出分類規則
  • 自動生成可視化圖片:包括數據相關性圖譜、流形學習(降維)、異常點分類規則可視化

概念流程圖如下,具體的功能介紹請參看文章的剩餘部分:

Pyador適合的人群:

  • 時間有限,希望能通過調用API輕鬆實現異常值的檢測的朋友
  • 喜愛數據分析但機器學習知識有限的朋友
  • Python愛好者

2. Pyador具體功能介紹(1) - 簡單的數據清理

2.1. 移除單一取值變數(unique value variable)

單一值變數指整個數據中該值取值恆定,因此對於模型無貢獻,可以移除降低數據維度。

2.2. 移除低方差(low variance)的變數

和單一取值的變數相似,低方差的變數雖然取值不唯一,但整體的變化很小。我們可以通過人為設定閾值(threshold)來去除這種變數。以一個變數只有兩個取值為例,我們可以設定閾值來去掉低方差的變數。

2.3. 處理變數缺失值(missing value)

  • 移除(removal):如果某些變數有大量的缺失值,有時候留在數據中有害無利,可以選擇移除。
  • 補全(imputation):對於缺失程度較低的變數,提供多種方法進行數據補全,如用均值或者回歸值替代。

2.4. 自動轉換變數格式

轉化描述變數(convert categorical var to numeric)是機器學習重要的一步,很多學習模型無法處理描述變數。Pyador可以自動將描述變數轉化為數值變數:如有序變數和無序變數

更多具體的數據清洗流程請參考:阿薩姆:如何有效處理特徵範圍差異大且類型不一的數據?

3. Pyador具體功能介紹(2) - 無監督異常值檢測

3.1. Isolation Forest: 周志華老師提出的Isolation Forest就是一種非常穩定的演算法,在Sklearn裡面已經得到了實現。基本的原理就是一種集成學習,通過計算每個數據點需要多少次節點拆分(splitting)才能被劃分到獨立的空間。異常點因為和其他正常點離得較遠不大相似,因此更容易用很少的拆分就可以被划到獨立的空間裡面去。

3.2. 各種Density Based的聚類方法(CBLOF)。此處需要注意,大家熟知的K-Means為原型的聚類,如K-Modes都不大適合用於異常值檢測,因為其本身很容易受到異常值和噪音的擾

3.3. 各種以K近鄰(KNN)為原型的檢測方法。從本質上說,和聚類方法是比較類似的。

3.4. 統計學密度估計及分布測試。比較簡單的做法可以嘗試將數據擬合到假設的混合模型上(finite mixture models),再通過統計學測試檢查異常點、 一般不大推薦直接這麼做,因為需要對於正常數據分布的深刻了解,才能做出對於數據分布的正確推斷。

更多具體的異常值檢測請參考:阿薩姆:反欺詐(Fraud Detection)中所用到的機器學習模型有哪些?

4. Pyador具體功能介紹(3) - 輸出分類規則可視化

一般來說,我們是無法直接可視化無監督學習的分類規則的。但一個比較取巧,但很有效的方法是:把無監督學習轉化為監督學習,構建決策樹進行可視化

  1. 假設在第3部分我們通過無監督學習發現了100個異常點,我們給它們打上標籤「1」
  2. 在訓練數據中隨機抓取100個數據點,給它們打上標籤「-1」
  3. 將第1步和第2步中的數據合併,輸出為一個訓練數據(training data)。
  4. 使用該訓練數據集訓練一個決策樹分類器,輸出分類規則為.dot文件並可視化。

以Sklearn官方文檔中的簡單的決策樹可視化為例,可視化的分類規則大概長這樣。這個可視化描述了為什麼一個數據點是異常點,為什麼不是:

5. Pyador具體功能介紹(4) - 其他功能

在核心功能以外,我計劃提供一些「錦上添花的附加功能」:

5.1. 數據可視化 - 相關性矩陣(Correlation Matrix)

人是視覺動物,可以在第一時間「看到」數據中存在的問題。分析相關矩陣的目的是告訴我們特徵兩兩之間的關係,以便於我們快速發現一些數據裡面可能存在的問題。最重要的是幫助我們檢查數據是否存在問題,有沒有什麼違反常理的情況。

做相關性圖譜的原因是為了看一下是否存在大量的共線性(colinearity)。 最極端的特例就是雖然特徵很多,但事實上之間互相關聯性很強,存在強線性關係,對於模型幫助不大。

5.2. 多維尺度變換(MDS)來直接可視化數據分布

我們都知道一般來說欺詐和正常數據應該「長得不一樣」,那是否可以直接把它們畫出來來分析?然而,數據可視化往往都是二維或者三維的,但現實往往是成百上千維。即使我們把一個特徵作為一個維度,我們最多也只能可視化三個維度。而多維尺度變換(MDS)可以將高維的數據在二維或者三維的框架裡面進行可視化,類似的數據點會更加接近。通過觀察數據點的分布,我們可以直觀的猜測數據是否有規律,是否存在潛在異常點。

這樣做的好處有兩點:

  • 首先我們可以看到數據是否存在特定的特徵,如果所有的點都是隨機散亂分布,那我們的麻煩就大了。
  • 我們似乎可以看到有一些離群的數據點,這些點可能是潛在的「欺詐」,也有可能只是噪音而已。但我們可以向客戶或者老闆展示這個可視圖,向他們證明項目有潛在的價值。

如果在可視化中我們看到了一些規律,這讓有信心繼續往下做,進入分析階段。

6. 寫在最後

構建的一個Python工具庫的最大難度就是平衡「易用性」和「自由度」。我不希望做出一個聽起來花哨,但實際上只是模型堆砌的大雜燴。

換句話說,將大量複雜功能封裝到一個容器中時,提供高度抽象的極簡API會導致模型黑箱,非常難定位bug,對於使用者來說很容易迷失方向。而如果每一步都可以由用戶自行調整,那麼又會使得這個工具庫封裝程度低,API文檔會非常繁瑣,使用難度高。為了描述我這種矛盾的心理,我特意選擇了「要你命3000」作為題圖:要你命三千_百度百科。

在這個階段,我希望能夠幫助到的用戶還是普通機器學習者,因此會盡量抽象封裝。如果一切順利,我們或許可以逐漸開放更多的介面,幫助高階用戶更好的使用這個工具庫。

很感謝你認真看到了這裡,也非常歡迎提供評論、建議、批評、和鼓勵...如果你也有興趣為這個計划出一份力,請私信我,我們或許可以商量如何協作。

至於我為什麼要啟動這個項目?說到底,還是造輪子最有意思 ?????

推薦閱讀:

PyQt5系列教程(10):老闆,這個打一下
Google Brain開源新的Python 庫:Tangent
Windows下MySQL 5.7.17壓縮版安裝過程的坑
優秀開源項目kombu源碼分析之registry和entrypoint
Python從零開始系列連載(14)——Python程序的基本控制流程(中)

TAG:Python | 机器学习 | 人工智能 |