一、oneclasssvm算法
oneclasssvm是一種無監督學習方法,用來進行異常檢測。它的主要思想是將正常數據視為一種分類,並試圖尋找一個邊界,使得所有異常數據點都位於該邊界的外部。
在實際應用中,我們很難獲得完整的異常數據點,因此,oneclasssvm的目的就是在沒有異常數據點的情況下,學習到正常數據的分佈,並進一步將新數據分為正常或異常數據。
oneclasssvm算法的輸出結果在分類問題中通常表示分類的概率,但是在異常檢測問題中,它表示離該決策邊界的距離。因此,輸出結果越大,表明越可能是一個異常點。
二、oneclasssvm輸出概率
在oneclasssvm中,輸出的結果是輸入數據點到決策邊界的距離。如果該距離為負值,則該數據點被視為異常數據;如果該距離為正值,則該數據點被視為正常數據。
不過在實際應用中,我們可能會更關心分類的概率。這時,我們需要進行如下轉換:
# 計算分類概率
decision_func = clf.decision_function(X_test)
prob = np.exp(-decision_func) / np.sum(np.exp(-decision_func))
# 輸出結果
print(prob)
通過上述代碼,我們可以將距離轉換為概率輸出。其中,exp()函數用於計算指數,sum()函數用於計算均值。
三、oneclasssvm論文
oneclasssvm最初由Schölkopf和Platt在1999年提出,其論文題為”Support Vector Method for Novelty Detection”.
在該論文中,作者提出了一種新的分類方法,稱為支持向量機(SVM)。該方法採用一個非常小的核函數(例如徑向基函數),生成一個高維空間,使得正常數據在該空間中形成一個超球體。因此,新數據點到該超球體的距離即為其分類距離。
後續研究發現,不同的核函數可能對結果產生不同的影響,並且該算法存在一定的缺點。因此,該算法的改進研究仍在進行中。
四、oneclasssvm概率
在oneclasssvm中,分類概率是一個非常重要的概念,因為它可以告訴我們每個數據點被分類為正常或異常的可能性。
在sklearn庫中,我們可以使用predict_proba()函數來計算每個數據點被分類為正常或異常的概率。
# 計算分類概率
pred_prob = clf.predict_proba(X_test)
# 輸出結果
print(pred_prob)
通過上述代碼,我們可以很方便地獲得分類概率。不過需要注意的是,該函數對於oneclasssvm算法而言並不是一個標準的函數,因此在實際應用中需要謹慎使用。
五、oneclasssvm控制限
在oneclasssvm中,我們不僅需要考慮如何找到正常數據和異常數據的邊界,還需要考慮如何設定一個控制限,來確保被識別的異常數據點的數量不超過某個閾值。
為此,我們可以使用nu參數進行控制,它表示異常數據點的最大比例。同時,我們還可以使用gamma參數來控制核函數的寬度,從而進一步精細化分類結果。
# 設定控制限和核函數寬度
clf = svm.OneClassSVM(kernel='rbf', nu=0.1, gamma=0.1)
# 訓練模型
clf.fit(X_train)
# 預測結果
y_pred = clf.predict(X_test)
# 輸出結果
print(y_pred)
六、oneclasssvm參數調節
在oneclasssvm中,我們還需要調節一些參數,來優化分類效果。
其中,nu是一個非常重要的參數,它表示異常數據點的最大比例。如果該值過小,則會忽略一些異常數據點,從而影響分類結果,如果該值過大,則會將一些正常數據點誤判為異常數據點。
除此之外,我們還可以調節gamma參數,來控制核函數寬度。該參數越大,則核函數越窄,從而會導致模型更加敏感。
# 設定nu和gamma參數
nu = 0.1
gamma = 0.1
# 訓練模型
clf = svm.OneClassSVM(kernel='rbf', nu=nu, gamma=gamma)
clf.fit(X_train)
# 預測結果
y_pred = clf.predict(X_test)
# 輸出結果
print(y_pred)
七、oneclasssvm異常檢測
如果我們要檢測異常數據點,並進行分類,則可以使用oneclasssvm算法。
其中,nu參數用於控制異常數據點的最大比例,gamma參數用於調節核函數寬度。
# 訓練模型
clf = svm.OneClassSVM(kernel='rbf', nu=0.1, gamma=0.1)
clf.fit(X_train)
# 預測結果
y_pred = clf.predict(X_test)
# 輸出結果
print(y_pred)
八、oneclasssvm異常檢測 實現
為了進行異常檢測,我們需要先獲得一些正常數據和異常數據。
# 導入模塊
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_moons
# 生成數據集
X, y = make_moons(n_samples=300, noise=0.1, random_state=0)
# 獲得正常數據和異常數據
X_train = X[:200]
X_test = X[200:]
通過上述代碼,我們可以生成一些月牙形的數據點,並將前200個數據點視為正常數據,後100個數據點視為異常數據。
接下來,我們可以使用oneclasssvm算法來進行異常檢測。
# 訓練模型
clf = svm.OneClassSVM(kernel='rbf', nu=0.1, gamma=0.1)
clf.fit(X_train)
# 預測結果
y_pred = clf.predict(X_test)
# 輸出異常數據點
print(X_test[y_pred == -1])
通過上述代碼,我們可以輸出所有被oneclasssvm算法識別為異常數據點的數據點。
九、代碼示例
# 導入模塊
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_moons
# 生成數據集
X, y = make_moons(n_samples=300, noise=0.1, random_state=0)
# 獲得正常數據和異常數據
X_train = X[:200]
X_test = X[200:]
# 訓練模型
clf = svm.OneClassSVM(kernel='rbf', nu=0.1, gamma=0.1)
clf.fit(X_train)
# 預測結果
y_pred = clf.predict(X_test)
# 輸出異常數據點
print(X_test[y_pred == -1])
原創文章,作者:MDXJ,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/143579.html
微信掃一掃
支付寶掃一掃