有監督學習——支援向量機、樸素貝葉斯分類

zh_jp發表於2023-03-15

1. 支援向量機

支援向量機(Support Vector Machine, SVM)最初被用來解決線性問題,加入核函式後能夠解決非線性問題。主要優點是能適應小樣本數量 高維度特徵的資料集,甚至是特徵維度數高於訓練樣本數的情況。

先介紹幾個概念:

  • 最優超平面Hyperplane,SVM透過學習資料空間中的超平面達到二值分類。在預測中,在超平面一側被認為是一個型別的資料,另一側被認為是另一種型別資料。

超平面在一維空間中是一個點;在二維中是一條線;三維中是一個平面。在更高維度只能描述為“超平面”。普通線性可分問題中,符合分類要求的超平面會有無窮多個。

  • 軟間隔Soft Margin,是為瞭解決因噪聲資料導致的過擬合,允許計算超平面時在訓練集上存在錯誤資料。

有時,在當下維度,無論如何都找不到合適的超平面分割兩類資料,這就是所謂的非線性問題。但是,任何有限維度的非線性問題在更高維度的空間裡總可以變換成線性可分問題

SVM可以拉格朗日乘子法(Lagrange Multiplier)實現對超平面求解問題的升維。透過拉格朗日乘子法將求超平面引數的目標轉換為用高維中資料點向量兩兩點積(dot-product)值求解二次規劃問題,SVM無須將所有訓練資料對映到高維空間,而只需要知道這些資料在高維空間裡的點積。

  • 核函式Kernel Function,輸入為兩個低維空間向量,輸出高維空間點積的函式。SVM選擇核函式既可以選擇一些通用核函式,也可以自定義。

核函式

一些常用的核函式如下:

  • 線性核(linear):直接返回輸入向量的點積,速度最快。因為實際並沒有升維,適合於本身特徵維度較高、樣本數量很大的場景。
  • 多項式核(ploynomial):\(k(p,q)=(p \cdot q+1)\times d\),其中超引數\(d\)是提升到的維度。
  • 高斯徑向基核(Gaussian radial basis function):\(k(p,q)=exp(-\gamma||p-q||^2)\),應用最廣泛的SVM核,\(\gamma\)引數值越大越容易擬合。
  • Sigmoid核:\(k(p,q)=tanh(a\times p\cdot q + r)\),其中\(tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}\)也是一種非線性核,有兩個超引數\(a\)\(r\)可以調整。

scikit-learn中的SVM

在sklearn.svm中提供了三種分類/迴歸封裝類。

  • SVC/SVR:最普通的SVM分類器/迴歸器,可透過kernel引數設定使用的核函式,使用C引數配置鬆弛因子。
  • NuSVC/NuSVR:帶有nu引數的分類器/迴歸器,nu引數的作用與C引數類似,都是用來配置模型對訓練資料的擬合程度的。
  • LinearSVC/LinearSVR:使用liblinear庫的線性核函式分類器/迴歸器,其在模型中加入了線性迴歸懲罰引數。

    以SVC類為例:
from sklearn import svm # 引入SVM包
X = [[0, 0], [2, 2]]    # 訓練資料
y = [1, 2]
clf = svm.SVC(kernel='rbf') # 初始化使用徑向基核分類器
clf.fit(X, y)   # 訓練
t = [[2, 1], [0, 1]]    # 測試集
clf.predict(t)
# array([2, 1])

clf.decision_function(t)
# array([ 0.52444566, -0.52444566])

訓練和預測方法與之前的模型差別較小,注意decision_function()函式,他返回的是輸入的資料集與模型超平面之間的距離,正負關係表示超平面的哪一測,另外,距離絕對值越大則分類的可靠性越高。

名稱 解釋 SVC/SCR NuSVC/NuSVR LinearSVC/LinearSVR
C 鬆弛因子,取值\(0\)~\(\infin\)
kernel 取值"linear" "poly" "rbf" "sigmoid"等
gamma "ploy" "rbf" "sigmoid" 三種核的超引數
tol SMO演演算法中的停止閾值
nu 取值0~1,控制對訓練資料的擬合程度
penalty 線性模型懲罰項,"l1"或"l2"

2. 樸素貝葉斯分類

樸素貝葉斯(Naive Bayes)是一種非常簡單的分類演演算法。優點在於可以對預測標籤給出理論上完美的可能性估計,但要求資料多維特徵之間相互獨立。

