欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實(shí)現(xiàn)孤立隨機(jī)森林算法的示例代碼

 更新時(shí)間:2022年03月25日 09:11:34   作者:是夢(mèng)吧,是你吧!  
孤立森林(isolation?Forest)是一種高效的異常檢測(cè)算法,它和隨機(jī)森林類似,但每次選擇劃分屬性和劃分點(diǎn)(值)時(shí)都是隨機(jī)的,而不是根據(jù)信息增益或基尼指數(shù)來選擇。本文將用Python實(shí)現(xiàn)這一算法,需要的可以參考一下

1 簡(jiǎn)介

孤立森林(isolation Forest)是一種高效的異常檢測(cè)算法,它和隨機(jī)森林類似,但每次選擇劃分屬性和劃分點(diǎn)(值)時(shí)都是隨機(jī)的,而不是根據(jù)信息增益或基尼指數(shù)來選擇。

2 孤立隨機(jī)森林算法

2.1 算法概述

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

iForest算法是由南京大學(xué)的周志華和澳大利亞莫納什大學(xué)的Fei Tony Liu,Kai Ming Ting等人共同移除,用于挖掘數(shù)據(jù),它是適用于連續(xù)數(shù)據(jù)(Continuous numerical data)的異常檢測(cè),將異常定義為“容易被孤立的離群點(diǎn)(more likely to be separated)”——可以理解為分布稀疏且離密度高的群體較遠(yuǎn)的點(diǎn)。用統(tǒng)計(jì)學(xué)來解釋,在數(shù)據(jù)空間里面,分布稀疏的區(qū)域表示數(shù)據(jù)發(fā)生在此區(qū)域的概率很低,因此可以認(rèn)為落在這些區(qū)域里的數(shù)據(jù)是異常的。通常用于網(wǎng)絡(luò)安全中的攻擊檢測(cè)和流量異常等分析,金融機(jī)構(gòu)則用于挖掘出欺詐行為。對(duì)于找出的異常數(shù)據(jù),然后要么直接清除異常數(shù)據(jù),如數(shù)據(jù)清理中的去噪數(shù)據(jù),要么深入分析異常數(shù)據(jù),比如分析攻擊,欺詐的行為特征。

2.2 原理介紹

iForest 屬于Non-parametric和unsupervised的方法,即不用定義數(shù)學(xué)模型也不需要有標(biāo)記的訓(xùn)練。對(duì)于如何查找哪些點(diǎn)是否容易被孤立(isolated),iForest使用了一套非常高效的策略。假設(shè)我們用一個(gè)隨機(jī)超平面來切割(split)數(shù)據(jù)空間(data  space),切一次可以生成兩個(gè)子空間(詳細(xì)拿刀切蛋糕一分為二)。之后我們?cè)倮^續(xù)用一個(gè)隨機(jī)超平面來切割每個(gè)子空間,循環(huán)下去,直到每個(gè)子空間里面只有一個(gè)數(shù)據(jù)點(diǎn)為止。直觀上來講,我們可以發(fā)現(xiàn)那些密度很高的簇是被切分很多次才會(huì)停止切割,但是那些密度很低的點(diǎn)很容易很早就停到一個(gè)子空間看了。

iForest 算法得益于隨機(jī)森林的思想,與隨機(jī)森林由大量決策樹組成一樣,iForest森林也由大量的二叉樹組成,iForest 中的樹叫 isolation tree,簡(jiǎn)稱 iTree,iTree 樹和決策樹不太一樣,其構(gòu)建過程也比決策樹簡(jiǎn)單,是一個(gè)完全隨機(jī)的過程。

假設(shè)數(shù)據(jù)集有 N 條數(shù)據(jù),構(gòu)建一顆 ITree時(shí),從 N條數(shù)據(jù)中均勻抽樣(一般是無放回抽樣)出 n 個(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ù)上面的過程,直到數(shù)據(jù)集只有一條記錄或者達(dá)到了樹的限定高度。

由于異常數(shù)據(jù)較小且特征值和正常數(shù)據(jù)差別很大。因此,構(gòu)建 iTree的時(shí)候,異常數(shù)據(jù)離根更近,而正常數(shù)據(jù)離根更遠(yuǎn)。一顆ITree的結(jié)果往往不可信,iForest算法通過多次抽樣,構(gòu)建多顆二叉樹。最后整合所有樹的結(jié)果,并取平均深度作為最終的輸出深度,由此計(jì)算數(shù)據(jù)點(diǎn)的異常分支。

2.3 算法步驟

怎么來切這個(gè)數(shù)據(jù)空間是iForest的設(shè)計(jì)核心思想,本文僅學(xué)習(xí)最基本的方法,由于切割是隨機(jī)的,所以需要用ensemble的方法來得到一個(gè)收斂值(蒙特卡洛方法),即反復(fù)從頭開始切,然后平均每次切的結(jié)果。IForest由 t個(gè)iTree(Isolation Tree)孤立樹組成,每個(gè)iTree是一個(gè)二叉樹結(jié)構(gòu),所以下面我們先說一下iTree樹的構(gòu)建,然后再看iForest樹的構(gòu)建。

