標籤:
本章內容
□sigmod函數和logistic迴歸分類器
□最佳化理論初步
□梯度下降最佳化演算法
□資料中的缺失項處理
這會是激動人心的一章,因為我們將首次接觸到最佳化演算法。仔細想想就會發現,其實我們日常生活中遇到過很多最佳化問題,比如如何在最短時間內從入點到達氏點?如何投人最少工作量卻獲得最大的效益?如何設計發動機使得油耗最少而功率最大?可風,最佳化的作用十分強大。接下來,我們介紹幾個最佳化演算法,並利用它們訓練出一個非線性函數用於分類。讀者不熟悉迴歸也沒關係,第8章起會深入介紹這一主題。假設現在有一些資料點,我們用一條直線對這些點進行擬合(該線稱為最佳擬合直線),這個擬合過程就稱作迴歸。利用Logistic迴歸進行分類的主要思想是:根據現有資料對分類邊界線建立迴歸公式,以此進行分類。這裡的“迴歸” 一詞源於最佳擬合,表示要找到最佳擬合參數集,其背後的數學分析將在下一部分介紹。訓練分類器時的做法就是尋找最佳擬合參數,使用的是最佳化演算法。接下來介紹這個二值型輸出分類器的數學原理。
本章首先闡述logistic迴歸的定義,然後介紹一些最佳化演算法,其中包括基本的梯度上升法和一個改進的隨機梯度上升法,這些最佳化演算法將用於分類器的訓練。本章最後會給出一個logistic迴歸的執行個體,預測一匹病馬是否能被治癒。
5.1基於Logistic迴歸和Sigmoid函數的分類
優點:計算代價不高,易於理解和實現。
缺點:容易欠擬合,分類精度可能不高。
適用資料類型:數值型和標稱型資料。
我們想要的函數應該是,能接受所有的輸人然後預測出類別。例如,在兩個類的情況下,上述函數輸出0或1。或許你之前接觸過具有這種性質的函數,該函數稱為海維塞德階躍函數(Heaviside step function) ,或者直接稱為單位階躍函數。然而,海維塞德階躍函數的問題在於:該函數在跳躍點上從0瞬間跳躍到1,這個瞬間跳躍過程有時很難處理。幸好,另一個函數也有類似的性質,且數學上更易處理,這就是sigmoid函數。sigmoid函數具體的計算公式如下:
圖5-1給出了sigmoid函數在不同座標尺度下的兩條曲線圖。當x為0時,Sigmoid函數值為0.5。隨著1的增大,對應的sigmoid值將逼近於1; 而隨著x的減小,Sigmoid值將逼近於0。如果橫座標刻度足夠大(圖5-1),sigmoid函數看起來很像一個階躍函數。
因此,為了實現logistic迴歸分類器,我們可以在每個特徵上都乘以一個迴歸係數,然後把所有的結果值相加,將這個總和代人sigmoid函數中,進而得到一個範圍在0?1之間的數值。任何大於0.5的資料被分人1類,小於0.5即被歸人0類。所以,logistic迴歸也可以被看成是一種概率估計。
確定了分類器的函數形式之後,現在的問題變成了:最佳迴歸係數是多少?如何確定它們的大小?這些問題將在下一節解答。
5.2 基於最佳化方法的最佳迴歸係數確定
5.2.1 梯度上升法
注意:(1)係數W是有初值的,所以這個遊戲才能玩下去。
(2)步長a也是不斷的變化中的
(3)這些係數w,a隨著迭代次數變化而變化。
(4)有迭代的次數限制。整個過程需要不斷的迭代才能夠玩下去,迭代是求迴歸係數的能源和動力。
5.2.2 訓練演算法:使用梯度上升找到最佳參數
圖5-3中有100個樣本點,每個點包含兩個數值型特徵:X1、X2 。在此資料集上,我們將通過使用梯度上升法找到最佳迴歸係數,也就是擬合出logistics迴歸模型的最佳參數。
梯度上升法的虛擬碼如下:
每個迴歸係數初始化為1
重複R次:
計算整個資料集的梯度
使用alpha x gradient更新迴歸係數的向量
返回迴歸係數
下面的代碼是梯度上升演算法的具體實現。為瞭解實際效果,開啟文字編輯器並建立一個名為logRegress.py的檔案,輸人下列代碼:
變數alpha是向目標移動的步長,maxCycles是迭代次數。在for迴圈迭代完成後,將返回訓練好的迴歸係數。需要強調的是,在2處的運算是矩陣運算。變數h不是一個數而是一個列向量,列向量的兀素個數等於樣本個數,這裡是100。對應地,運算datamatrix * weights的不止一次乘積計算,事實上該運算包含了300次的乘積。
5.2.3 分析資料:畫出決策邊界
運行程式清單5-2的代碼,在Python提示符下輸人:
5.2.4訓練演算法:隨機梯度上升:單點更新係數 單點 單點 單點
5.3 樣本:從疝氣病症預測病馬的死亡率
本節將使用logistic迴歸來預測患有疝病的馬的存活問題。這裡的資料包含368個樣本和28個特徵。我並非育馬專家,從一些文獻中瞭解到,疝病是描述馬胃腸痛的術語。然而,這種病不一定源自馬的胃腸問題,其他問題也可能引發馬疝病。該資料集中包含了醫院檢測馬疝病的一些指標,有的指標比較主觀,有的指標難以測量,例如馬的疼痛層級。
另外需要說明的是,除了部分指標主觀和難以測量外,該資料還存在一個問題,資料集中有30%的值是缺失的。下面將首先介紹如何處理資料集中的資料缺失問題,然後再利用logistic迴歸和隨機梯度上升演算法來預測病馬的生死。
5.3.1準備資料:處理被據中的缺失值
資料中的缺失值是個非常棘手的問題,有很多文獻都致力於解決這個問題。那麼,資料缺失究竟帶來了什麼問題?假設有100個樣本和20個特徵,這些資料都是機器收集回來的。若機器上的某個感應器損壞導致一個特徵無效時該怎麼辦?此時是否要扔掉整個資料?這種情況下,另外19個特徵怎麼辦?它們是否還可用?答案是肯定的。因為有時候資料相當昂貴,扔掉和重新擷取都是不可取的,所以必須採用一些方法來解決這個問題。
下面給出了一些可選的做法:
□使用可用特徵的均值來填補缺失值;
□使用特殊值來填補缺失值,如-1;
□忽略有缺失值的樣本;
□使用相似樣本的均值添補缺失值;
□使用另外的機器學習演算法預測缺失值。
5.3.2 測試演算法:用logistic迴歸進行分類
本章前面幾節介紹了最佳化演算法,但目前為止還沒有在分類上做任何實際嘗試。使用logistic迴歸方法進行分類並不需要做很多工作,所需做的只是把測試集上每個特徵向量乘以最佳化方法得來的迴歸係數,再將該乘積結果求和,最後輸人到sigmoid函數中即可,如果對應的sigmoid值大於0.5就預測類別標籤為1 ,否則為0。下面看看實際運行效果,開啟文字編輯器並將下列代碼添加到logResion.py檔案中。
5.4 本章小結
logistic迴歸的目的是尋找一個非線性函數sigmoid的最佳擬合參數,求解過程可以由最佳化演算法來完成。在最佳化演算法中,最常用的就是梯度上升演算法,而梯度上升演算法又可以簡化為隨機梯度上升演算法。
隨機梯度上升演算法與梯度上升演算法的效果相當,但佔用更少的計算資源。此外,隨機梯度上升是一個線上演算法,它可以在新資料到來時就完成參數更新,而不需要重新讀取整個資料集來進行批處理運算。
機器學習的一個重要問題就是如何處理缺失資料。這個問題沒有標準答案,取決於實際應用中的需求。現有一些解決方案,每種方案都各有優缺點。
下一章將介紹與logistic迴歸類似的另一種分類演算法:支援向量機,它被認為是目前最好的現成的演算法之一。
第五章:Logistic迴歸