LR模型可以被認爲就是一個被Sigmoid函數(logistic方程)所歸一化後的線性迴歸模型
LR模型常用於二分類問題,假設我們要根據已知特徵和label的樣本數據構建分類模型,假設我們想要建立一個線性模型,根據這個線性模型的結果進行類別劃分,但是這個線性模型的值是位於實數軸上的,因此我們可以通過Sigmoid函數將線性模型的結果映射到[0,1]區間內,這樣通過設定閾值,我們就可以根據閾值和映射得到的函數結果對樣本類別進行劃分。
通過sigmoid函數映射得到的[0,1]區間內的值我們可以看作類別爲1的概率值。
那麼問題就轉化爲如何求解線性模型的參數。
LR迴歸給我的直觀感受就是 它利用Sigmoid的一些性質,使得線性迴歸(多項式迴歸)從擬合數據神奇的轉變成了擬合數據的邊界,使其更加有助於分類!
邏輯迴歸也可以視爲一個廣義的線性模型,那麼線性模型中應用最廣泛的代價函數-誤差平方和函數,可不可以應用到邏輯迴歸呢?首先告訴你答案:是不可以的!因爲這樣得到的損失函數是非凸的,這樣的函數擁有多個局部極小值,這就會使得我們在使用梯度下降法求解函數最小值時,所得到的結果並非總是全局最小,而有更大的可能得到的是局部最小值。
最終的代價函數:採用了極大似然函數的方式進行計算
優點
- 實現簡單,廣泛的應用於工業問題上;
- 速度快,適合二分類問題
- 簡單易於理解,直接看到各個特徵的權重
- 能容易地更新模型吸收新的數據
- 對邏輯迴歸而言,多重共線性並不是問題,它可以結合L2正則化來解決該問題;
缺點:
- 當特徵空間很大時,邏輯迴歸的性能不是很好;
- 容易欠擬合
- 不能很好地處理大量多類特徵或變量;
- 使用前提: 自變量與因變量是線性關係。
邏輯迴歸的python實現思路:
(1)前向計算 :首先給定一個初始化權重,利用邏輯迴歸的計算公式以及x的值計算wx+b,然後根據sigmoid公式映射得到邏輯迴歸的值
(2)梯度下降進行權重調整:1 確定梯度下降方法:採用批梯度下降還是隨機梯度下降還是小批量梯度下降(?這裏可以先選擇批梯度下降)2 確定學習率 3 根據損失函數計算梯度公式 4 確定梯度更新公式 w=w-lr*均值(d(L)/d(w))
如果這裏選擇隨機梯度下降,則梯度更新公式爲w=w-lr*每個樣本的(d(L)/d(w))
下面是一個簡單的代碼(錯的,梯度更新公式沒算)
def sigmoid(x):
return 1/(1+math.exp(-x))
def lr(x,y,iter=1000,lr):
w=0
for i in range(iter):
y_=sigmoid(x*w)
w=w-lr*
return y_
這裏引入了梯度下降的幾種方法,一個簡單介紹:
批量梯度下降:得到的是一個全局最優解,但是每迭代一步,都要用到訓練集所有的數據,如果m很大,那麼可想而知這種方法的迭代速度。每迭代一次,使用了所有的樣本,而且可能這個梯度下降的效果跟用一個樣本梯度下降一次的效果差不多,所以效率比較低。但是,整體來看,使用全體數據進行迭代,可以得到全局最優解。
隨機梯度下降:通過每個樣本來迭代更新一次,如果樣本量很大的情況(例如幾十萬),那麼可能只用其中幾萬條或者幾千條的樣本,就已經將theta迭代到最優解了,對比上面的批量梯度下降,迭代一次需要用到十幾萬訓練樣本,一次迭代不可能最優,如果迭代10次的話就需要遍歷訓練樣本10次。但是,SGD伴隨的一個問題是噪音較BGD要多,使得SGD並不是每次迭代都向着整體最優化方向。雖然不是每次迭代得到的損失函數都向着全局最優方向, 但是大的整體的方向是向全局最優解的
小批量梯度下降法:它的具體思路是在更新每一參數時都使用一部分樣本來進行更新,也就是方程(1)中的m的值大於1小於所有樣本的數量。爲了克服上面兩種方法的缺點,又同時兼顧兩種方法的優點
使用情況:
如果樣本量比較小,採用批量梯度下降算法。如果樣本太大,或者在線算法,使用隨機梯度下降算法。在實際的一般情況下,採用小批量梯度下降算法。