One Class SVM 對於樣本不均衡處理思路——拿出白樣本建模,算出outlier,然后用黑去檢驗效果


One Class SVM 是指你的training data 只有一類positive (或者negative)的data, 而沒有另外的一類。在這時,你需要learn的實際上你training data 的boundary。而這時不能使用 maximum margin 了,因為你沒有兩類的data。 所以呢,在這邊文章中,“Estimating the support of a high-dimensional distribution”, Schölkopf 假設最好的boundary要遠離feature space 中的原點。
左邊是在original space中的boundary,可以看到有很多的boundary 都符合要求,但是比較靠譜的是找一個比較 緊(closeness) 的boundary (紅色的)。這個目標轉換到feature space 就是找一個離原點比較遠的boundary,同樣是紅色的直線。當然這些約束條件都是人為加上去的,你可以按照你自己的需要采取相應的約束條件。比如讓你data 的中心離原點最遠。
這些都是我個人的理解,我不是專門研究machine learning的。如有不妥之處,還望指出。

 

1、sklearn中關於異常檢測的說法
Novelty and Outlier Detection:

         Many applications require being able to decide whether a new observation belongs to the same distribution as existing observations (it is an inlier), or should be considered as different (it is an outlier). Often, this ability is used to clean real data sets. Two important distinction must be made:

novelty detection:
         The training data is not polluted by outliers, and we are interested in detecting anomalies in new observations.
outlier detection:
         The training data contains outliers, and we need to fit the central mode of the training data, ignoring the deviant observations.

也就是說主要方法有兩種:

         1)、novelty detection:當訓練數據中沒有離群點,我們的目標是用訓練好的模型去檢測另外新發現的樣本;
         2)、outlier detection:當訓練數據中包含離群點,模型訓練時要匹配訓練數據的中心樣本,忽視訓練樣本中的其它異常點;

         sklearn提供了一些機器學習方法,可用於奇異(Novelty )點或異常(Outlier)點檢測,包括OneClassSVM、Isolation Forest、Local Outlier Factor (LOF) 等。其中OneClassSVM可用於Novelty Detection,而后兩者可用於Outlier Detection。

2、OneClassSVM(Unsupervised Outlier Detection)
2.1、關於一類SVM的形象解釋:
作者:知乎用戶
鏈接:https://www.zhihu.com/question/22365729/answer/115048306
        最近因為做到異常行為檢測、劇烈運動分析方面的任務,接觸到了一類svm,盡我所能的介紹下我掌握的知識吧。先舉個例子。比方說,我們要判斷一張照片里的人臉,是男性還是女性,這是個二分類問題。對於一張未知性別的人臉,經過svm分類器分類(經典的二分類svm),我們會給出他\她是男性or不是男性的結果(不是男性就是女性啦,暫時不考慮第三性別,O(∩_∩)O~;為什么這么表達,是因為為了與下面的一類svm概念做區別)。那么經典svm訓練的方式呢,就是將一堆已標注了男女性別的人臉照片(假設男性是正樣本,女性是負樣本),提取出有區分性別的特征(假設這種能區分男女性別的特征已構建好)后,通過svm中的支持向量,找到這男女兩類性別特征點的最大間隔。進而在輸入一張未知性別的照片后,經過特征提取步驟,就可以通過這個訓練好的svm很快得出照片內人物的性別,此時我們得出的結論,我們知道要么是男性,不是男性的話,那一定是女性。以上情況是假設,我們用於訓練的樣本,包括了男女兩類的圖片,並且兩類圖片的數目較為均衡。現實生活中的我們也是這樣,我們只有在接觸了足夠多的男生女生,知道了男生女生的性別特征差異后(比方說女性一般有長頭發,男性一般有胡子等等),才能准確判斷出這個人到底是男是女。但如果有一個特殊的場景,比方說,有一個小和尚,他從小在寺廟長大,從來都只見過男生,沒見過女生,那么對於一個男性,他能很快地基於這個男性與他之前接觸的男性有類似的特征,給出這個人是男性的答案。但如果是一個女性,他會發現,這個女性與他之前所認知的男性的特征差異很大,進而會得出她不是男性的判斷。注意咯,這里所說的 “她不是男性” 的判斷,與我們使用二分類svm中所說的 “不是男性” 的判斷,雖然結論相同,但卻不是同一個概念。 我們在使用經典二分類svm去分類人臉性別時,當我們判定未知樣本不是男性時,我們會同時得到她是個女性的結論(因為我們是知道另一類,也即女性類別的),但對於以上介紹的特殊場景,我們只能根據它與小和尚認知的男性特征不一致,得出它不是男性的判斷,至於它是女性呢,還是第三性別,甚至是外星人,對不起,並不知道,我們只能將其排除出男性的范圍,並不能給它做出屬於哪類的決策。以上場景就是一類svm的典型應用場景,當出現一個分類問題中,只有一種類型的樣本,或有兩種類型樣本,但其中一類型樣本數目遠少於另一類型樣本數目(如果此時采用二分類器,training set中正負樣本不均衡,可能造成分類器過於偏向數目多的樣本類別,使train出來的model有bias)時,就可以考慮使用一類svm進行分類。再舉例子到異常行為檢測上,比方說,在銀行存取款大廳,正常情況大家都是在坐席耐心叫號等待,抑或取號,在櫃台接受服務等。這些行為雖然各有不同,但卻都會有比較相類似的特征,例如都會有比較一致性的運動方向(比如說,正常走動,取號,排隊等),不是很大的運動幅度等,但對於一些異常行為,比如說銀行大廳內的打斗、斗毆,搶劫等,你不能要求這些行為也按套路出牌,如武俠片里先擺pos、再出腳,最后再手上各種招式,正是因為這些異常行為無法有效度量。我們就可以將一類svm應用於其中,比方說,我們提取出人類在銀行的正常行為操作的特征,並使用一類svm將之正確表達,那么對於一個異常行為,我們可以很快得出,這貨提取的特征和我這個分類器包含的特征不一致,那么它肯定就不是正常的行為特征,那么就可以發出報警了。以上就是我口語表達的一類svm分類器的介紹,有很多不嚴謹的地方,望海涵。