3 參數(shù)講解

(1)n_estimators:構(gòu)建多少個(gè)itree,int,optional (default=100)指定該森林中生成的隨機(jī)樹數(shù)量

(2)max_samples:采樣數(shù),自動(dòng)是256,int,optional(default='auto)

用來訓(xùn)練隨機(jī)數(shù)的樣本數(shù)量,即子采樣的大小:

1)如果設(shè)置的是一個(gè)int常數(shù),那么就會(huì)從總樣本 X 拉取 max_samples個(gè)樣本生成一棵樹  iTree

2)如果設(shè)置的是一個(gè)float浮點(diǎn)數(shù),那么就會(huì)從總樣本 X 拉取 max_samples*X.shape[0] 個(gè)樣本,X.shape[0] 表示總樣本個(gè)數(shù)

3) 如果設(shè)置的是 “auto”,則max_samples=min(256, n_samples),n_samples即總樣本的數(shù)量

如果max_samples 值比提供的總樣本的數(shù)量還大的話,所有的樣本都會(huì)用來構(gòu)造數(shù),意思就是沒有采樣了,構(gòu)造的 n_estimators棵ITree使用的樣本都是一樣的,即所有的樣本。

(3)contamination:c(n)默認(rèn)是0.1,float in (0, 0.5),optional(default=0.1),取值范圍為(0, 0.5),表示異常數(shù)據(jù)占給定的數(shù)據(jù)集的比例,就是數(shù)據(jù)集中污染的數(shù)量,定義該參數(shù)值的作用是在決策函數(shù)中定義閾值。如果設(shè)置為“auto”,則決策函數(shù)的閾值就和論文一樣,在版本0.20中有變換:默認(rèn)值從0.1變?yōu)?.22的auto。

(4)max_features:最大特征數(shù),默認(rèn)為1,int or float,optional,指定從總樣本X中抽取來訓(xùn)練每棵樹iTree 的屬性的數(shù)量,默認(rèn)只使用一個(gè)屬性

如果設(shè)置為 int 整數(shù),則抽取 max_features 個(gè)屬性

如果是float浮點(diǎn)數(shù),則抽取 max_features *X.shape[1] 個(gè)屬性

(5)bootstrap:boolean,optional(default = False),構(gòu)建Tree時(shí),下次是否替換采樣,為True為替換,則各個(gè)樹可放回地對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行采樣;為False為不替換,即執(zhí)行不放回的采樣

(6)n_jobs:int or None, optional (default = None), 在運(yùn)行 fit() 和 predict() 函數(shù)時(shí)并行運(yùn)行的作業(yè)數(shù)量。除了在 joblib.parallel_backend 上下文的情況下,None表示為1,設(shè)置為 -1 則表示使用所有可以使用的處理器 

(7)behaviour:str,default='old',決策函數(shù) decision_function 的行為,可以是“old”和‘new’。設(shè)置為 behavior='new'將會(huì)讓 decision_function 去迎合其它異常檢測(cè)算法的API,這在未來將會(huì)設(shè)置為默認(rèn)值。正如在 offset_ 屬性文檔中詳細(xì)解釋的那樣,decision_function 變得依賴于 contamination 參數(shù),以 0 作為其檢測(cè)異常值的自然閾值。

New in version 0.20:behaviour參數(shù)添加到了0.20版本中以實(shí)現(xiàn)后向兼容

behaviour='old'在0.20版本中以經(jīng)棄用,在0.22版本中將不能使用

behaviour參數(shù)將在0.22版本中棄用,將在0.24版本中移除

(8)random_state:int,RandomState instance or None,optional(default=None)

如果設(shè)置為 int 常數(shù),則該 random_state 參數(shù)值是用于隨機(jī)數(shù)生成器的種子

如果設(shè)置為RandomState實(shí)例,則該 random_state 就是一個(gè)隨機(jī)數(shù)生成器

如果設(shè)置為None,則該隨機(jī)數(shù)生成器就是使用在 np.random中RandomState實(shí)例

(9)verbose:int,optional(default=0)控制樹構(gòu)建過程的冗長性

(10)warm_start:bool,optional(default=False),當(dāng)設(shè)置為TRUE時(shí),重用上一次調(diào)用的結(jié)果去 fit,添加更多的樹到上一次的森林1集合中;否則就 fit一整個(gè)新的森林

4 Python代碼實(shí)現(xiàn) 

# _*_coding:utf-8_*_

#~~~~~~~~導(dǎo)入相關(guān)庫~~~~~~~~~~~·
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
import matplotlib; matplotlib.use('TkAgg')
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
from sklearn.ensemble import IsolationForest  #孤立隨機(jī)森林
 
