機器學習基礎---邏輯迴歸

一:分類

(一)分類基礎

在分類問題中,你要預測的變量y是離散的值,咱們將學習一種叫作邏輯迴歸 (Logistic Regression) 的算法,這是目前最流行使用最普遍的一種學習算法。算法

在分類問題中,咱們嘗試預測的是結果是否屬於某一個類(例如正確或錯誤)。分類問題的例子有:判斷一封電子郵件是不是垃圾郵件;判斷一次金融交易是不是欺詐;以前咱們也談到了腫瘤分類問題的例子,區別一個腫瘤是惡性的仍是良性的。數據結構

咱們從二元的分類問題開始討論。(固然存在多分類問題,例如y能夠取到 0,1,2,3這幾個值)機器學習

咱們將因變量(dependent variable)可能屬於的兩個類分別稱爲負向類(negative class)和正向類(positive class),則因變量 ,其中 0 表示負向類(沒有某項東西):良性腫瘤,1 表示正向類(含有某項東西):惡性腫瘤。函數

(二)對比線性迴歸 

咱們對數據集創建線性模型,獲得線性迴歸函數。同時設置一個閾值y_0=0.5,此時x_0對應y_0,當x<x_0時,則返回0,當x>x_0則返回1。學習

上面解釋彷佛很合理,可是當咱們出現下面的數據集分佈時:優化

從新創建線性模型,致使本來屬於正向類的數據,被劃分到負向類中。spa

所以,不建議將線性迴歸用於分類問題。指針

若是咱們要用線性迴歸算法來解決一個分類問題,對於分類, y取值爲 0 或者1,但若是你使用的是線性迴歸,那麼假設函數的輸出值可能遠大於 1,或者遠小於0,即便全部訓練樣本的標籤y都等於 0 1。儘管咱們知道標籤應該取值0 或者1,可是若是算法獲得的值遠大於1或者遠小於0的話,就會感受很奇怪。code

因此咱們在接下來的要研究的算法就叫作邏輯迴歸算法,這個算法的性質是:它的輸出值永遠在01 之間。blog

順便說一下,邏輯迴歸算法是分類算法,咱們將它做爲分類算法使用。有時候可能由於這個算法的名字中出現了迴歸使你感到困惑,但邏輯迴歸算法其實是一種分類算法,它適用於標籤y取值離散的狀況,如:1 0 0 1

二:假說表示

(一)模型引出

咱們引入一個新的模型,邏輯迴歸,該模型的輸出變量範圍始終在01之間。 

邏輯迴歸模型的假設是:

其中:X表示特徵向量,g表示邏輯函數,是一個經常使用的邏輯函數(爲S形函數Sigmoid function)

Sigmoid function公式:

當z趨於正無窮,g(z)--->1。當z趨於負無窮,g(z)--->0。所以g(z)再(0,1)之間。

所以,完整的邏輯迴歸模型以下:

(二)參數θ擬合數據

當咱們拿到一個數據集,咱們須要給參數選定一個值。假說模型會幫咱們作出預測。

三:決策邊界

(一)假設函數的屬性---決策邊界

決策邊界這個概念能更好地幫助咱們理解邏輯迴歸的假設函數在計算什麼。

在邏輯迴歸中,咱們預測:

根據上面繪製出的 S 形函數圖像,咱們知道:

如今假設咱們有一個模型:

 

而且假設咱們擬合好了參數,參數θ是向量[-3 1 1].則當-3+x_1+x_2>=0,即x_1+x_2>=3時,模型將預測y=1

咱們能夠繪製直線x_1+x_2=3,這條線即是咱們模型的分界線,將預測爲1和預測爲0的區域分開。

 

這條洋紅色線,被稱爲決策邊界。具體地說,這條直線x_1+x_2=3。它對應h(x)=0.5的區域。

決策邊界,也就是這條直線將整個平面分紅了兩部分,其中一片區域假設函數預測y等於1,而另外一片區域假設函數預測y等於0。

決策邊界是假設函數的一個屬性:

