一、logistic回歸分析簡介
logistic回歸是研究觀察結果(因變量)為二分類或多分類時,與影響因素(自變量)之間關系的一種多變量分析方法,屬于機率型非線性回歸。
利用logistic回歸進行分類的主要思想是:根據現有資料對分類邊界線建立回歸公式,以此進行分類。這裡“回歸”是指通過最優化方法找到最佳拟合參數集,作為分類邊界線的方程系數。通過分類邊界線進行分類,具體說來就是将每個測試集上的特征向量乘以回歸系數(即最佳拟合參數),再将結果求和,最後輸入到logistic函數(也叫sigmoid函數),根據sigmoid函數值與門檻值的關系,進行分類。也就是說logistic分類器是由一組權值系數組成,最關鍵的問題就是如何求得這組權值。
在流行病學研究中,logistic回歸常用于分析疾病與各種危險因素間的定量關系。這次将利用logistic回歸預測病馬的死亡率,病馬樣本有368個,每個樣本有21個特征點,即21種危險因素。接下來,本文首先介紹利用梯度上升法及改進的随機梯度上升法尋找最佳回歸系數,然後用matlab實作基于logistic回歸的病馬死亡率預測。
二、如何尋找最優化參數
1.logistic回歸模型
給定n個特征x=(x1,x2,…,xn),設條件機率P(y=1|x)為觀測樣本y相對于事件因素x發生的機率,用sigmoid函數表示為:

那麼在x條件下y不發生的機率為:
假設現在有m個互相獨立的觀測事件y=(y1,y2,…,ym),則一個事件yi發生的機率為(yi= 1)
那麼現在就成了,已知總體事件Y是服從上述機率密度的連續型随機變量:
由于logistic分類器是由一組權值系數組成的,最關鍵的問題就是如何擷取這組權值。而f(x)中x是由權值向量與特征向量相乘的結果,即g(x)表示,其中特征向量是随機變量,隻有向量w是參數,是以權值向量w可以通過極大似然函數估計獲得,并且Y~f(x;w)
【回憶一下似然函數的性質】
1.似然函數是統計模型中參數的函數。給定輸出x時,關于參數θ的似然函數L(θ|x)(在數值上)等于給定參數θ後變量X的機率:L(θ|x)=P(X=x|θ)
2.似然函數的重要性不是它的取值,而是當參數變化時機率密度函數到底是變大還是變小。對于同一個似然函數,如果存在一個參數值,使得它的函數值得到最大,那麼這個值就是最為合理的參數值。
3.極大似然函數:似然函數取得最大值表示相應的參數能夠使得統計模型最為合理
那麼對于上述m個觀測事件,其聯合機率密度函數,即似然函數為:
現在,我們的目标是求出使這一似然函數的值最大的參數估,也就是求出參數w1,w2,…,wn,使得L(w)取得 最大值。對L(w)取對數:
由于w有n+1個,根據n+1的對wi的偏導數方程求解w比較不靠譜。可以考慮使用牛頓-拉菲森疊代和梯度上升方法求解。梯度上升算法和牛頓疊代相比,收斂速度慢,因為梯度上升算法是一階收斂,而牛頓疊代屬于二階收斂。
2.梯度上升法
梯度上升法基于的思想是要找到某函數的最大值,最好的方法是沿着該函數的梯度方向探尋。函數f(x,y)的梯度可以如下表示,前提是函數f(x,y)必須在待計算的點上有定義并且可微。
在梯度上升法中,待計算點沿梯度方向每移動一步,都是朝着函數值增長最快的方向。若移動的步長記作a,則梯度算法的疊代公式如下:
疊代停止條件為:疊代次數達到某個指定的值或者算法達到某個可以允許的誤差範圍。現在繼續對剛才的似然函數進行推到:
其中,
根據梯度上升算法有,
進一步得到,
接下來将根據上述推到,實作一個利用logistic回歸得到分類邊界的例子,由于不擅長python,我索性用matlab改寫了。現在有100個樣本點及對應分類标簽,每個樣本點有2個特征。【文本檔案中有100行*3列資料,自己導入matlab,做成*.mat檔案即可】
分類邊界:
注:為了友善計算,這裡為每個樣本點新增一列特征X0,都為1.0,否則分類邊界将過零點,不準确了。
分界線的方程: w0 * x0 + w1 * x1 + w2 * x2 = 0
3.改進的梯度上升法
梯度上升法在每次更新回歸系數時都需要周遊整個資料集,該方法在處理100個左右資料集時效率尚可,但如果有10億樣本和成千上萬的特征,那麼這個方法的計算量就太大了。改進方法是一次僅用一個點來更新回歸系數。它是一種線上學習算法【即:可以在新的樣本到來時對分類器進行增量式更新。】,每一次處理的資料的操作被稱為“批處理”
從上圖結果來看,分類器錯分的樣本點很多。原因是,梯度上升法的分類邊界是在整個資料集上經過500次疊代得到的。目前改進的梯度上升法,沒有疊代。
此外,一個判斷優化算法優劣的可靠方法是看它是否收斂,也就是說參數是否達到了穩定值,是否還會不斷變化。現在讓随機梯度法在資料集上運作200次,得到下圖:
200次疊代過程中,3個參數的收斂情況:從上到下分别對應w0,w1,w2【不知道書上的圖是怎麼畫的,反正我這邊是這樣的】
産生上述波動的原因,是存在一些不能正确分類的樣本點【資料集并非線性可分】,在每次疊代時會引發資料的變化。下面将通過随機梯度法,來避免波動,進而收斂到某個值,并加快收斂速度。
4.随機梯度上升法
改進有兩個地方:
。alpha在每次疊代的時候都會調整,alpha的值是不斷變小的,但永遠不能減小到零,保證在多次疊代之後,新資料仍然有一定的影響。
。通過随機選取樣本來更新回歸系數,另外增加了一個疊代次數參數。
這邊我很質疑《機器學習python實戰》書上的描述和截圖,首先我根本沒看見之前算法的周期性波動和高頻,反而在随機算法中看到了。【他坐标軸axis改動過】
另外一個,就是每次随機選取樣本後,要從樣本裡踢出的,我這麼改了,收斂速度的确快了很多,但是,分類邊界線錯誤沒有改變很多。是以我不踢出了
分類邊界線:
各個參數的疊代結果:【隻有w0是收斂比較快的,w1,w2收斂了嘛?】
這種随機梯度算法相比第一種梯度上升法的計算量:第一種要500次循環,每次300次乘法,現在是200次循環,每次3次乘法1次加法,從矩陣的運算變成值的運算。運算量的确減少了。
三、病馬預測執行個體
368個樣本,21個特征點,選300個作為訓練用,68個作為測試
書中扯到資料丢失的處理問題,我看了下文本資料,他都弄好了,不要我們自己處理了。
大概意思就是:特征點丢失,用0代替;類标簽丢失,整條記錄舍棄。是以隻剩299個樣本做訓練,67個作為測試樣本了。
現在将完整展示,如何通過logistic回歸進行分類預測:
比較蛋疼的問題是,每次跑matlab,随機數都一樣。。。我已經把系統時間當seed了啊。。。
今天就寫到這裡吧。誰能解決matlab随機數問題的,可以留言。