成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何使用Python進行異常檢測

開發 后端
異常檢測可以作為異常值分析的一項統計任務來處理。但是如果我們開發一個機器學習模型,它可以像往常一樣自動化,可以節省很多時間。

 異常檢測可以作為異常值分析的一項統計任務來處理。但是如果我們開發一個機器學習模型,它可以像往常一樣自動化,可以節省很多時間。

異常檢測有很多用例。信用卡欺詐檢測、故障機器檢測或基于異常特征的硬件系統檢測、基于醫療記錄的疾病檢測都是很好的例子。還有更多的用例。異常檢測的應用只會越來越多。

在本文中,我將解釋在Python中從頭開始開發異常檢測算法的過程。

公式和過程

與我之前解釋過的其他機器學習算法相比,這要簡單得多。該算法將使用均值和方差來計算每個訓練數據的概率。

如果一個訓練實例的概率很高,這是正常的。如果某個訓練實例的概率很低,那就是一個異常的例子。對于不同的訓練集,高概率和低概率的定義是不同的。我們以后再討論。

如果我要解釋異常檢測的工作過程,這很簡單。

1. 使用以下公式計算平均值:

使用Python進行異常檢測

這里m是數據集的長度或訓練數據的數量,而$x^i$是一個單獨的訓練例子。如果你有多個訓練特征,大多數情況下都需要計算每個特征能的平均值。

2. 使用以下公式計算方差:

使用Python進行異常檢測

這里,mu是上一步計算的平均值。

3. 現在,用這個概率公式計算每個訓練例子的概率。

使用Python進行異常檢測

不要被這個公式中的求和符號弄糊涂了!這實際上是Sigma代表方差。

稍后我們將實現該算法時,你將看到它的樣子。

4.我們現在需要找到概率的臨界值。正如我前面提到的,如果一個訓練例子的概率很低,那就是一個異常的例子。

低概率有多大?

這沒有普遍的限制。我們需要為我們的訓練數據集找出這個。

我們從步驟3中得到的輸出中獲取一系列概率值。對于每個概率,通過閾值的設置得到數據是否異常

然后計算一系列概率的精確度、召回率和f1分數。

精度可使用以下公式計算

使用Python進行異常檢測

召回率的計算公式如下:

使用Python進行異常檢測

在這里,True positives(真正例)是指算法檢測到一個異常的例子的數量,而它真實情況也是一個異常。

False Positives(假正例)當算法檢測到一個異常的例子,但在實際情況中,它不是異常的,就會出現誤報。

False Negative(假反例)是指算法檢測到的一個例子不是異常的,但實際上它是一個異常的例子。

從上面的公式你可以看出,更高的精確度和更高的召回率總是好的,因為這意味著我們有更多的真正的正例。但同時,假正例和假反例起著至關重要的作用,正如你在公式中看到的那樣。這需要一個平衡點。根據你的行業,你需要決定哪一個對你來說是可以忍受的。

一個好辦法是取平均數。計算平均值有一個獨特的公式。這就是f1分數。f1得分公式為:

使用Python進行異常檢測

這里,P和R分別表示精確性和召回率。

根據f1分數,你需要選擇你的閾值概率。

異常檢測算法

我將使用Andrew Ng的機器學習課程的數據集,它具有兩個訓練特征。我沒有在本文中使用真實的數據集,因為這個數據集非常適合學習。它只有兩個特征。在任何真實的數據集中,都不可能只有兩個特征。

首先,導入必要的包

  1. import pandas as pd  
  2. import numpy as np 

導入數據集。這是一個excel數據集。在這里,訓練數據和交叉驗證數據存儲在單獨的表中。所以,讓我們把訓練數據帶來。

  1. df = pd.read_excel('ex8data1.xlsx', sheet_name='X', header=None) 
  2. df.head() 
使用Python進行異常檢測

讓我們將第0列與第1列進行比較。

  1. plt.figure() 
  2. plt.scatter(df[0], df[1]) 
  3. plt.show() 
使用Python進行異常檢測

你可能通過看這張圖知道哪些數據是異常的。

檢查此數據集中有多少個訓練示例:

  1. m = len(df) 

