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,保證劃分之后正負樣本比和總體樣本保持一致。