它包括參數θ_0 θ_1 θ_2。

即使咱們去除這個數據集以後:

這條決策邊界,以及咱們預測y=1,與y=0。他們都是假設函數的屬性,決定於其參數θ_j,而不是數據集的屬性(不一樣於線性迴歸)

固然,咱們後面還將討論如何擬合參數,那時,咱們將使用訓練集,使用咱們的數據來肯定參數的取值。

可是,一旦咱們有肯定的參數取值,有肯定的θ0 θ1 θ2,咱們就將徹底肯定決策邊界。

這時,咱們實際上並不須要在繪製決策邊界的時候,繪製訓練集。

(二)複雜數據集

給定一個這樣的訓練集,咱們如何使用邏輯迴歸來擬合這些數據?

早些時候,當咱們談論多項式迴歸或者線性迴歸時,咱們談到能夠添加額外的高階多項式項,一樣咱們也能夠對邏輯迴歸使用相同的方法。

添加了兩個額外的特徵,x_1方和x_2方。而且我如今有5個參數,θ_0到θ_4。

假設咱們以及擬合了參數θ_j是[-1 0 0 1 1]

這樣咱們就能夠得到決策邊界:

所以,經過增長這些複雜的多項式特徵變量,能夠獲得更復雜的決定邊界,而不僅是用直線分開正負樣本。

再次強調:決策邊界不是訓練集的屬性,而是假設自己及其參數的屬性。咱們不是用訓練集來定義的決策邊界,而是用訓練集來擬合參數θ

四:代價函數---擬合邏輯迴歸模型的參數θ

如何自動選擇參數θ,使咱們能在給定一個訓練集時,咱們能夠根據數據自動擬合參數θ。

(一)原始代價函數

具體來講,我要定義用來擬合參數的優化目標或者叫代價函數,這即是監督學習問題中的邏輯迴歸模型的擬合問題。

對於線性迴歸模型,咱們定義的代價函數是全部模型偏差的平方和。理論上來講,咱們也能夠對邏輯迴歸模型沿用這個定義,可是問題在於,當咱們將

帶入到這樣定義了的代價函數中時,咱們獲得的代價函數將是一個非凸函數non-convexfunction。

這意味着咱們的代價函數有許多局部最小值,這將影響梯度降低算法尋找全局最小值。

相應的,咱們但願咱們的代價函數J(θ)是一個以下的凸函數:

因此咱們對這個凸函數使用梯度降低法,就能夠確保必定能夠收斂到該函數的全局最小值。

可是因爲咱們中間的的h(x)函數是非線性的,就致使了代價函數是非凸函數。

(二)修正後的代價函數

咱們從新定義邏輯迴歸的代價函數爲:

推導-log(h(x)):

注意:,因此h(x)的取值範圍在(0,1)之間。

所有-log(h(x))和-log(1-h(x))表示:

由於是分類(邏輯迴歸),因此y取值只有y=1和y=0兩種,每種對應一個cost方法。

則h(x)和cost(h(x),y)之間的關係以下圖所示:

上圖是y=1的狀況下,cost代價值(縱軸)和h(x)預測值(橫軸)之間的關係。

其性質是:

當預測值是h(x)=1,實際標籤值y也是爲1,那麼cost代價值則爲0。

可是當預測值是0,實際標籤值是1,那麼cost代價值是∞大,這就說明咱們的預測是錯誤的,那麼咱們就用很是很是大的代價值來懲罰這個學習算法。


 

是y=0的狀況下,cost代價值(縱軸)和h(x)預測值(橫軸)之間的關係。

當預測值是h(x)=0,實際標籤值y也是爲0,那麼cost代價值則爲0。

可是當預測值是1,實際標籤值是0,那麼cost代價值是∞大,這就說明咱們的預測是錯誤的,那麼咱們就用很是很是大的代價值來懲罰這個學習算法

(三)將y=1和y=0的cost函數合併,簡化

將構建的cost(h(x),y)簡化以下:(再也不單獨區分y=0和y=1)

