異常檢測算法之IForest

前言

IForest即孤立森林,可以用于做異常檢測。一句話總結IForest做異常檢測的原理:異常點密度小,基于樹模型容易被一下切割出來,正常值密度大,需要切割多次才能得到目標值。

原理

iForest算法得益于隨機森林的思想,與隨機森林由大量決策樹組成一樣,iForest森林也由大量的二叉樹組成。iForest中的樹叫isolation tree,簡稱iTree。iTree樹和決策樹不太一樣,其構建過程也比決策樹簡單,是一個完全隨機的過程。
每個iTree的實現步驟
1、 假設數據集有N條數據,構建一顆iTree時,從N條數據中均勻抽樣(一般是無放回抽樣)出ψ個樣本出來,作為這顆樹的訓練樣本。
2、 在樣本中,隨機選一個特征,并在這個特征的所有值范圍內(最小值與最大值之間)隨機選一個值,對樣本進行二叉劃分,將樣本中小于該值的劃分到節點的左邊,大于等于該值的劃分到節點的右邊。由此得到一個分裂條件和左、右兩邊的數據集。
3、 然后分別在左右兩邊的數據集上重復上面的過程,直到數據集只有一條記錄或者達到了樹的限定高度。

獲得t個iTree之后,iForest 訓練就結束,然后我們可以用生成的iForest來評估測試數據了。對于一個訓練數據x,我們令其遍歷每一棵iTree,然后計算x最終落在每個樹第幾層(x在樹的高度)。然后我們可以得出x在每棵樹的高度平均值,即 the average path length overt iTrees。
獲得每個測試數據的average path length后,我們可以設置一個閾值(邊界值),average path length 低于此閾值的測試數據即為異常。
在這里插入圖片描述
圖1 iForest構建iTree示例,異常數據點(17,17)通常離根節點很近

由于異常數據的數量較小且特征值和正常數據差別很大。因此,構建iTree的時候,異常數據離根更近,而正常數據離根更遠。一棵iTree的結果往往不可信,iForest算法通過多次抽取樣本,構建多棵二叉樹。最后整合所有樹的結果,并取平均深度作為最終的輸出深度,由此計算數據點的異常分值。

優缺點

優點:

iForest具有線性時間復雜度,IForest是集成算法,因此可以用在海量數據集上,通常樹的數量越多,算法越穩定。

缺點:

1、不適用與特別高維的數據。由于每次切數據空間都是隨機選取一個維度,建完樹后仍然有大量的維度信息沒有被使用,導致算法可靠性降低。高維空間還可能存在大量噪音維度或無關維度(irrelevant attributes),影響樹的構建。對這類數據,建議使用子空間異常檢測(Subspace Anomaly Detection)技術
2、iForest僅對Global Anomaly 敏感,即全局稀疏點敏感,不擅長處理局部的相對稀疏點 (Local Anomaly)。目前已有改進方法發表于PAKDD,詳見“Improving iForest with Relative Mass”。

適用場景

適用于樣本維度不是特別高的場景

參數詳解

classpyod.models.iforest.IForest(n_estimators=100, max_samples='auto', contamination=0.1, max_features=1.0, bootstrap=False, n_jobs=1, random_state=None, verbose=0)n_estimators:估算器數量。默認100棵樹
max_samples:訓練每個估算器(tree)需要抽取的樣本數。默認選256個樣本建樹
int:抽取max_samples個
float:抽取max_samples*X.shape[0](即樣本行數)個
auto:抽取min(256, n_samples)個contamination:污染度即假設每個數據集包含的噪聲含量
;
max_features:訓練每個估算器需要抽取的特征數,高維數據時不必分割所有特征
int:抽取max_features個
float:抽取max_features*X.shape[1]即(樣本列數)個<占比>bootstrap:
true:單一樹需擬合替換的隨機樣本
false:進行無需更換的取樣n_jobs:并行作業數。-1時,n_jobs為CPU核心數random_state:隨機數種子/生成器verbose:控制建樹過程

總結