計算每個特征的平均值。這里我們只有兩個特征:0和1。

  1. s = np.sum(df, axis=0
  2. mu = s/m 
  3. mu 

輸出:

  1. 0    14.112226 
  2. 1    14.997711 
  3. dtype: float64 

根據上面“公式和過程”部分中描述的公式,讓我們計算方差:

  1. vr = np.sum((df - mu)**2, axis=0
  2. variance = vr/m 
  3. variance 

輸出:

  1. 0    1.832631 
  2. 1    1.709745 
  3. dtype: float64 

現在把它做成對角線形狀。正如我在概率公式后面的“公式和過程”一節中所解釋的,求和符號實際上是方差

  1. var_dia = np.diag(variance) 
  2. var_dia 

輸出:

  1. array([[1.832631410.        ], 
  2.        [0.        , 1.70974533]]) 

計算概率:

  1. k = len(mu) 
  2. X = df - mu 
  3. p = 1/((2*np.pi)**(k/2)*(np.linalg.det(var_dia)**0.5))* np.exp(-0.5* np.sum(X @ np.linalg.pinv(var_dia) * X,axis=1)) 
使用Python進行異常檢測

訓練部分已經完成。

下一步是找出閾值概率。如果概率低于閾值概率,則示例數據為異常數據。但我們需要為我們的特殊情況找出那個閾值。

對于這一步,我們使用交叉驗證數據和標簽。

對于你的案例,你只需保留一部分原始數據以進行交叉驗證。

現在導入交叉驗證數據和標簽:

  1. cvx = pd.read_excel('ex8data1.xlsx', sheet_name='Xval', header=None) 
  2. cvx.head() 
使用Python進行異常檢測

標簽如下:

  1. cvy = pd.read_excel('ex8data1.xlsx', sheet_name='y', header=None) 
  2. cvy.head() 
使用Python進行異常檢測

我將把'cvy'轉換成NumPy數組,因為我喜歡使用數組。不過,數據幀也不錯。

  1. y = np.array(cvy) 

輸出:

  1. # 數組的一部分 
  2. array([[0], 
  3.        [0], 
  4.        [0], 
  5.        [0], 
  6.        [0], 
  7.        [0], 
  8.        [0], 
  9.        [0], 
  10.        [0], 

這里,y值0表示這是一個正常的例子,y值1表示這是一個異常的例子。

現在,如何選擇一個閾值?

我不想只檢查概率表中的所有概率。這可能是不必要的。讓我們再檢查一下概率值。

  1. p.describe() 

輸出:

  1. count    3.070000e+02 
  2. mean     5.905331e-02 
  3. std      2.324461e-02 
  4. min      1.181209e-23 
  5. 25%      4.361075e-02 
  6. 50%      6.510144e-02 
  7. 75%      7.849532e-02 
  8. max      8.986095e-02 
  9. dtype: float64 

如圖所示,我們沒有太多異常數據。所以,如果我們從75%的值開始,這應該是好的。但為了安全起見,我會從平均值開始。

因此,我們將從平均值和更低的概率范圍。我們將檢查這個范圍內每個概率的f1分數。

首先,定義一個函數來計算真正例、假正例和假反例:

  1. def tpfpfn(ep): 
  2.     tp, fp, fn = 000 
  3.     for i in range(len(y)): 
  4.         if p[i] <= ep and y[i][0] == 1
  5.             tp += 1 
  6.         elif p[i] <= ep and y[i][0] == 0
  7.             fp += 1 
  8.         elif p[i] > ep and y[i][0] == 1
  9.             fn += 1 
  10.     return tp, fp, fn 

列出低于或等于平均概率的概率。

  1. eps = [i for i in p if i <= p.mean()] 

檢查一下列表的長度

  1. len(eps) 

輸出:

  1. 133 

根據前面討論的公式定義一個計算f1分數的函數:

  1. def f1(ep): 
  2.     tp, fp, fn = tpfpfn(ep) 
  3.     prec = tp/(tp + fp) 
  4.     rec = tp/(tp + fn) 
  5.     f1 = 2*prec*rec/(prec + rec) 
  6.     return f1 

所有函數都準備好了!

現在計算所有epsilon或我們之前選擇的概率值范圍的f1分數。

  1. f = [] 
  2. for i in eps: 
  3.     f.append(f1(i)) 

輸出:

  1. [0.14285714285714285
  2.  0.14035087719298248
  3.  0.1927710843373494
  4.  0.1568627450980392
  5.  0.208955223880597
  6.  0.41379310344827586
  7.  0.15517241379310345
  8.  0.28571428571428575
  9.  0.19444444444444445
  10.  0.5217391304347826
  11.  0.19718309859154928
  12.  0.19753086419753085
  13.  0.29268292682926833
  14.  0.14545454545454545

這是f分數表的一部分。長度應該是133。

f分數通常在0到1之間,其中f1得分越高越好。所以,我們需要從剛才計算的f分數列表中取f的最高分數。

現在,使用“argmax”函數來確定f分數值最大值的索引。

  1. np.array(f).argmax() 

輸出:

  1. 131 

現在用這個索引來得到閾值概率。

  1. e = eps[131

輸出:

  1. 6.107184445968581e-05 

找出異常實例

我們有臨界概率。我們可以從中找出我們訓練數據的標簽。

如果概率值小于或等于該閾值,則數據為異常數據,否則為正常數據。我們將正常數據和異常數據分別表示為0和1,

  1. label = [] 
  2. for i in range(len(df)): 
  3.     if p[i] <= e: 
  4.         label.append(1
  5.     else
  6.         label.append(0
  7. label 

輸出:

  1. [0
  2.  0
  3.  0
  4.  0
  5.  0
  6.  0
  7.  0
  8.  0
  9.  0
  10.  0

這是標簽列表的一部分。

我將在上面的訓練數據集中添加此計算標簽:

  1. df['label'] = np.array(label) 
  2. df.head() 
使用Python進行異常檢測

我在標簽為1的地方用紅色繪制數據,在標簽為0的地方用黑色繪制。以下是結果。

使用Python進行異常檢測

有道理嗎?

是的,對吧?紅色的數據明顯異常。

結論

我試圖一步一步地解釋開發異常檢測算法的過程,我希望這是可以理解的。如果你僅僅通過閱讀就無法理解,建議你運行每一段代碼。那就很清楚了。

 

責任編輯:張燕妮 來源: 今日頭條
相關推薦

2018-05-08 14:25:22

Pythondlib人臉檢測

2021-03-31 11:20:57

PythonADTK異常檢測

2023-04-20 14:58:54

2023-04-12 08:00:00

人工智能ChatGPTPython

2021-02-22 13:44:41

開發Python金融

2023-10-18 09:00:00

人工智能異常檢測

2023-01-29 14:29:59

Python識別車牌

2010-01-27 15:29:45

C++異常處理

2021-03-28 23:03:50

Python程序員編碼

2021-09-27 16:39:10

PythonGif壓縮

2022-11-02 14:45:24

Python數據分析工具

2020-07-24 10:52:45

人工智能

2021-07-01 08:00:00

深度學習神經網絡架構

2025-01-06 07:15:00

深度學習動態圖異常檢測人工智能

2025-02-11 08:30:00

2024-11-27 16:06:12

2024-11-29 16:10:31

2024-11-21 15:24:49

2021-04-26 05:33:54

Python異步編程

2014-12-16 10:28:49

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品久久久久一区二区国产 | 91麻豆精品国产91久久久资源速度 | 99re6在线视频 | 91成人在线 | 亚洲成人日韩 | 国产激情三区 | 日日摸天天添天天添破 | 色免费看 | 亚洲天堂影院 | 91伊人| 亚洲最新在线视频 | caoporon| 天天躁日日躁狠狠躁白人 | 欧美v日韩v | 国产午夜精品一区二区三区四区 | 久久成人精品视频 | 超碰在线免费av | 日本视频免费 | 国产精品三级久久久久久电影 | 精品国产一区二区三区久久 | 亚洲欧美中文日韩在线v日本 | 久久久av中文字幕 | 国产成人福利视频 | 日韩精品中文字幕一区二区三区 | 亚洲一区二区三区在线视频 | 欧美激情一区 | 在线国产小视频 | 久久综合一区二区三区 | 成人在线视频免费观看 | 少妇性l交大片免费一 | 天堂网色 | 在线a视频网站 | 99re在线 | 国产精品久久久久久一区二区三区 | 久久综合伊人一区二区三 | 日本不卡一区 | 成人免费共享视频 | 中文在线一区 | 日韩欧美专区 | 日韩欧美三级电影在线观看 | 99精品视频一区二区三区 |