邏輯迴歸(Logistic Regression),是機器學習中的一個分類模型。
按理說邏輯迴歸並不是分類模型中最簡單的一個(最簡單的應該是KNN),但爲什麼要從該模型開始呢?
原因有二:1.邏輯迴歸涉及到的一些知識點是後面機器學習的基礎,2.筆者兩次面試都被問道了邏輯迴歸。。。
本節將順着如下邏輯進行講解:
1.樣本描述
2.處理結果的函數(躍階函數還是sigmoid函數)
3.使用似然函數來確定求
4.使用梯度上升求梯度以求得
5.補充:如何使用損失函數
數據描述
這裏什麼是分類聚類就不介紹了,直接引入數據如下:
模型參數形式
類似於線性規劃,模型表達式爲:
到這裏,給出瞭如何獲得模型的值
躍階函數
即使用如下函數來判斷模型對於輸出參數的取值
上式是邏輯迴歸的基本假設,即使用屬性的一階函數(自變量的線性組合)來預測。
當
sigmoid 函數
先介紹其形式:
sigmoid 函數可以作爲躍階函數的替代。如果看過講解邏輯迴歸的資料就會發現,大部分相關資料講到邏輯迴歸都會提到sigmoid 函數,並將其作爲得到最後結果的最後一步。
但其實,sigmoid 函數完全不是邏輯迴歸的重點,而只是一種處理模型結果的手段。
我們既可以使用
不論是使用哪一種,
例如,當
此時求得的
即
同理可得:
上式中,
評判指標——似然函數
確定了
參考第一節,我們首先使用似然函數來評判模型的好壞,即需要極大化似然函數。
將模型的預測結果記爲
根據極大似然估計,樣本
即我們的目標就是求解當
以上確定了求解
OK,接下來的任務就是最優化問題了,即 求解
爲了使上式的值儘可能大,對於每一個
化簡後得到
注意這一步,務必能推導理解。
接着對
使用拉格朗日乘數法求極值,對極大似然估計求導得到:
將
但遺憾的是,上式的求解及其複雜,是m次多項式(m是樣本數),即沒有根式解。方程無法直接解出(有興趣的可以一試)。
梯度上升法
還記得我們的目標嗎?雖然我們沒法求出精確的
其實目標也就是解方程而已,常用的求方程近似根的方法有梯度法和牛頓法。爲了和其他邏輯迴歸的資料接軌,還是採用梯度上升法。
雖然沒法得到
∂lnL(θ;x1,...,xn)∂θ=(0,...,0) 時的θ ,但給定一個θ 後,可以求得該θ 處的∂lnL(θ;x1,...,xn)∂θ ,表示該θ 上升或者下降最快的方向。
此即爲梯度上升法的原理,上述理論不做證明,認真學過高數的應有印象。
求微過程如下:
最後的結果跟選擇的
爲了使上式變得更簡單,我們希望
是的你沒看錯,當
這就是爲什麼
到這裏,我們就求出了上升的梯度了。
每次取一定的步長,慢慢迭代即可使得似然函數步步變大。
這裏貼一下《機器學習實戰》裏的代碼,說明求解過程。
def loadDataSet():
dataMat = []; labelMat = []
fr = open('testSet.txt')
for line in fr.readlines():
lineArr = line.strip().split()
dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
labelMat.append(int(lineArr[2]))
return dataMat,labelMat
def sigmoid(inX):
return 1.0/(1+exp(-inX))
def gradAscent(dataMatIn, classLabels):
dataMatrix = mat(dataMatIn) #convert to NumPy matrix
labelMat = mat(classLabels).transpose() #convert to NumPy matrix
m,n = shape(dataMatrix)
alpha = 0.001
maxCycles = 500
weights = ones((n,1))
for k in range(maxCycles): #heavy on matrix operations
h = sigmoid(dataMatrix*weights) #matrix mult
error = (labelMat - h) #vector subtraction
weights = weights + alpha * dataMatrix.transpose()* error #matrix mult
return weights
注意上述代碼的倒數第二行:dataMatrix.transpose()* error
用算式來表達就是
補充:損失函數
作爲一個補充,我們討論下當不使用似然函數時還有什麼指標可以作爲求解參數
首先提出一個概念——損失函數,常用來作爲模型求解參數的衡量標準。
0-1損失
在講0-1損失前,先討論當不使用似然函數時可以選擇什麼。
一個很直觀的想法——使用錯誤率來衡量模型,並以此來求解參數
錯誤率是啥?很簡單的概念——模型分類錯誤的頻率。
當模型對某個樣本分類錯誤時,則錯誤數增加1,正確則錯誤數不增加。
則任務即是最小化
由於
如果你還記得上面的內容,就會發現上式其實也是一種躍階函數。
說到這裏,0-1損失就是上面的內容,沒錯,0-1損失就是我們最常用的錯誤率的另一種形式:
0-1損失:當預測值和實際值相等時,損失取0,否則取1
注意,我們不使用0-1損失的原因是求解複雜。
由於躍階函數的表達式是分段函數,因此一般我們會趨向使用與躍階函數的近似函數來替代,替代的函數需要有類似躍階函數的性質,即單調,且首位收斂。
到這裏sigmoid函數就出場了。
log損失
ok,我們都知道不能使用躍階函數(0-1損失)了,那我們如何使用sigmoid函數呢?
先來看看log損失。
不難看出,其實是將0-1損失的
該式的直觀含義是,當
對於該
由於y只能去0,1,故可以化簡如上式。
目標是最小化
還記得上面梯度上升法最後的結論嗎?
使用似然函數和梯度上升法,當
g(x)爲sigmoid函數時 ,求得的梯度爲∑n1xi(y−11+e−xiθ) 恰好與上式使用log損失的結果相同,即使用log損失,也就間接的使用了sigmoid函數。
好了到這裏,邏輯迴歸二分類的情況基本告一段落了。
作爲機器學習的開始,我們引入了一個常用的重要概念——損失函數
雖然本節提到了損失函數,但並未系統的介紹損失函數,下下一節將系統的介紹損失函數。
下一節將從整體上介紹梯度上升法