Isolation Forest

Isolation Forest

概述:

Intro:隨機選取特征,在該特征的maximum和minimum中隨機選擇切分值。遞歸劃分,形成孤立樹結(jié)構(gòu)。根節(jié)點到葉子節(jié)點的長度,等價于split的次數(shù)。對于多棵樹,計算平均長度,可以反映樣本異常的程度,因為異常樣本通常較快的被劃分到葉子節(jié)點,路徑長度較小。

獨立樹:隨機二叉樹,每個結(jié)點要么有兩個子節(jié)點,要么是葉子結(jié)點。對于數(shù)據(jù)集D,D的所有屬性均為連續(xù)型變量。

獨立樹構(gòu)造流程:

1、隨機選擇一個屬性(不同于決策樹的信息增益策略,直接選)

2、隨機選擇該屬性的分界值value(value取值在max和min之間)

3、[根據(jù)步驟2的值對每條記錄進行分類,小于value的記錄在左子樹,大于或等于value的記錄在右子樹

4、遞歸執(zhí)行步驟1、2、3,直到滿足條件:傳入的數(shù)據(jù)只有一條或者多條相同記錄,或者樹的高度達到閾值

預(yù)測

把測試記錄從根節(jié)點搜索,確定預(yù)測點的搜索路徑。檢測異常的假設(shè):異常點一般比較稀有,所以很快被分到葉子結(jié)點,所以獨立樹中,異常值一般是根節(jié)點到葉子結(jié)點路徑短的葉子??梢杂镁嚯x深度h(x)判斷記錄是否屬于異常值。S(x,n)判定記錄x是否為異常值,則有



n:為樣本大小,h(x)為記錄在獨立樹的高度,S(x,n)取值為0~1,越接近1,越確定為離群點,接近0則說明正常點的概率較高。如果S(x,n)大部分都接近0.5,說明數(shù)據(jù)集沒有明顯異常值。


僅使用一棵樹確定離群值隨機性較大,可將多顆獨立樹結(jié)合形成獨立森林,即隨機采樣一部分數(shù)據(jù)集構(gòu)造每一個獨立樹,并且保證每棵獨立樹不同。同時限定樣本大小,因為采樣前正常值和異常值有重疊,采樣可以有效區(qū)分正常值和離群值;同時限定獨立樹的最大高度,以內(nèi)離群值路徑較短,設(shè)置過高的高度閾值會造成大量無意義的計算,降低效率。S(x,n)此時:


sklearn庫函數(shù)

Parameters

n_estimators:int, optional(default = 100) //樹的棵數(shù),paper中建議100,再增加模型提升有限

max_samples:int or float, optional(default = “auto”) //sunsample樣本大小,默認256;int,則抽取樣本數(shù)為該值;float,則按比例計算

contamination:auto or float, optional(default = “auto”) //樣本中離群值的占比,auto是采用paper中的閾值,sklearn是0.5,float是自己指定

max_features:int or float, optional(default = 1.0) //每棵樹訓(xùn)練時參與分裂的樹的特征數(shù),默認1

bootstrap: bool, optional(default = false) //subsample時,采取有放回抽樣還是無放回抽樣,默認不放回

n_jobs: int or none, optional(default = none) //模型預(yù)測和訓(xùn)練時,工作的core數(shù)量,-1全部用來工作

random_state: int, randomState instance or none, optional(default = none) //設(shè)置隨機數(shù)

verbose: int, optional(default = 0) //是否在構(gòu)建樹的過程中輸出


Methods

decision_function(self, X) //返回基學(xué)習(xí)器的平均得分=score_samples-offset;得分越低越不正常

fit(self, X[, y, sample_weight]) //擬合模型

fit_predict(self, X[, y]) //預(yù)測

get_params(self[, deep]) //得到模型參數(shù)

predict(self, X) //預(yù)測

score_sampls(self, X) //計算得分

set_params(self, **params) //設(shè)置參數(shù)

實驗步驟:

簡單EDA

data.head()

data.shape

data.Class.value_counts()

data.isna().sum()

數(shù)據(jù)準備

交叉驗證的數(shù)據(jù)劃分和模型訓(xùn)練指定隨機數(shù)種子,以保證數(shù)據(jù)可對比和可重復(fù)

from?sklearn.model_selection import train_test_split, cross_val_score,?GridSearchCV,?StratifiedKFold

特征數(shù)據(jù)單獨存放

data[‘hour’] = data[“time”].apply(lambda x : divmod(x, 3600)[0])

X=data.drop([‘time’, ‘Class’], axis=1)

Y=data.Class

訓(xùn)練、測試數(shù)據(jù)劃分

調(diào)用train_test_split函數(shù)劃分訓(xùn)練集和測試集,設(shè)置參數(shù)stratify=y,保證劃分之后正負樣本比和總體樣本保持一致。

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

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

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