帶入代價函數獲得:

即:

補充:這是由最大似然函數來的,是一個凸函數

(四)代碼實現cost

import numpy as np def cost(theta, X, y):   theta = np.matrix(theta)   X = np.matrix(X)   y = np.matrix(y)     first = np.multiply(-y, np.log(sigmoid(X* theta.T)))    second = np.multiply((1 - y), np.log(1 - sigmoid(X* theta.T)))   return np.sum(first - second) / (len(X))

其中,h(x)以下:是一個sigmod函數,傳參爲X*theta.T

五:梯度降低法---爲訓練集擬合出來參數θ

在獲得這樣一個代價函數之後,咱們即可以用梯度降低算法來求得能使代價函數最小的參數了。

算法爲:

求導後獲得:

注:雖然獲得的梯度降低算法表面上看上去與線性迴歸的梯度降低算法同樣,可是這裏的

與線性迴歸中不一樣,因此其實是不同的。

推導過程:

 

因此:

另外,在運行梯度降低算法以前,進行特徵縮放依舊是很是必要的。特徵縮放依舊適用於邏輯迴歸。

六:高級優化

(一)梯度降低法

一些高級優化算法和一些高級的優化概念,利用這些方法,咱們就可以使經過梯度降低,進行邏輯迴歸的速度大大提升,而這也將使算法更加適合解決大型的機器學習問題,好比,咱們有數目龐大的特徵量。 如今咱們換個角度來看什麼是梯度降低:

咱們有個代價函數J(θ),而咱們想要使其最小化,那麼咱們須要作的是編寫代碼,當輸入參數θ時,它們會計算出兩樣東西:J(θ)以及J等於 01直到n時的偏導數項。

梯度降低所作的就是反覆執行這些更新,從而來更新參數θ。

(二)其餘高級算法

然而梯度降低並非咱們可使用的惟一算法,還有其餘一些算法,更高級、更復雜。

若是咱們能用這些方法來計算代價函數J(θ)和偏導數兩個項的話,那麼這些算法就是爲咱們優化代價函數的不一樣方法。

共軛梯度法,BFGS (變尺度法) L-BFGS (限制變尺度法) 就是其中一些更高級的優化算法,它們須要有一種方法來計算J(θ),以及須要一種方法計算導數項。

而後使用比梯度降低更復雜的算法來最小化代價函數。這三種算法的具體細節過於麻煩,這裏只須要了解一些他們的特性:

一個是使用這其中任何一個算法,你一般不須要手動選擇學習率α ,因此對於這些算法的一種思路是:
給出計算導數項和代價函數的方法,你能夠認爲算法有一個智能的內部循環。
並且,事實上,他們確實有一個智能的內部循環,稱爲線性搜索(line search)算法,它能夠自動嘗試不一樣的學習速率α ,並自動選擇一個好的學習速率α,
所以它甚至能夠爲每次迭代選擇不一樣的學習速率,那麼你就不須要本身選擇。
這些算法實際上在作更復雜的事情,而不只僅是選擇一個好的學習率,因此它們每每最終收斂得遠遠快於梯度降低。
並且咱們每每不須要特別去了解算法的內部細節(太複雜),就能夠很好的使用他,到各類應用場景



舉例使用:

若是想用高級優化算法裏的一個,來最小化代價函數。若是咱們不知道最小值在(5,5)時取到,可是還想要找到最小值。

咱們可使用梯度降低法,可是最好用比它更加高級的算法。

Octave 函數實現了這樣一個代價函數,好比costFunciton(theta)----返回兩個自變量:

第一個是jVal:它是咱們要計算的代價函數

第二個是梯度值,梯度值應該是一個2×1的向量,梯度向量的兩個元素對應這裏的兩個偏導數項

運行這個costFunction 函數後,你就能夠調用高級的優化函數,這個函數叫 fminunc,它表示Octave 裏無約束最小化函數。

你要設置幾個options,這個 options 變量做爲一個數據結構能夠存儲你想要的options。

因此 GradObj On,這裏設置梯度目標參數爲打開(on),這意味着你如今確實要給這個算法提供一個梯度,而後設置最大迭代次數。

比方說100,咱們給出一個θ的猜想初始值,它是一個2×1的向量,那麼這個命令就調用fminunc,這個@符號表示指向咱們剛剛定義的costFunction 函數的指針。

若是你調用它,它就會使用衆多高級優化算法中的一個,固然你也能夠把它當成梯度降低,只不過它能自動選擇學習速率α,你不須要本身來作。

而後它會嘗試使用這些高級的優化算法,就像增強版的梯度降低法,爲你找到最佳的θ值。

當有一個很大的機器學習問題時,選擇這些高級算法,而不是梯度降低。有了這些概念,你就應該能將邏輯迴歸和線性迴歸應用於更大的問題中,這就是高級優化的概念。

七:多元分類---一對多

使用邏輯迴歸 (logistic regression)來解決多類別分類問題

(一)案例

(二)二元分類和多分類對比

二元分類問題,咱們的數據看起來多是像這樣:

對於一個多類分類問題,咱們的數據集或許看起來像這樣:

咱們如今已經知道如何進行二元分類,可使用邏輯迴歸,對於直線或許你也知道,能夠將數據集一分爲二爲正類和負類。

用一對多的分類思想,咱們能夠將其用在多類分類問題上。

下面將介紹如何進行一對多的分類工做,有時這個方法也被稱爲"一對餘"方法。

如今咱們有一個訓練集,比如上圖表示的有3個類別,咱們用三角形表示y=1,方框表示y=2,叉叉表示y=3 

咱們下面要作的就是,將這個訓練集,將其分紅3個獨立的二元分類問題。

咱們先從用三角形表明的類別1開始,實際上咱們能夠建立一個,新的""訓練集,類型2和類型3定爲負類,類型1設定爲正類,咱們建立一個新的訓練集,以下圖右側所示的那樣,咱們要擬合出一個合適的分類器。

這裏的三角形是正樣本,而圓形表明負樣本。能夠這樣想,設置三角形的值爲1,圓形的值爲0,下面咱們來訓練一個標準的邏輯迴歸分類器,這樣咱們就獲得一個正邊界。

 

這裏的h_θ(x)上標(1)表明類別1,咱們對三角形類別1進行上面這樣的處理。


 一樣對類別2進行一樣的處理:將方形樣本設置爲正樣本,其餘爲負樣本,以此來擬合第二個邏輯迴歸分類器h_θ^(2)(x):

  

這裏的h_θ(x)上標(2)表明類別2,咱們對方形類別2進行上面這樣的處理。


一樣,設置叉型爲類別3:


總結:

爲了能實現這樣的轉變,咱們將多個類中的一個類標記爲正向類(y=1),

而後將其餘全部類都標記爲負向類,這個模型記做:

----計算在給定x和θ時,y的值爲1的機率。

接着,相似地第咱們選擇另外一個類標記爲正向類(y=2),再將其它類都標記爲負向類,將這個模型記做:

依此類推。最後咱們獲得一系列的模型簡記爲:(一系列分類器)

每一個分類器都針對其中一種狀況進行訓練。

總之:咱們訓練了一個邏輯迴歸分類器,預測i類別y=i的機率。

最後爲了作出預測,咱們給出一個新的輸入值x,指望得到預測。咱們要作的就是在咱們三個分類器裏面輸入x,

而後咱們選擇一個讓最大的i,即。選出三個當中,可信度最高,效果最好的那個分類器。

不管i值是多少,咱們都能獲得一個最高的機率值,咱們預測就是那個值。

這就是多類別分類問題,以及一對多的方法,經過這個小方法,你如今也能夠將邏輯迴歸分類器用在多類分類的問題上。

最後,在咱們須要作預測時,咱們將全部的分類機都運行一遍,而後對每個輸入變量,都選擇最高可能性的輸出變量。

相關文章
相關標籤/搜索