1. 程式人生 > 實用技巧 >基於SVM的異常檢測方法

基於SVM的異常檢測方法

作者|Mahbubul Alam
編譯|VK
來源|Towards Data Science

單類支援向量機簡介

作為機器學習方面的專家或新手,你可能聽說過支援向量機(SVM)——一種經常被引用和用於分類問題的有監督的機器學習演算法。

支援向量機使用多維空間中的超平面來分離一類觀測值和另一類觀測值。當然,支援向量機被用來解決多類分類問題。

然而,支援向量機也越來越多地應用於一類問題,即所有的資料都屬於一個類。在這種情況下,演算法被訓練成學習什麼是“正常的”,這樣當一個新的資料被顯示時,演算法可以識別它是否應該屬於正常的。如果沒有,新資料將被標記為異常或異常。要了解更多關於單類支援向量機的資訊,請檢視Roemer Vlasveld的這篇長篇文章:

http://rvlasveld.github.io/blog/2013/07/12/introduction-to-one-class-support-vector-machines/

最後要提到的是,如果你熟悉sklearn庫,你會注意到有一種演算法專門為所謂的“新穎性檢測”而設計。它的工作方式與我剛才在使用單類支援向量機的異常檢測中描述的方法類似。在我看來,只是上下文決定了是否將其稱為新穎性檢測或異常值檢測或諸如此類的名稱。

下面是Python程式語言中單類支援向量機的簡單演示。請注意,我交替使用離群值和異常值。


步驟1:匯入庫

對於這個演示,我們需要三個核心庫-用於資料爭拗的python和numpy,用於模型構建sklearn和視覺化matlotlib。

# 匯入庫
import pandas as pd
from sklearn.svm import OneClassSVM
import matplotlib.pyplot as plt
from numpy import where

步驟2:準備資料

我使用的是來自線上資源的著名的Iris資料集,因此你可以練習使用,而不必擔心如何從何處獲取資料。

# 匯入資料
data = pd.read_csv("https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv")

# 輸入資料
df = data[["sepal_length", "sepal_width"]]

步驟3:模型

與其他分類演算法中的超引數調整不同,單類支援向量機使用nu作為超引數,用來定義哪些部分的資料應該被分類為異常值。nu=0.03表示演算法將3%的資料指定為異常值。

# 模型引數
model = OneClassSVM(kernel = 'rbf', gamma = 0.001, nu = 0.03).fit(df)

步驟4:預測

預測的資料集將有1或-1值,其中-1值是演算法檢測到的異常值。

# 預測
y_pred = model.predict(df)
y_pred

步驟5:過濾異常

# 過濾異常值索引
outlier_index = where(y_pred == -1) 

# 過濾異常值
outlier_values = df.iloc[outlier_index]
outlier_values

步驟6:視覺化異常

# 視覺化輸出
plt.scatter(data["sepal_length"], df["sepal_width"])
plt.scatter(outlier_values["sepal_length"], outlier_values["sepal_width"], c = "r")

紅色的資料點是離群值

總結

在本文中,我想對一類支援向量機(One-classsvm)做一個簡單的介紹,這是一種用於欺詐/異常/異常檢測的機器學習演算法。

我展示了一些構建直覺的簡單步驟,但是當然,一個真實的實現需要更多的實驗來找出在特定的環境和行業中什麼是有效的,什麼是不起作用的。

原文連結:https://towardsdatascience.com/support-vector-machine-svm-for-anomaly-detection-73a8d676c331

歡迎關注磐創AI部落格站:
http://panchuang.net/

sklearn機器學習中文官方文件:
http://sklearn123.com/

歡迎關注磐創部落格資源彙總站:
http://docs.panchuang.net/