2.2、OneClassSVM主要參數和方法

class sklearn.svm.OneClassSVM(kernel=’rbf’, degree=3, gamma=’auto’, coef0=0.0, tol=0.001, nu=0.5, shrinking=True, cache_size=200, verbose=False, max_iter=-1, random_state=None)

參數:

          kernel:核函數(一般用高斯核)

          nu:設定訓練誤差(0, 1]

方法:

          fit(x):訓練,根據訓練樣本和上面兩個參數探測邊界。(注意是無監督哦!)

          predict(x):返回預測值,+1就是正常樣本,-1為異常樣本。

         decision_function(X):返回各樣本點到超平面的函數距離(signed distance),正的為正常樣本,負的為異常樣本。

2.3、OneClassSVM官方實例

#!/usr/bin/python
# -*- coding:utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager
from sklearn import svm

xx, yy = np.meshgrid(np.linspace(-5, 5, 500), np.linspace(-5, 5, 500))
# Generate train data
X = 0.3 * np.random.randn(100, 2)
X_train = np.r_[X + 2, X - 2]
# Generate some regular novel observations
X = 0.3 * np.random.randn(20, 2)
X_test = np.r_[X + 2, X - 2]
# Generate some abnormal novel observations
X_outliers = np.random.uniform(low=-4, high=4, size=(20, 2))

# fit the model
clf = svm.OneClassSVM(nu=0.1, kernel="rbf", gamma=0.1)
clf.fit(X_train)
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)
y_pred_outliers = clf.predict(X_outliers)
n_error_train = y_pred_train[y_pred_train == -1].size
n_error_test = y_pred_test[y_pred_test == -1].size
n_error_outliers = y_pred_outliers[y_pred_outliers == 1].size

# plot the line, the points, and the nearest vectors to the plane
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.title("Novelty Detection")
plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), 0, 7), cmap=plt.cm.PuBu) #繪制異常樣本的區域
a = plt.contour(xx, yy, Z, levels=[0], linewidths=2, colors='darkred') #繪制正常樣本和異常樣本的邊界
plt.contourf(xx, yy, Z, levels=[0, Z.max()], colors='palevioletred') #繪制正常樣本的區域
s = 40
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white', s=s, edgecolors='k')
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='blueviolet', s=s,
edgecolors='k')
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='gold', s=s,
edgecolors='k')
plt.axis('tight')
plt.xlim((-5, 5))
plt.ylim((-5, 5))
plt.legend([a.collections[0], b1, b2, c],
["learned frontier", "training observations",
"new regular observations", "new abnormal observations"],
loc="upper left",
prop=matplotlib.font_manager.FontProperties(size=11))
plt.xlabel(
"error train: %d/200 ; errors novel regular: %d/40 ; "
"errors novel abnormal: %d/40"
% (n_error_train, n_error_test, n_error_outliers))
plt.show()
結果:

 