rng = np.random.RandomState(42)  #該方法為np中的偽隨機(jī)數(shù)生成方法,其中的42表示種子,只要種子一致 產(chǎn)生的偽隨機(jī)數(shù)序列即為一致。
 
#~~~~~~~產(chǎn)生訓(xùn)練數(shù)據(jù)~~~~~~~~~~
X = 0.3 * rng.randn(100, 2)  #randn:標(biāo)準(zhǔn)正態(tài)分布;rand的隨機(jī)樣本位于[0, 1)中
X_train = np.r_[X + 2, X - 2]
X = 0.3 * rng.randn(20, 2)
X_test = np.r_[X + 2, X - 2]
X_outliers = rng.uniform(low=-4, high=4, size=(20, 2))
 
#~~~~~~~~~訓(xùn)練模型~~~~~~~~~~~~·
clf = IsolationForest( max_samples=100,random_state=rng, contamination='auto')
clf.fit(X_train)
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_outliers)
 
xx, yy = np.meshgrid(np.linspace(-5, 5, 50), np.linspace(-5, 5, 50))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
 
#~~~~~~~~~~~~~~~~可視化~~~~~~~~~~~~~~~~~~·
plt.title("孤立隨機(jī)森林")
plt.contourf(xx, yy, Z, camp=plt.cm.Blues_r)
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='green',
                 s=20, edgecolor='k')
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='white',
                 s=20, edgecolor='k')
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red',
                s=20, edgecolor='k')
plt.axis('tight')
plt.xlim((-5, 5))
plt.ylim((-5, 5))
plt.legend([b1, b2, c],
           ["training observations",
            "new regular observations", "new abnormal observations"],
           loc="upper left")
plt.show()

5 結(jié)果 

以上就是Python實(shí)現(xiàn)孤立隨機(jī)森林算法的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Python孤立隨機(jī)森林算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • django框架model orM使用字典作為參數(shù),保存數(shù)據(jù)的方法分析

    django框架model orM使用字典作為參數(shù),保存數(shù)據(jù)的方法分析

    這篇文章主要介紹了django框架model orM使用字典作為參數(shù),保存數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了字典參數(shù)結(jié)合django model實(shí)現(xiàn)保存數(shù)據(jù)相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06
  • Python除法保留兩位小數(shù)點(diǎn)的三種方法實(shí)現(xiàn)

    Python除法保留兩位小數(shù)點(diǎn)的三種方法實(shí)現(xiàn)

    這篇文章主要給大家介紹了關(guān)于Python除法保留兩位小數(shù)點(diǎn)的三種方法實(shí)現(xiàn),在py應(yīng)用中有許多拿結(jié)果中的多個(gè)整數(shù)進(jìn)行運(yùn)算,難免少不了除法(如單位換算等),但是整數(shù)進(jìn)行運(yùn)算后只會(huì)返回整數(shù),一般結(jié)果基本需要精確到后兩位,需要的朋友可以參考下
    2023-08-08
  • 用Python批量把文件復(fù)制到另一個(gè)文件夾的實(shí)現(xiàn)方法

    用Python批量把文件復(fù)制到另一個(gè)文件夾的實(shí)現(xiàn)方法

    這篇文章主要介紹了用Python批量把文件復(fù)制到另一個(gè)文件夾的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • python實(shí)現(xiàn)遠(yuǎn)程控制電腦

    python實(shí)現(xiàn)遠(yuǎn)程控制電腦

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)遠(yuǎn)程控制電腦,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • python整小時(shí) 整天時(shí)間戳獲取算法示例

    python整小時(shí) 整天時(shí)間戳獲取算法示例

    今天小編就為大家分享一篇python整小時(shí) 整天時(shí)間戳獲取算法示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Eclipse配置python默認(rèn)頭過程圖解

    Eclipse配置python默認(rèn)頭過程圖解

    這篇文章主要介紹了Eclipse配置python默認(rèn)頭過程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 使用python如何對(duì)圖片進(jìn)行壓縮

    使用python如何對(duì)圖片進(jìn)行壓縮

    這篇文章主要介紹了使用python如何對(duì)圖片進(jìn)行壓縮,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 詳解Python中的普通函數(shù)和高階函數(shù)

    詳解Python中的普通函數(shù)和高階函數(shù)

    這篇文章主要為大家介紹了Python中的普通函數(shù)和高階函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • 將matplotlib繪圖嵌入pyqt的方法示例

    將matplotlib繪圖嵌入pyqt的方法示例

    這篇文章主要介紹了將matplotlib繪圖嵌入pyqt的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • python中的隨機(jī)函數(shù)小結(jié)

    python中的隨機(jī)函數(shù)小結(jié)

    這篇文章主要介紹了python中的隨機(jī)函數(shù)小結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01

最新評(píng)論