Isolation Forest

摘要:iForest用于挖掘異常數(shù)據(jù),如網(wǎng)絡(luò)安全中的攻擊檢測(cè)和流量異常分析,金融機(jī)構(gòu)則用于挖掘出欺詐行為。算法對(duì)內(nèi)存要求很低,且處理速度很快,其時(shí)間復(fù)雜度也是線性的。可以很好的處理高維數(shù)據(jù)和大數(shù)據(jù),并且也可以作為在線異常檢測(cè)。

0x14.jpg

01 孤立森林

isolation,意為孤立/隔離,是名詞,其動(dòng)詞為isolate,forest是森林,合起來就是“孤立森林”了,也有叫“獨(dú)異森林”,好像并沒有統(tǒng)一的中文叫法??赡艽蠹腋?xí)慣用其英文的名字isolation forest,簡(jiǎn)稱iForest。

iForest算法用于挖掘異常(Anomaly)數(shù)據(jù),或者說離群點(diǎn)挖掘,總之是在一大堆數(shù)據(jù)中,找出與其它數(shù)據(jù)的規(guī)律不太符合的數(shù)據(jù)。通常用于網(wǎng)絡(luò)安全中的攻擊檢測(cè)和流量異常等分析,金融機(jī)構(gòu)則用于挖掘出欺詐行為。對(duì)于找出的異常數(shù)據(jù),然后要么直接清除異常數(shù)據(jù),如數(shù)據(jù)清理中的去除噪聲數(shù)據(jù),要么深入分析異常數(shù)據(jù),比如分析攻擊、欺詐的行為特征。

算法起源于08年的一篇論文《Isolation Forest》,這論文由澳大利亞莫納什大學(xué)的兩位教授Fei Tony Liu, Kai Ming Ting(這兩個(gè)名字看起來都像是華人)和南京大學(xué)的周志華教授共同完成,而這三人在2011年又發(fā)表了《Isolation-based Anomaly Detection》,這兩篇論文算是確定了這個(gè)算法的基礎(chǔ)。

論文地址:

http://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/icdm08b.pdf

http://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/tkdd11.pdf

關(guān)于算法 ,網(wǎng)上的中文資料也并不多,下面是搜索到周志華教授在2015-07-12發(fā)的信息:

ICML上遇到國(guó)際機(jī)器學(xué)習(xí)學(xué)會(huì)首任主席Dietterich教授,對(duì)我們的iForest算法大贊,說嘗試了很多方法,還是這個(gè)又快又好。前段時(shí)間澳洲某startup公司也說他們發(fā)現(xiàn)iForest在信息安全領(lǐng)域的異常檢測(cè)應(yīng)用中表現(xiàn)最佳并準(zhǔn)備做進(jìn)產(chǎn)品。isolation Forest,推薦給有異常檢測(cè)任務(wù)的同學(xué)。

從上面的評(píng)價(jià)中來看,iForest算法在實(shí)際的應(yīng)用中應(yīng)該具有不錯(cuò)的效果,得益于隨機(jī)森林的思想,能快速處理大規(guī)模的數(shù)據(jù),在當(dāng)前的大數(shù)據(jù)環(huán)境下,應(yīng)該很受歡迎。

02 算法原理

與隨機(jī)森林由大量決策樹組成一樣,iForest森林也由大量的樹組成。iForest中的樹叫isolation tree,簡(jiǎn)稱iTree。iTree樹和決策樹不太一樣,其構(gòu)建過程也比決策樹簡(jiǎn)單,因?yàn)槠渲芯褪且粋€(gè)完全隨機(jī)的過程。

假設(shè)數(shù)據(jù)集有N條數(shù)據(jù),構(gòu)建一顆iTree時(shí),從N條數(shù)據(jù)中均勻抽樣(一般是無放回抽樣)出ψ個(gè)樣本出來,作為這顆樹的訓(xùn)練樣本。

在樣本中,隨機(jī)選一個(gè)特征,并在這個(gè)特征的所有值范圍內(nèi)(最小值與最大值之間)隨機(jī)選一個(gè)值,對(duì)樣本進(jìn)行二叉劃分,將樣本中小于該值的劃分到節(jié)點(diǎn)的左邊,大于等于該值的劃分到節(jié)點(diǎn)的右邊。

