李巨集毅機器學習筆記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. 分類問題的三個步驟
- 定義模型集合
樣本x屬於類別1的概率(後驗):
- 定義損失函式(LOSS)來評價模型好壞。
假設高斯分佈,利用已有的資料,求得μ ,Σ 。
最大化評價引數好壞的指標,即極大似然估計L(μ,Σ)。
- 找到最好的模型
最佳引數就是每個類別中,所有樣本點的均值和協方差。
u ∗ , Σ ∗ = arg max u , Σ L ( u , Σ ) u^*,\Sigma^*=\arg \max\limits_{u,\Sigma} L(u,\Sigma) \\
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=0∑nxiΣ∗=n1i=0∑n(xi−u∗)(xi−u∗)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這種顏色的球的概率(後者是全概率公式)
貝葉斯公式=單條路徑概率/所有路徑概率和
於是我們得到:(分母為全概率公式)
- 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(C1∣x)=P(C1)P(x∣C1)+P(C2)P(x∣C2)P(C1)P(x∣C1)
- 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(C2∣x)=P(C1)P(x∣C1)+P(C2)P(x∣C2)P(C2)P(x∣C2)
這一整套想法叫做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(x∣C1)和 P ( x ∣ C 2 ) P(x|C_2) P(x∣C2)的值
Probability from Class
怎麼得到 P ( x ∣ C 1 ) P(x|C_1) P(x∣C1)和 P ( x ∣ C 2 ) P(x|C_2) P(x∣C2)的值呢?假設我們的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∣Σ∣211e−21(x−u)TΣ−1(x−u)
從下圖中可以看出,同樣的
Σ
\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=1∑79xnΣ∗=791n=1∑79(xn−u∗)(xn−u∗)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[(X−u)(Y−u)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[(X−u)(X−u)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(x∣C1),P(C2),P(x∣C2)這四個值,就可以開始做分類的問題了
Do Classification!
已有的準備
現在我們已經有了以下資料和具體分佈:
只要帶入某一個input x,就可以通過這個式子計算出它是否是class 1了!
得到的結果
通過視覺化得到的結果如下:
左上角的圖中,橫軸是Defense,縱軸是SP Defense,藍色的點是水系的寶可夢的分佈,紅色的點是一般系的寶可夢的分佈,對圖中的每一個點都計算出它是class 1的概率 P ( C 1 ∣ x ) P(C_1|x) P(C1∣x),這個概率用顏色來表示,如果某點在紅色區域,表示它是水系寶可夢的概率更大;如果該點在其他顏色的區域,表示它是水系寶可夢的概率比較小
因為我們做的是分類問題,因此令機率>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(x∣C)就是model的引數,選擇不同的Probability distribution(比如不同的分佈函式,或者是不同引數的Gaussian distribution),就會得到不同的function,把這些不同引數的Gaussian distribution集合起來,就是一個model,如果不適用高斯函式而選擇其他分佈函式,就是一個新的model了
當這個posterior Probability P ( C ∣ x ) > 0.5 P(C|x)>0.5 P(C∣x)>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(C1∣x)+P(C2∣x)=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=0∑nxiΣ∗=n1i=0∑n(xi−u∗)(xi−u∗)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+e−z1,這個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(C1∣x)=σ(w⋅x+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(C1∣x)=σ(w⋅x+b)這個式子,就可以算概率,但是,當你看到這個式子的時候,你可能會有一個直覺的想法,為什麼要這麼麻煩呢?我們的最終目標都是要找一個vector w和const b,我們何必先去搞個概率,算出一些 u , Σ u,\Sigma u,Σ什麼的,然後再回過頭來又去算w和b,這不是捨近求遠嗎?
所以我們能不能直接把w和b找出來呢?這是下一章節的內容