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的。若有不妥之處,還望指出。php

 

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

         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:python

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.app

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

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

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

二、OneClassSVM(Unsupervised Outlier Detection)
2.一、關於一類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.二、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)ui

參數:

          kernel:核函數(通常用高斯核)

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

方法:

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

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

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

2.三、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()
結果:

 

三、總結
         一、嚴格地講,OneClassSVM不是一種outlier detection方法,而是一種novelty detection方法:它的訓練集不該該摻雜異常點,由於模型可能會去匹配這些異常點。 但在數據維度很高,或者對相關數據分佈沒有任何假設的狀況下,OneClassSVM也能夠做爲一種很好的outlier detection方法。

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

四、參考文獻:
一、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)
相關文章
相關標籤/搜索