3、總結
         1、嚴格地講,OneClassSVM不是一種outlier detection方法,而是一種novelty detection方法:它的訓練集不應該摻雜異常點,因為模型可能會去匹配這些異常點。 但在數據維度很高,或者對相關數據分布沒有任何假設的情況下,OneClassSVM也可以作為一種很好的outlier detection方法。

         2、其實在分類問題中,當兩類樣本及其不平衡時,也可以將個數比例極小的那部分當做異常點來處理,從另外一種角度來完成分類任務!

4、參考文獻:
1、http://scikit-learn.org/stable/modules/outlier_detection.html#outlier-detection
---------------------
作者:夕陽下江堤上的男孩
來源:CSDN
原文:https://blog.csdn.net/YE1215172385/article/details/79750703
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

 

 

補充:

機器學習中,(高斯徑向基函數英語:Radial basis function kernel),或稱為RBF核,是一種常用的核函數。它是支持向量機分類中最為常用的核函數。[1]

關於兩個樣本xx'的RBF核可表示為某個“輸入空間”(input space)的特征向量,它的定義如下所示:[2]

{\displaystyle K(\mathbf {x} ,\mathbf {x'} )=\exp \left(-{\frac {||\mathbf {x} -\mathbf {x'} ||_{2}^{2}}{2\sigma ^{2}}}\right)}K({\mathbf  {x}},{\mathbf  {x'}})=\exp \left(-{\frac  {||{\mathbf  {x}}-{\mathbf  {x'}}||_{2}^{2}}{2\sigma ^{2}}}\right)

{\displaystyle \textstyle ||\mathbf {x} -\mathbf {x'} ||_{2}^{2}}\textstyle ||{\mathbf  {x}}-{\mathbf  {x'}}||_{2}^{2}可以看做兩個特征向量之間的平方歐幾里得距離{\displaystyle \sigma }\sigma 是一個自由參數。一種等價但更為簡單的定義是設一個新的參數{\displaystyle \gamma }\gamma ,其表達式為{\displaystyle \textstyle \gamma ={\tfrac {1}{2\sigma ^{2}}}}{\displaystyle \textstyle \gamma ={\tfrac {1}{2\sigma ^{2}}}}

{\displaystyle K(\mathbf {x} ,\mathbf {x'} )=\exp(-\gamma ||\mathbf {x} -\mathbf {x'} ||_{2}^{2})}{\displaystyle K(\mathbf {x} ,\mathbf {x'} )=\exp(-\gamma ||\mathbf {x} -\mathbf {x'} ||_{2}^{2})}

因為RBF核函數的值隨距離減小,並介於0(極限)和1(當x = x'的時候)之間,所以它是一種現成的相似性度量表示法。[2] 核的特征空間有無窮多的維數;對於{\displaystyle \sigma =1}\sigma =1,它的展開式為:[3]

{\displaystyle \exp \left(-{\frac {1}{2}}||\mathbf {x} -\mathbf {x'} ||_{2}^{2}\right)=\sum _{j=0}^{\infty }{\frac {(\mathbf {x} ^{\top }\mathbf {x'} )^{j}}{j!}}\exp \left(-{\frac {1}{2}}||\mathbf {x} ||_{2}^{2}\right)\exp \left(-{\frac {1}{2}}||\mathbf {x'} ||_{2}^{2}\right)}\exp \left(-{\frac  {1}{2}}||{\mathbf  {x}}-{\mathbf  {x'}}||_{2}^{2}\right)=\sum _{{j=0}}^{\infty }{\frac  {({\mathbf  {x}}^{\top }{\mathbf  {x'}})^{j}}{j!}}\exp \left(-{\frac  {1}{2}}||{\mathbf  {x}}||_{2}^{2}\right)\exp \left(-{\frac  {1}{2}}||{\mathbf  {x'}}||_{2}^{2}\right)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM