1. 程式人生 > 實用技巧 >李巨集毅機器學習筆記3:Classification

李巨集毅機器學習筆記3:Classification

Notes

1.questions


  • Q:多分類問題為什麼不可以直接當作迴歸問題?

  • A:類別1變成數值1,類別2變成數值2,類別3變成數值3……暗示類別1與類別2比較接近,與類別3比較遠,實際上並無此關係。
    當然,確實有將多分類當做迴歸來解的模型(感知機,SVM等),但是需要修改損失函式。


  • Q:為什麼是生成模型?
  • A:假設資料遵循一個均值為μ \muμ、協方差矩陣為Σ \SigmaΣ的高斯分佈。利用從高斯分佈中生成資料的概率,即似然(likelihood),來估計P ( x ∣ C 1 ) 從類別C 1中任取一個樣本,它是x的概率)

  • Q:為什麼要假設資料的分佈是高斯分佈?
  • A:你可以假設任意你喜歡的分佈,比如二元分類,可以假設伯努利分佈。高斯分佈比較簡單,引數也比較少(每個類別的高斯分佈都共享協方差矩陣Σ)。

  • Q:為什麼不同類別要共享協方差矩陣Σ ?
  • A:如果每個類別i 都有一個協方差矩陣Σ i 那麼一方面,variance過大,容易過擬合,另一方面,共享協方差矩陣可以減少引數個數。

2. 分類問題的三個步驟

  1. 定義模型集合
    樣本x屬於類別1的概率(後驗):

  1. 定義損失函式(LOSS)來評價模型好壞。
    假設高斯分佈,利用已有的資料,求得μ ,Σ 。
    最大化評價引數好壞的指標,即極大似然估計L(μ,Σ)。
  1. 找到最好的模型
    最佳引數就是每個類別中,所有樣本點的均值和協方差。
    u ∗ , Σ ∗ = arg ⁡ max ⁡ u , Σ L ( u , Σ ) u^*,\Sigma^*=\arg \max\limits_{u,\Sigma} L(u,\Sigma) \\
    u,Σ=argu,ΣmaxL(u,Σ)

    u ∗ = 1 n ∑ i = 0 n x i Σ ∗ = 1 n ∑ i = 0 n ( x i − u ∗ ) ( x i − u ∗ ) T u^*=\frac{1}{n}\sum\limits_{i=0}^n x^i \ \ \ \ \Sigma^*=\frac{1}{n}\sum\limits_{i=0}^n (x^i-u^*)(x^i-u^*)^T u=n1i=0nxiΣ=n1i=0n(xiu)(xiu)T
    注1:均值是每個類別單獨求出的。
    注2:協方差先每個類別單獨求出,然後共享的協方差為所有協方差的加權平均值Σ ∗

3. Sigmoid函式推導

在這裡插入圖片描述

在這裡插入圖片描述



Classification: Probabilistic Generative Model

Classification

概念描述

分類問題是找一個function,它的input是一個object,它的輸出是這個object屬於哪一個class

輸入數值化

對於寶可夢的分類問題來說,我們需要解決的第一個問題就是,怎麼把某一隻寶可夢當做function的input?

要想把一個東西當做function的input,就需要把它數值化

特性數值化:用一組數字來描述一隻寶可夢的特性



How to classification

Training data for Classification
可以把分類問題當做迴歸問題來解嗎?

以binary classification為例,我們在Training時讓輸入為class 1的輸出為1,輸入為class 2的輸出為-1;那麼在testing的時候,regression的output是一個數值,它接近1則說明它是class 1,它接近-1則說明它是class 2

如果這樣做,會遇到什麼樣的問題?

Regression的output是連續性質的數值,而classification要求的output是離散性質的點,我們很難找到一個Regression的function使大部分樣本點的output都集中在某幾個離散的點附近


因此,Regression定義model好壞的定義方式對classification來說是不適用的

注:該圖為三維影象在二維影象上的投影,顏色表示y的大小

而且值得注意的是,如果是多元分類問題,類別1變成數值1,類別2變成數值2,類別3變成數值3……暗示類別1與類別2比較接近,與類別3比較遠,實際上並無此關係。
當然,確實有將多分類當做迴歸來解的模型(感知機,SVM等),但是需要修改損失函式。



Ideal Alternatives

注意到Regression的output是一個real number,但是在classification的時候,它的output是discrete 不相關的(用來表示某一個class)

理想的方法是這樣的:

Function(Model)

我們要找的function f(x)裡面會有另外一個function g(x),當我們的input x輸入後,如果g(x)>0,那f(x)的輸出就是class 1,如果g(x)<0,那f(x)的輸出就是class 2,這個方法保證了function的output都是離散的表示class的數值----->啟用函式

那之前不是說輸出是1,2,3…是不行的嗎,注意,那是針對Regression的loss function而言的,因為Regression的loss function是用output與“真值”的平方和作為評判標準的,這樣輸出值(3,2)與(3,1)之間顯然是(3,2)關係更密切一些,為了解決這個問題,我們只需要重新定義一個loss function即可

Loss function

我們可以把loss function定義成 L ( f ) = ∑ n δ ( f ( x n ) ≠ y ^ n ) L(f)=\sum\limits_n\delta(f(x^n)≠\hat{y}^n) L(f)=nδ(f(xn)=y^n),即這個model在所有的training data上predict預測錯誤的次數,也就是說分類錯誤的次數越少,這個function表現得就越好

但是這個loss function沒有辦法微分,是無法用gradient descent的方法去解的,當然有Perceptron、SVM這些方法可以用,但這裡先用另外一個solution來解決這個問題

Solution:Generative model(生成模型)

概率理論解釋

假設我們考慮一個二元分類的問題,我們拿到一個input x,想要知道這個x屬於class 1或class 2的概率

實際上就是一個貝葉斯公式,x屬於class 1的概率就等於class 1自身發生的概率乘上在class 1裡取出x這種顏色的球的概率除以在class 1和 class 2裡取出x這種顏色的球的概率(後者是全概率公式)

貝葉斯公式=單條路徑概率/所有路徑概率和

P(C1) P(C2) P(x|C1) P(x|C2) begin Class 1 Class 2 x

於是我們得到:(分母為全概率公式)

  • x屬於Class 1的概率為第一條路徑除以兩條路徑和: P ( C 1 ∣ x ) = P ( C 1 ) P ( x ∣ C 1 ) P ( C 1 ) P ( x ∣ C 1 ) + P ( C 2 ) P ( x ∣ C 2 ) P(C_1|x)=\frac{P(C_1)P(x|C_1)}{P(C_1)P(x|C_1)+P(C_2)P(x|C_2)} P(C1x)=P(C1)P(xC1)+P(C2)P(xC2)P(C1)P(xC1)
  • x屬於Class 2的概率為第二條路徑除以兩條路徑和: P ( C 2 ∣ x ) = P ( C 2 ) P ( x ∣ C 2 ) P ( C 1 ) P ( x ∣ C 1 ) + P ( C 2 ) P ( x ∣ C 2 ) P(C_2|x)=\frac{P(C_2)P(x|C_2)}{P(C_1)P(x|C_1)+P(C_2)P(x|C_2)} P(C2x)=P(C1)P(xC1)+P(C2)P(xC2)P(C2)P(xC2)

這一整套想法叫做Generative model(生成模型),可以拿它來generate生成x(如果你可以計算出每一個x出現的概率,就可以用這個distribution分佈來生成x、sample x出來)

Prior

P ( C 1 ) P(C_1) P(C1) P ( C 2 ) P(C_2) P(C2)這兩個概率,被稱為Prior,計算這兩個值還是比較簡單的

假設我們還是考慮二元分類問題,編號小於400的data用來Training,編號大於400的data用來testing,如果想要嚴謹一點,可以在Training data裡面分一部分validation出來模擬testing的情況

在Training data裡面,有79只水系寶可夢,61只一般系寶可夢,那麼 P ( C 1 ) = 79 / ( 79 + 61 ) = 0.56 P(C_1)=79/(79+61)=0.56 P(C1)=79/(79+61)=0.56 P ( C 2 ) = 61 / ( 79 + 61 ) = 0.44 P(C_2)=61/(79+61)=0.44 P(C2)=61/(79+61)=0.44

現在的問題是,怎麼得到 P ( x ∣ C 1 ) P(x|C_1) P(xC1) P ( x ∣ C 2 ) P(x|C_2) P(xC2)的值

Probability from Class

怎麼得到 P ( x ∣ C 1 ) P(x|C_1) P(xC1) P ( x ∣ C 2 ) P(x|C_2) P(xC2)的值呢?假設我們的x是一隻新來的海龜,它顯然是水系的,但是在我們79只水系的寶可夢training data裡面根本就沒有海龜,所以挑一隻海龜出來的可能性根本就是0啊!所以該怎麼辦呢?

其實每一隻寶可夢都是用一組特徵值組成的向量來表示的,在這個vector裡一共有七種不同的feature,為了方便視覺化,這裡先只考慮Defense和SP Defence這兩種feature

假設海龜的vector是[103 45],雖然這個點在已有的資料裡並沒有出現過,但是不可以認為它出現的概率為0,我們需要用已有的資料去估測海龜出現的可能性

你可以想象說這已有的79只水系寶可夢的data其實只是冰山一角,假定水系神奇寶貝的Defense和SP Defense是從一個Gaussian的distribution裡面sample出來的,下圖只是取樣了79個點之後得到的分佈,但是從高斯分佈裡取樣出海龜這個點的機率並不是0,那從這79個已有的點,怎麼找到那個Gaussian distribution函式呢?

Gaussian Distribution

先介紹一下高斯函式,這裡 u u u表示均值, Σ \Sigma Σ表示方差,兩者都是矩陣matrix,那高斯函式的概率密度函式則是:
f u , Σ ( x ) = 1 ( 2 π ) D 2 1 ∣ Σ ∣ 1 2 e − 1 2 ( x − u ) T Σ − 1 ( x − u ) f_{u,\Sigma}(x)=\frac{1}{(2\pi)^{\frac{D}{2}}}\frac{1}{|\Sigma|^{\frac{1}{2}}}e^{-\frac{1}{2}(x-u)^T\Sigma^{-1}(x-u)} fu,Σ(x)=(2π)2D1Σ211e21(xu)TΣ1(xu)
從下圖中可以看出,同樣的 Σ \Sigma Σ,不同的 u u u,概率分佈最高點的地方是不一樣的

同理,如果是同樣的 u u u,不同的 Σ \Sigma Σ,概率分佈最高點的地方是一樣的,但是分佈的密集程度是不一樣的

那接下來的問題就是怎麼去找出這個Gaussian,只需要去估測出這個Gaussian的均值 u u u和協方差 Σ \Sigma Σ即可

估測 u u u Σ \Sigma Σ的方法就是極大似然估計法(Maximum Likelihood),極大似然估計的思想是,找出最特殊的那對 u u u Σ \Sigma Σ,從它們共同決定的高斯函式中再次取樣出79個點,使”得到的分佈情況與當前已知79點的分佈情況相同“這件事情發生的可能性最大

實際上任意一組 u u u Σ \Sigma Σ對應的高斯函式( u u u表示該Gaussian的中心點, Σ \Sigma Σ表示該Gaussian的分散程度)都有可能sample出跟當前分佈一致的樣本點,就像上圖中的兩個紅色圓圈所代表的高斯函式,但肯定存在著發生概率最大的哪一個Gaussian,而這個函式就是我們要找的

而極大似然函式 L ( u , Σ ) = f u , Σ ( x 1 ) ⋅ f u , Σ ( x 2 ) . . . f u , Σ ( x 79 ) L(u,\Sigma)=f_{u,\Sigma}(x^1)\cdot f_{u,\Sigma}(x^2)...f_{u,\Sigma}(x^{79}) L(u,Σ)=fu,Σ(x1)fu,Σ(x2)...fu,Σ(x79),實際上就是該事件發生的概率就等於每個點都發生的概率之積,我們只需要把每一個點的data代進去,就可以得到一個關於 u u u Σ \Sigma Σ的函式,分別求偏導,解出微分是0的點,即使L最大的那組引數,便是最終的估測值,通過微分得到的高斯函式的 u u u Σ \Sigma Σ的最優解如下:
u ∗ , Σ ∗ = arg ⁡ max ⁡ u , Σ L ( u , Σ ) u ∗ = 1 79 ∑ n = 1 79 x n Σ ∗ = 1 79 ∑ n = 1 79 ( x n − u ∗ ) ( x n − u ∗ ) T u^*,\Sigma^*=\arg \max\limits_{u,\Sigma} L(u,\Sigma) \\ u^*=\frac{1}{79}\sum\limits_{n=1}^{79}x^n \ \ \ \ \Sigma^*=\frac{1}{79}\sum\limits_{n=1}^{79}(x^n-u^*)(x^n-u^*)^T u,Σ=argu,ΣmaxL(u,Σ)u=791n=179xnΣ=791n=179(xnu)(xnu)T
當然如果你不願意去現場求微分的話,這也可以當做公式來記憶( u ∗ u^* u剛好是數學期望, Σ ∗ \Sigma^* Σ剛好是協方差)

注:數學期望: u = E ( X ) u=E(X) u=E(X),協方差: Σ = c o v ( X , Y ) = E [ ( X − u ) ( Y − u ) T ] \Sigma=cov(X,Y)=E[(X-u)(Y-u)^T] Σ=cov(X,Y)=E[(Xu)(Yu)T],對同一個變數來說,協方差為 c o v ( X , X ) = E [ ( X − u ) ( X − u ) T cov(X,X)=E[(X-u)(X-u)^T cov(X,X)=E[(Xu)(Xu)T

根據上述的公式和已有的79個點的資料,計算出class 1的兩個引數:
u = [ 75.0 71.3 ] Σ = [ 874 327 327 929 ] u= \begin{bmatrix} 75.0\\ 71.3 \end{bmatrix} \ \ \ \ \ \Sigma= \begin{bmatrix} 874 \ \ 327\\ 327 \ \ 929 \end{bmatrix} u=[75.071.3]Σ=[874327327929]

同理,我們用極大似然估計法在高斯函式上的公式計算出class 2的兩個引數,得到的最終結果如下:

有了這些以後,我們可以得到 P ( C 1 ) , P ( x ∣ C 1 ) , P ( C 2 ) , P ( x ∣ C 2 ) P(C_1),P(x|C_1),P(C_2),P(x|C_2) P(C1),P(xC1),P(C2),P(xC2)這四個值,就可以開始做分類的問題了

Do Classification!

已有的準備

現在我們已經有了以下資料和具體分佈:

只要帶入某一個input x,就可以通過這個式子計算出它是否是class 1了!

得到的結果

通過視覺化得到的結果如下:

左上角的圖中,橫軸是Defense,縱軸是SP Defense,藍色的點是水系的寶可夢的分佈,紅色的點是一般系的寶可夢的分佈,對圖中的每一個點都計算出它是class 1的概率 P ( C 1 ∣ x ) P(C_1|x) P(C1x),這個概率用顏色來表示,如果某點在紅色區域,表示它是水系寶可夢的概率更大;如果該點在其他顏色的區域,表示它是水系寶可夢的概率比較小

因為我們做的是分類問題,因此令機率>0.5的點為類別1,機率<0.5的點為類別2,也就是右上角的圖中的紅色和藍色兩塊區域

再把testing data上得到的結果可視化出來,即右下角的圖,發現分的不是太好,正確率才是47%

我們之前用的只是Defense和SP Defense這兩個引數,在二維空間上得到的效果不太好,但實際上一開始就提到了寶可夢總共是有6個features的,也許在二維空間上它們是重疊在一起的,但是在六維空間上看它們也許會分得很好,每一個寶可夢都是六維空間中的一個點,於是我們的 u u u是一個6-dim的vector, Σ \Sigma Σ則是一個6*6的matrix,發現得到的準確率也才64%,這個分類器表現得很糟糕,是否有辦法將它改進的更好?

Modifying Model

其實之前使用的model是不常見的,你是不會經常看到給每一個Gaussian都有自己的mean和covariance,比如我們的class 1用的是 u 1 u_1 u1 Σ 1 \Sigma_1 Σ1,class 2用的是 u 2 u_2 u2 Σ 2 \Sigma_2 Σ2,比較常見的做法是,不同的class可以share同一個cocovariance matrix

其實variance是跟input的feature size的平方成正比的,所以當feature的數量很大的時候, Σ \Sigma Σ大小的增長是可以非常快的,在這種情況下,給不同的Gaussian以不同的covariance matrix,會造成model的引數太多,而引數多會導致該model的variance過大,出現overfitting的現象,因此對不同的class使用同一個covariance matrix,可以有效減少引數

此時就把 u 1 u_1 u1 u 2 u_2 u2和共同的 Σ \Sigma Σ一起去合成一個極大似然函式,此時可以發現,得到的 u 1 u_1 u1 u 2 u_2 u2和原來一樣,還是各自的均值,而 Σ \Sigma Σ則是原先兩個 Σ 1 \Sigma_1 Σ1 Σ 2 \Sigma_2 Σ2的加權

再來看一下結果,你會發現,class 1和class 2在沒有共用covariance matrix之前,它們的分界線是一條曲線;如果共用covariance matrix的話,它們之間的分界線就會變成一條直線,這樣的model,我們也稱之為linear model(儘管Gaussian不是linear的,但是它分兩個class的boundary是linear)

如果我們考慮所有的feature,並共用covariance的話,原來的54%的正確率就會變成73%,顯然是有分對東西的,但是為什麼會做到這樣子,我們是很難分析的,因為這是在高維空間中發生的事情,我們很難知道boundary到底是怎麼切的,但這就是machine learning它fancy的地方,人沒有辦法知道怎麼做,但是machine可以幫我們做出來

Three Steps of classification

現在讓我們來回顧一下做classification的三個步驟,實際上也就是做machine learning的三個步驟

  • Find a function set(model)

    這些required probability P ( C ) P(C) P(C)和probability distribution P ( x ∣ C ) P(x|C) P(xC)就是model的引數,選擇不同的Probability distribution(比如不同的分佈函式,或者是不同引數的Gaussian distribution),就會得到不同的function,把這些不同引數的Gaussian distribution集合起來,就是一個model,如果不適用高斯函式而選擇其他分佈函式,就是一個新的model了

    當這個posterior Probability P ( C ∣ x ) > 0.5 P(C|x)>0.5 P(Cx)>0.5的話,就output class 1,反之就output class 2( P ( C 1 ∣ x ) + P ( C 2 ∣ x ) = 1 P(C_1|x)+P(C_2|x)=1 P(C1x)+P(C2x)=1,因此沒必要對class 2再去計算一遍)

  • Goodness of function

    對於Gaussian distribution這個model來說,我們要評價的是決定這個高斯函式形狀的均值 u u u和協方差 Σ \Sigma Σ這兩個引數的好壞,而極大似然函式 L ( u , Σ ) L(u,\Sigma) L(u,Σ)的輸出值,就評價了這組引數的好壞

  • Find the best function

    找到的那個最好的function,就是使 L ( u , Σ ) L(u,\Sigma) L(u,Σ)值最大的那組引數,實際上就是所有樣本點的均值和協方差
    u ∗ = 1 n ∑ i = 0 n x i Σ ∗ = 1 n ∑ i = 0 n ( x i − u ∗ ) ( x i − u ∗ ) T u^*=\frac{1}{n}\sum\limits_{i=0}^n x^i \ \ \ \ \Sigma^*=\frac{1}{n}\sum\limits_{i=0}^n (x^i-u^*)(x^i-u^*)^T u=n1i=0nxiΣ=n1i=0n(xiu)(xiu)T
    這裡上標i表示第i個點,這裡x是一個features的vector,用下標來表示這個vector中的某個feature

Probability distribution

Why Gaussian distribution

你也許一直會有一個疑惑,為什麼我們就要用Gaussian的model,而不選擇別的分佈函式,其實這裡只是拿高斯分佈函式舉一個例子而已,你當然可以選擇自己喜歡的Probability distribution概率分佈函式,如果你選擇的是簡單的分佈函式(引數比較少),那你的bias就大,variance就小;如果你選擇複雜的分佈函式,那你的bias就小,variance就大,那你就可以用data set來判斷一下,用什麼樣的Probability distribution作為model是比較好的

Naive Bayes Classifier(樸素貝葉斯分類法)

我們可以考慮這樣一件事情,假設 x = [ x 1 x 2 x 3 . . . x k . . . ] x=[x_1 \ x_2 \ x_3 \ ... \ x_k \ ... \ ] x=[x1x2x3...xk...]中每一個dimension x k x_k xk的分佈都是相互獨立的,它們之間的covariance都是0,那我們就可以把x產生的機率拆解成 x 1 , x 2 , . . . , x k x_1,x_2,...,x_k x1,x2,...,xk產生的機率之積

這裡每一個dimension的分佈函式都是一維的Gaussian distribution,如果這樣假設的話,等於是說,原來那多維度的Gaussian,它的covariance matrix變成是diagonal(對角的),在不是對角線的地方,值都是0,這樣就可以更加減少需要的引數量,就可以得到一個更簡單的model

我們把上述這種方法叫做==Naive Bayes Classifier(樸素貝葉斯分類法)==,如果真的明確了所有的feature之間是相互獨立的,是不相關的,使用樸素貝葉斯分類法的performance是會很好的,如果這個假設是不成立的,那麼Naive bayes classfier的bias就會很大,它就不是一個好的classifier(樸素貝葉斯分類法本質就是減少引數)

當然這個例子裡如果使用這樣的model,得到的結果也不理想,因為各種feature之間的covariance還是必要的,比如戰鬥力和防禦力它們之間是正相關的,covariance不能等於0

總之,尋找model總的原則是,儘量減少不必要的引數,但是必然的引數絕對不能少

那怎麼去選擇分佈函式呢?有很多時候憑直覺就可以看出來,比如寶可夢有某個feature是binary的,它代表的是:是或不是,這個時候就不太可能是高斯分佈了,而很有可能是伯努利分佈(兩點分佈)

Analysis Posterior Probability

接下來我們來分析一下這個後置概率的表示式,會發現一些有趣的現象

表示式上下同除以分子,得到 σ ( z ) = 1 1 + e − z \sigma(z)=\frac{1}{1+e^{-z}} σ(z)=1+ez1,這個function叫做sigmoid function(S函式)

這個S函式是已知邏輯函式,現在我們來推導一下z真正的樣子,推導過程如下:



上面的推導過程可能比較複雜,但是得到的最終結果還是比較好的:(當 Σ 1 \Sigma_1 Σ1 Σ 2 \Sigma_2 Σ2共用一個 Σ \Sigma Σ時,經過化簡相消z就變成了一個linear的function,x的係數是一個vector w,後面的一大串數字其實就是一個常數項b)

P ( C 1 ∣ x ) = σ ( w ⋅ x + b ) P(C_1|x)=\sigma (w\cdot x+b) P(C1x)=σ(wx+b)這個式子就解釋了,當class 1和class 2共用 Σ \Sigma Σ的時候,它們之間的boundary會是linear的

那在Generative model裡面,我們做的事情是,我們用某些方法去找出 N 1 , N 2 , u 1 , u 2 , Σ N_1,N_2,u_1,u_2,\Sigma N1,N2,u1,u2,Σ,找出這些以後就算出w和b,把它們代進 P ( C 1 ∣ x ) = σ ( w ⋅ x + b ) P(C_1|x)=\sigma(w\cdot x+b) P(C1x)=σ(wx+b)這個式子,就可以算概率,但是,當你看到這個式子的時候,你可能會有一個直覺的想法,為什麼要這麼麻煩呢?我們的最終目標都是要找一個vector w和const b,我們何必先去搞個概率,算出一些 u , Σ u,\Sigma u,Σ什麼的,然後再回過頭來又去算w和b,這不是捨近求遠嗎?

所以我們能不能直接把w和b找出來呢?這是下一章節的內容