經實踐,發現IForest針對數據量大,特征少的業務場景,進行異常識別的效果非常不錯。但是需要注意在調整contamination參數的時候,若數據中識別的噪聲數據量不滿足該參數,則不會做任何處理。即若設置噪聲占比為10%,但是模型識別的噪聲數量小于10%(比如只識別了7%的噪聲),這個時候模型只會返回7%的噪聲,并不會按照10%噪聲占比量進行返回。一定要注意這種情況,這種情況可能的原因之一:當噪聲數據聚成了一個簇時,若實際的噪聲占比為15%,但是我初始設置的是contamination為10%。這時候由于有約5%的噪聲在模型中對應的深度相同,即異常分數相同,則造成模型最終認為這些數據在當前的參數設定下不能認定為噪聲。
PS:該模型最終是將每條數據在IForest中所處的深度轉化為一個異常值分數,按照異常值分數進行排序,通過contamination的設定值截取前top的數據作為噪聲輸出來完成整個噪聲識別流程。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456311.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456311.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456311.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JavaScript - 動態數據

1、使用ajax進行數據的請求 function getData(params){$.ajax({type: "POST", //提交方式data: "{params}", //請求參數url:, //請求接口contentType: "application/text;charsetutf-8",async: false, //是否同步dataType: &quo…

用c#編寫爬蟲在marinetraffic下載船僅僅圖片

近期在做船僅僅識別方面的事情&#xff0c;須要大量的正樣本來訓練adaboost分類器。于是到marinetraffic這個站點上下載船僅僅圖片。寫個爬蟲來自己主動下載顯然非常方便。 站點特點 在介紹爬蟲之前首先了解一下marinetraffic這個站點的一些特點&#xff1a; 1. 會定期檢測爬蟲…

發送手機驗證碼通過調用第三方網易云信API(flask項目)

一、 獲取驗證碼&#xff1a; 1. 輸入手機號碼 2. 通過ajax發送請求 3. 后端&#xff1a; 獲取手機號碼 使用requests向第三方的服務端&#xff08;網易云信&#xff09;發送請求 官方文檔 https://dev.yunxin.163.com/docs/product/%E7%9F%AD%E4%BF%A1/%E7%9F…

異常檢測算法之LOF

前言&#xff1a; LOF&#xff1a;Local outlier factor&#xff0c;即局部異常因子。LOF主要是通過比較每個點p和其鄰域點的密度來判斷該點是否為異常點&#xff0c;如果點p的密度越低&#xff0c;越可能被認定是異常點。至于密度&#xff0c;是通過點之間的距離來計算的&…

Android屬性動畫進階用法

2019獨角獸企業重金招聘Python工程師標準>>> 在上周二文章中介紹補間動畫缺點的時候有提到過&#xff0c;補間動畫是只能對View對象進行動畫操作的。而屬性動畫就不再受這個限制&#xff0c;它可以對任意對象進行動畫操作。那么大家應該還記得之前我舉的一個例子&am…

5.3linux下C語言socket網絡編程簡例

原創文章&#xff0c;轉載請注明轉載字樣和出處&#xff0c;謝謝&#xff01; 這里給出在Linux下的簡單socket網絡編程的實例&#xff0c;使用tcp協議進行通信&#xff0c;服務端進行監聽&#xff0c;在收到客戶端的連接后&#xff0c;發送數據給客戶端&#xff1b;客戶端在接受…

parser.add_argument驗證格式

article_bp Blueprint(article, __name__, url_prefix/api) api Api(article_bp) parser reqparse.RequestParser() parser.add_argument(name, typestr, help必須填寫名稱, requiredTrue) channel_fields { id: fields.Integer, cname: fields.String } clas…

異常檢測算法之HBOS

前言 HBOS&#xff08;Histogram-based Outlier Score&#xff09;核心思想&#xff1a;將樣本按照特征分成多個區間&#xff0c;樣本數少的區間是異常值的概率大。 原理 該方法為每一個樣本進行異常評分&#xff0c;評分越高越可能是異常點。評分模型為&#xff1a; 假設樣…

字典和json 的區別 和轉換

前言&#xff1a;字典和json非常像。接下來比較一下兩者的異同 先看一下字典的寫法&#xff1a; a {a:1,b:2,c:3} 再看一下json的寫法&#xff1a; {"studentInfo":{"id":123456,"stu_name":"Dorra"} } 從形式上看&#xff0c;都是…

Struts2的工作原理及工作流程

眾所周知&#xff0c;Struts2是個非常優秀的開源框架&#xff0c;我們能用Struts2框架進行開發&#xff0c;同時能 快速搭建好一個Struts2框架&#xff0c;但我們是否能把Struts2框架的工作原理用語言表達清楚&#xff0c;你表達的原理不需要說出底層是怎么實現的&#xff0c;我…

正則表達式采坑

[a-zA-Z]匹配大小寫字符 \w 匹配字母、數字、下劃線 {5,7} 表示前面的字符&#xff08;即&#xff1a;\w&#xff09;必須至少出現 5 次最多出現 7 次. 合起來就是 >6 少于8個的字符 [a-zA-Z]\w{6,12} --------------》》 就是要輸入七位數到十三位&#x…

easyui動態顯示和隱藏表頭

為什么80%的碼農都做不了架構師&#xff1f;>>> var _bt{date:日期,subtime:填寫時間,xz:小組,uname:操作人,qdbh:渠道編號,mt:媒體,zh:賬戶,sjd:時間段,tfwz:投放位置,tfh:投放號,td:團隊,sjje:實際金額,jxs:進線數,cb:成本,yxzyjx:有效資源進線,yxzyl:有效資源率…

物聯網

如果要說未來什么技術正在或將徹底改變人類生活、工作和娛樂的方式&#xff0c;那必須是物聯網。小到各種可穿戴產品&#xff0c;大到汽車、工廠和樓宇&#xff0c;物聯網能使一切設備互聯并具備智慧。物聯網也正改變著產業的格局&#xff0c;索尼、夏普、東芝等日本傳統電子設…

理解:復雜度是O(log^n) 就是二分法

冒昧問一下&#xff0c;為什么二分法查找的復雜度是O(log^n)&#xff1f;這是怎么計算的&#xff1f; 你要從1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#xff0c;8里面找到3&#xff0c;分成幾步&#xff1f; 第一步&#xff0c;…

淺談管理數據平臺的一些想法

前言&#xff1a; 對于任何使用大數據技術的公司來說&#xff0c;大數據平臺特別是Hive來說&#xff0c;維護其高效快速的運行&#xff0c;對整個公司的運作來說至關重要。比如說&#xff1a;某個調度任務失敗了造成業務部門的某些報表無法正常產出&#xff1b;hive平臺最近速…

MongoDB誤刪表恢復

一、場景描述公司某工程師執行db.giveget_card.drop()&#xff0c;誤將線上表刪除。幸好每天都有做備份&#xff0c;這個時候就體現了備份的重要性了&#xff0c;哈哈哈。。。二、模擬故障過程備份數據大小&#xff1a;rs_test01:PRIMARY> use ycsb switched to db ycsb rs_…

linux下kill某個應用

linux命令行與桌面切換快捷鍵CtrAltF1&#xff0c;CtrAltF7 ps -e | grep abc sudo kill xyz 轉載于:https://www.cnblogs.com/cj2014/p/6512354.html

flask中數據庫的基本操作-增刪改查【備忘】

1.增加數據&#xff08;就相當于增加一個實例對象&#xff09; user1 User(namelong,email1006550026qq.com,password123456,role_id1) db.session.add(user1) db.session.commit() 2.修改數據 修改用戶表里面的name為long的姓名為&#xff1a;fang 首先查詢到名為…

兩個文件比較之comm命令

comm命令可用于兩個文件之間的比較。它有很多不錯的選項可用來調整輸出&#xff0c;以便我們執行交集、求差&#xff08;difference&#xff09;以及差集操作。? 交集&#xff1a;打印出兩個文件所共有的行。? 求差&#xff1a;打印出指定文件所包含的且互不相同的那些行。?…

【轉】error while loading shared libraries: xxx.so.x 錯誤的原因和解決辦法

原博客地址&#xff1a;http://www.cnblogs.com/Anker/p/3209876.html#undefined error while loading shared libraries: xxx.so.x" 錯誤的原因和解決辦法 今天在執行一個protobuf程序時&#xff0c;提示error while loading shared libraries: libprotobuf.so.8: cannot…