這樣得到了一個(gè)分裂條件和左、右兩邊的數(shù)據(jù)集,然后分別在左右兩邊的數(shù)據(jù)集上重復(fù)上面的過程,直接達(dá)到終止條件。終止條件有兩個(gè),一個(gè)是數(shù)據(jù)本身不可再分(只包括一個(gè)樣本,或者全部樣本相同),另外一個(gè)是樹的高度達(dá)到log2(ψ)。不同于決策樹,iTree在算法里面已經(jīng)限制了樹的高度。當(dāng)然不限制也可以,只是算法為了效率考慮,只需要達(dá)到log2(ψ)深度即可。

把所有的iTree樹構(gòu)建好了,就可以對(duì)測(cè)數(shù)據(jù)進(jìn)行預(yù)測(cè)了。預(yù)測(cè)的過程就是把測(cè)試數(shù)據(jù)在iTree樹上沿對(duì)應(yīng)的條件分支往下走,直到達(dá)到葉子節(jié)點(diǎn),并記錄這過程中經(jīng)過的路徑長(zhǎng)度h(x),即從根節(jié)點(diǎn),穿過中間的節(jié)點(diǎn),最后到達(dá)葉子節(jié)點(diǎn),所走過的邊的數(shù)量(path length)。

最后,將h(x)帶入,計(jì)算每條待測(cè)數(shù)據(jù)的異常分?jǐn)?shù)(Anomaly Score),其計(jì)算公式為:

$ s(x,n) = 2^{(-\frac{E( { h(x) })}? { c(n) } )} $

其中 $ c(n) = 2H(n ? 1) ? (2(n ? 1)/n) $ 是二叉搜索樹的平均路徑長(zhǎng)度,用來對(duì)結(jié)果進(jìn)行歸一化處理, 其中的H(k)可以通過公式 $ H(k) = ln(k) + \xi $來估計(jì),$\xi$是歐拉常數(shù),其值為0.5772156649。

$ h(x)$ 為路徑長(zhǎng)度,$ E(h(x)) $ 為森林中所有iTree樹的平均路徑長(zhǎng)度。

使用異常分?jǐn)?shù),具有以下性質(zhì):

如果分?jǐn)?shù)越接近1,其是異常點(diǎn)的可能性越高;

如果分?jǐn)?shù)都比0.5要小,那么基本可以確定為正常數(shù)據(jù);

如果所有分?jǐn)?shù)都在0.5附近,那么數(shù)據(jù)不包含明顯的異常樣本。

上面的步驟,可以總結(jié)為兩步:

訓(xùn)練:從訓(xùn)練集中進(jìn)行采樣,并構(gòu)建iTree樹;

測(cè)試:對(duì)iForest森林中的每顆iTree樹進(jìn)行測(cè)試,記錄path length,然后根據(jù)異常分?jǐn)?shù)計(jì)算公式,計(jì)算每條測(cè)試數(shù)據(jù)的anomaly score。

03 算法特點(diǎn)

在論文中,也比較了其它的常用異常挖掘的算法。比如常用的統(tǒng)計(jì)方法,基于分類的方法,和基于聚類的方法,這些傳統(tǒng)算法通常是對(duì)正常的數(shù)據(jù)構(gòu)建一個(gè)模型,然后把不符合這個(gè)模型的數(shù)據(jù),認(rèn)為是異常數(shù)據(jù)。而且,這些模型通常為正常數(shù)據(jù)作優(yōu)化,而不是為異常數(shù)據(jù)作優(yōu)化。而iForest可以顯示地找出異常數(shù)據(jù),而不用對(duì)正常的數(shù)據(jù)構(gòu)建模型。

由于異常數(shù)據(jù)的兩個(gè)特征(少且不同: few and different)

異常數(shù)據(jù)只占很少量;

異常數(shù)據(jù)特征值和正常數(shù)據(jù)差別很大。

異常數(shù)據(jù)的這兩個(gè)特征,確定了算法的理論基礎(chǔ)。因此,構(gòu)建二叉樹型結(jié)構(gòu)的時(shí)候,異常數(shù)據(jù)離根更近,而正常數(shù)據(jù)離根更遠(yuǎn),更深。算法為了效率考慮,也限定了樹的深度:ceil(log2(n)),這個(gè)值近似于樹的平均深度,因?yàn)橹恍枰P(guān)心那些低于平均高度的數(shù)據(jù)點(diǎn),而不需要樹進(jìn)行完全生成。

算法只需要兩個(gè)參數(shù):樹的多少與采樣的多少。實(shí)驗(yàn)發(fā)現(xiàn),在100顆樹的時(shí)候,路徑的長(zhǎng)度就已經(jīng)覆蓋得比較好了,因此選100顆也就夠了。采樣,是為了更好的將正常數(shù)據(jù)和異常數(shù)據(jù)分離開來。有別于其它模型,采樣數(shù)據(jù)越多,反面會(huì)降低iForest識(shí)別異常數(shù)據(jù)的能力。因?yàn)?,通常使?56個(gè)樣本,這也是scikit-learn實(shí)現(xiàn)時(shí)默認(rèn)使用的采樣數(shù)。

由于算法只需要采樣數(shù)據(jù)256條樣本,并且對(duì)樹的深度也有限制,因此,算法對(duì)內(nèi)存要求很低,且處理速度很快,其時(shí)間復(fù)雜度也是線性的。

不像其它算法,需要計(jì)算距離或者密度來尋找異常數(shù)據(jù),iForest算法可以很好的處理高維數(shù)據(jù)和大數(shù)據(jù),并且也可以作為在線預(yù)測(cè)。假設(shè)采樣為256條,結(jié)點(diǎn)最大為511個(gè),假設(shè)一個(gè)節(jié)點(diǎn)占b字節(jié),共使用t顆樹,那么需要的內(nèi)存只有511tb字節(jié),基本上只需要幾M到幾十M的內(nèi)存就夠了。數(shù)據(jù)還顯示,預(yù)測(cè)287,748條數(shù)據(jù)只花了7.6秒。

另外,iForest既能發(fā)現(xiàn)群異常數(shù)據(jù),也能發(fā)現(xiàn)散點(diǎn)異常數(shù)據(jù)。同時(shí)也能處理訓(xùn)練數(shù)據(jù)中不包含異常數(shù)據(jù)的情況。

這么好的算法,你還在等什么?

04 sklearn示例

IsolationForest在scikit-learn的0.18中才有實(shí)現(xiàn),scikit-learn目前的stable版本為0.17,而0.18是dev版本。需要直接去github中clone。

源碼和文檔地址:

https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/ensemble/iforest.py

http://scikit-learn.org/dev/modules/generated/sklearn.ensemble.IsolationForest.html

下載源碼與安裝:

git clone https://github.com/scikit-learn/scikit-learn.gitcdscikit-learnpythonsetup.pyinstall

算法基本上不需要配置參數(shù)就可以直接使用,通常就以下幾個(gè)(參數(shù)明顯比隨機(jī)森林簡(jiǎn)單):

n_estimators: 默認(rèn)為100,配置iTree樹的多少

max_samples: 默認(rèn)為265,配置采樣大小

max_features: 默認(rèn)為全部特征,對(duì)高維數(shù)據(jù),可以只選取部分特征

示例:

importpandas as pdfrom sklearn.ensembleimportIsolationForestilf= IsolationForest(n_estimators=100,n_jobs=-1,# 使用全部cpuverbose=2,)data= pd.read_csv('data.csv',index_col="id")data= data.fillna(0)# 選取特征,不使用標(biāo)簽(類型)X_cols= ["age","salary","sex"]print data.shape# 訓(xùn)練ilf.fit(data[X_cols])shape= data.shape[0]batch=10**6all_pred= []for iinrange(shape/batch+1):start= i * batchend= (i+1) * batchtest= data[X_cols][start:end]# 預(yù)測(cè)pred= ilf.predict(test)? ? all_pred.extend(pred)data['pred'] = all_preddata.to_csv('outliers.csv',columns=["pred",],header=False)

算法的訓(xùn)練過程需要的內(nèi)存很少,但如果數(shù)據(jù)量太大,在預(yù)測(cè)的時(shí)候,可能會(huì)把內(nèi)存擠爆,上面代碼中的for循環(huán)便是分塊對(duì)數(shù)據(jù)進(jìn)行預(yù)測(cè),最后再組合起來。

參考文章

http://www.cnblogs.com/fengfenggirl/p/iForest.html

http://qf6101.github.io/machine%20learning/2015/08/01/Isolation-Forest/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容