基礎機率

  • 機率值常用\(P\)表示,古典機率取值範圍為[0,1],e.g.事件A一定不會發生,則有機率\(P(A)=0\)
  • 條件機率:用\(P(A|B)\)表達,意為:若發生B,發生A的機率為多少。
  • 聯合機率:表示兩件事同時發生的機率,表示式包括:\(P(AB)\)\(P(A,B)\)\(P(A\bigcap B)\)。意為:事件A、B同時發生的機率為多少。
  • 事件之間並的機率:\(P(A\bigcup B)\),意為:事件A或B至少一個事件發生的機率。
  • 加法原理:\(P(A\bigcup B)=P(A)+P(B)-P(A\bigcap B)\)
  • 乘法原理:\(P(A\bigcap B)=P(B)\cdot P(A|B)=P(A)\cdot P(B|A)\)
  • 兩事件獨立的充分必要條件:\(P(A\bigcap B)=P(A)\cdot P(B)\),即事件B發生對事件A是否沒有任何影響,即\(P(A|B)=P(A)\),反之亦然。
  • 貝葉斯定理:\(P(A|B)=\frac{P(A)P(B|A)}{P(B)}\),其中:
    • \(P(A|B)\):後驗機率,是指在得到“結果”的資訊後重新修正的機率,是“執果尋因”問題中的"果"。例如,如果我們從紅色盒子和藍色盒子中隨機抽取一個水果,發現是蘋果,那麼這個蘋果來自藍色盒子的機率就是一個後驗機率。
    • \(P(A)\):先驗機率,是指根據以往經驗和分析得到的機率,如全機率公式。它是在實驗或取樣前就可以得到的機率。例如,我們知道骰子每個面出現的機率都是1/6,這就是一個先驗機率。
    • \(P(B|A)\):似然度,是用來度量模型和資料之間的相似度的一個函式。它是給定模型引數下,觀察到資料的機率。例如,如果我們假設硬幣朝上的機率是p,那麼拋5次看到3次朝上的似然度就是\(L(p) = C(5,3) * p^3 * (1-p)^2\)
    • \(P(B)\):標準化常量,是貝葉斯公式中的一個分母,用來保證後驗機率的和為1。它等於全機率公式的結果,即所有可能的原因導致結果的機率之和。

舉例講解下貝葉斯定理的使用:

有兩個袋子:

  • a袋:4個紅球,3個綠球,3個黃球
  • b袋:2個紅球,7個綠球,11個黃球

任取一袋,再從中取出一顆巧克力發現其為紅色,那麼它來自a的機率是多少?

根據問題定義:

  • 事件A:取到a袋
  • 事件B:取到紅球

計算貝葉斯定理中的各項:

  • 先驗機率:取到a袋的機率,\(P(A)=\frac{1}{2}\)
  • 似然度:在a袋中取紅球的機率\(P(B|A)=\frac{4}{4+3+3}=\frac{2}{5}\)
  • 標準化常量:即取紅球的機率,取到紅球的=取a袋中的紅球的機率+取b袋中的紅球的機率,\(P(B)=\frac{1}{2}\times \frac{4}{10}+\frac{1}{2}\times\frac{2}{20}=\frac{1}{4}\)
  • 後驗機率(最後的答案):\(P(A|B)=\frac{P(A)P(B|A)}{P(B)}=\frac{(1/2)\times(2/5)}{1/4}=\frac{4}{5}\)

貝葉斯分類原理

在有監督學習中,樸素貝葉斯定義公式\(P(A|B)=\frac{P(A)P(B|A)}{P(B)}\)中的事件\(A\)看成被分類標籤,事件\(B\)看成資料特徵。通常資料特徵是\(n\)維的,因此\(P(B)\)演變為\(n\)個特徵的聯合機率,因此在機器學習中,貝葉斯公式為:

\[P(y|x_1,x_2...x_n)=\frac{P(y)P(x_1,x_2,...x_n|y)}{P(x_1,x_2,...x_n)} \]

\(x_1,x_2,...x_n\)是資料的\(n\)維特徵,\(y\)是預測標籤。

  1. 預測:在給定特徵情況下,使用貝葉斯公式計算每個標籤的後驗機率。最後獲得最高機率的標籤便是預測標籤。此外,不僅是最可能的標籤,也能給出其他標籤的機率。
  2. 訓練:對於訓練來說關注的是貝葉斯公式中右側的先驗機率和似然度。
    • 先驗機率:可由訓練者根據經驗直接給出,也可自動計算:統計訓練資料中每個標籤的出現次數,除以訓練總數就可直接得到每個標籤的先驗機率\(P(y)\)
    • 似然度:假定\(n\)維特徵的條件機率符合某種聯合分佈,根據訓練樣本估計該分佈的引數。比如對於高斯分佈來說,學習引數有期望值和方差。
  3. 獨立假設:樸素貝葉斯假設所有\(n\)維特徵之間是相互獨立的(所以叫naive)。這簡化了計算難度,事件獨立性的充分必要條件有:

\[P(x_1,x_2,...x_n)=P(x_1)\times P(x_2)\times...\times P(x_n) \]

似然函式為:

\[P(x_1,x_2,...x_n|y)=P(x_1|y)\times P(x_2|y)\times...\times P(x_n|y) \]

高斯樸素貝葉斯(Gaussian Naive Bayes)

高斯樸素貝葉斯使用的高斯分佈就是常說的正態分佈,假定所有特徵條件分佈符合:

\[P(x_i|y) = \frac{1}{\sqrt{2\pi\sigma_y^2}}\exp\left(-\frac{(x_i - \mu_y)^2}{2\sigma_y^2}\right) \]

其中\(\mu_y\)\(\sigma_y\)被學習的模型引數特徵期望值和方差。

from sklearn import datasets    # scikit-learn資料資料庫
iris = datasets.load_iris()

from sklearn.naive_bayes import GaussianNB  # 引入高斯樸素貝葉斯模型
gnb = GaussianNB()  # 初始化模型物件
gnb.fit(iris.data, iris.target) # 訓練

gnb.class_prior_    # 檢視模型先驗機率
# array([0.33333333, 0.33333333, 0.33333333]) # 有三種標籤,先驗機率各自為1/3

gnb.class_count_    # 檢視訓練集標籤數量
# array([50., 50., 50.])    # 訓練集每種標籤有50個樣本

# 由於資料有四維特徵,且有三種標籤,因此訓練後產生3*4=12個高斯模型
gnb.theta_ # 檢視高斯模型期望值
# array([[5.006, 3.428, 1.462, 0.246],
#        [5.936, 2.77 , 4.26 , 1.326],
#        [6.588, 2.974, 5.552, 2.026]])

gnb.var_  # 檢視高斯模型方差
# array([[0.121764, 0.140816, 0.029556, 0.010884],
#        [0.261104, 0.0965  , 0.2164  , 0.038324],
#        [0.396256, 0.101924, 0.298496, 0.073924]])

多項式樸素貝葉斯(Multinomial Naive Bayes)

多項式樸素貝葉斯是用多項分佈(Multinomial Distribution)作為似然度機率模型的分類器。衡量的是特徵在不同標籤之間的分佈比例關係,因此特別適合文字分類場景(每個單詞在不同型別文章中有一定的分佈比例)。

多項式分佈的概念:假設某件事件的結果有\(k\)種可能,在實驗了\(n\)次之後,每種結果出現了若干。

多項式便是用於描述在試驗了\(n\)次之後每種結果發生次數機率的分佈。

e.g.普通的骰子有6面,擲骰子的結果便是\(k=6\)的多項式分佈。

scikit-learn中的MultinomialNB實現了多項式樸素貝葉斯,使用與高斯樸素貝葉斯相似。

伯努利樸素貝葉斯(Bernoulli Naive Bayes)

伯努利貝葉斯使用伯努利分佈(Bernoulli Distribution),所謂伯努利分佈也稱二值分佈,用來描述一次實驗只可能出現兩種結果的事件機率分佈。在學習該模型中要求資料中的所有特徵都是布林/二值型別。貝葉斯公式中第\(i\)個特徵的似然度:

\[P(x_i|y)=P(i|y)x_i+(1-P(i|y))(1-x_i) \]

其中\(P(i|y)\)是第\(i\)個特徵在所有該標籤訓練資料中出現的比。

from sklearn.naive_bayes import BernoulliNB
# 引數binarize是一個閾值,將非二值轉化為二值
clf = BernoulliNB(binarize=1) # 設定特徵閾值為1

X = [[0.3, 0.2], [1.3, 1.2], [1.1, 1.2]]
Y = [0, 1, 1]
clf.fit(X, Y)   # 訓練
clf.predict([[0.99, 0.99]])   # 預測
# array([0])

由於閾值為1的緣故,特徵[0.99, 0.99]被認為與[0.3, 0.2]一類,而不是與在數值上與[1.1, 1.2]為同一類標籤。

參考文獻

[1]劉長龍. 從機器學習到深度學習[M]. 1. 電子工業出版社, 2019.3.

相關文章