邏輯迴歸算法

LogisticRegression

1.建立模型
假設樣本是(x, y), y 是0或1,表示負類或者正類。x 是m維樣本的特徵向量,那麼這個樣本屬於正類,也就是y = 1的概率可以通過下面邏輯函數來表示:

p(y=1x;θ)=σθTx=1/1+exp(θTx)p( y = 1 | x;θ) = σ(θ^Tx)=1/(1+exp(θ^Tx))

上述公式中σ是sigmoid函數,y是關係變量,與多個自變量有關(x),把這些自變量因素表示爲:x1, x2,…, xm。θ是模型參數(權值),這些對應 x1, x2,…, xm的權值叫做迴歸係數,表示爲:θ1, θ2,…, θm。x 的加權和就是y 的總得分。

因此上面的邏輯迴歸就是一個線性分類模型,它與線性迴歸不同點在於:將線性迴歸輸出的數值(範圍不定)壓縮到0和1之間,這樣的輸出值才能更適合表達“可能性“,(是否可以理解爲:邏輯迴歸就是被logistic函數歸一化後的線性迴歸?)

至此ML模型(LR)已經選好,只是模型的參數 θ 還未確定,下一步就需要利用樣本數據集來訓練模型求解 θ 的最優解。接下來需要建立代價函數,具體方法就是通過引入最大似然函數的方法確定logistic regression 的損失函數。假設有n個獨立的訓練樣本 {(x1, y1), (x2, y2), (x3, y3), …, (xn, yn), y = 0 or 1}。每個樣本(xi, yi)的概率是:

P(yi,xi)=P(yi=1xi)yi(1P(yi=1xi))1yiP(yi, xi) = P(yi = 1 | xi)^{yi}*(1 - P(yi = 1 | xi))^{1-yi}

上面的公式實際是樣本(xi, yi)屬於正類或者負類樣本兩種情況的統一,當yi=1yi =1時,公式等號右邊只剩下第一項;當yi=0yi =0時,等式右邊只剩下第二項。因此不管yiyi 等於0或者1,上面公知表示的都是每個樣本出現的概率,引入最大似然函數求模型中最大的迴歸係數θ,這個最大似然函數就是代價函數了, 因此n個獨立樣本出現的似然函數爲:

L(θ)=P(yi=1xi)yi(1P(yi=1xi))1yiL(θ) = ∏P(yi = 1|xi)^{yi}*(1-P(yi = 1|xi))^{1-yi}

P(yi=1xi;θ)=hθ(x)P(yi = 1|xi;θ) = hθ(x)

P(yi=0xi;θ)=1hθ(x)P(yi = 0|xi;θ) = 1-hθ(x)

對代價函數取對數得到最終LR目標函數(hθ()logistichθ()是logistic函數):

logL(θ))=i=1m(yilog(xi))+(1yi)log(1hθ(xi))logL(θ))=\sum_{i=1}^{m}(yi*log({x}^{i}))+(1-y^i)*log(1-hθ(x^i))

2. 梯度下降
LR模型的數學形式確定後下面利用梯度下降法(迭代算法)求解模型中的參數,首先將求解logL(θ))logL(θ))的最大值轉化爲最小值求解,轉化公式:

J(θ)=1ml(θ)J(\theta )=-\frac{1}{m}l(\theta)

然後根據梯度下降法得到θ\theta更新過程:

θj:=θjαθjJ(θ)(j=0,1,2...,n)\theta_{j}:=\theta_{j}-\alpha\frac{\partial }{\partial \theta_{j}}J(\theta),(j = 0,1,2...,n)

上式中α\alpha是學習步長,下面求偏導:
在這裏插入圖片描述
因此,迭代過程可以寫成:

θj:=θjα1mi=1m(hθ(x)iyi)xji(j=0,1,2...,n)\theta_{j}:=\theta_{j}-\alpha\frac{1}{m}\sum_{i=1}^{m}(h\theta(x)^{i}-y^{i}){x}_{j}^i,(j = 0,1,2...,n)

因爲式中1m\frac{1}{m}是常數,所以1m\frac{1}{m}是可以省略的。

3.正則化
正則化思想是機器學習算法中常見的一種處理方法,所有會產生過擬合現象的算法都可以用正則化來避免算法的過擬合,那首先需要了解過擬合。利用數據集訓練後的模型可以對新數據進行預測的能力稱爲泛化能力,一般來說泛化能力差的表現大多是因爲發生了過擬合。過擬合是指對訓練數據預測很好但是對未知數據預測不好的現象,一般是因爲模型過於複雜或者訓練數據過少引起的。模型過於複雜體現在參數過多或者參數過大。參數過大會導致導數非常大,從而造成函數的波動較大。下圖是欠擬合,擬合和過擬合情況。
在這裏插入圖片描述
因此,解決過擬合可以從兩個方面:減少模型複雜度以及增加訓練樣本個數,而正則化就是減少模型複雜度的一種方法。加入懲罰項的LR損失函數爲:

J(ω)=1m[i=1m(yilog(hω(xi)))+(1yi)log(1hω(xi))]+λΦ(ω)J(\omega)=-\frac{1}{m}[\sum_{i=1}^{m}(y^ilog(h\omega({x}^{i})))+(1-y^i)*log(1-h\omega(x^i))]+\lambda\Phi(\omega)

而這個正則化項一般採用L1或者L2範數,形式分別爲:Φ(ω)=x1\Phi(\omega)={||x||}_{1}Φ(ω)=x2\Phi(\omega)={||x||}_{2}。首先針對L1範數Φ(ω)=ω\Phi(\omega)=|\omega|,當採用梯度下降方式來優化目標函數時,對目標函數進行求導,正則化項導致的梯度變化當ωj>0{\omega}_{j}>0時取1,當ωj<0{\omega}_{j}<0時取-1.

因此當ωj{\omega}_{j}大於0的時候,ωj{\omega}_{j}會減去一個正數,導致ωj{\omega}_{j}減小,而當ωj{\omega}_{j}小於0的時候,ωj{\omega}_{j}會減去一個負數,導致ωj{\omega}_{j}又變大,因此這個正則項會導致參數ωj{\omega}_{j}取值趨近於0,也就是爲什麼L1正則能夠使權重稀疏,這樣參數值就受到控制會趨近於0。L1正則還被稱爲 Lasso regularization。

然後針對L2範數Φ(ω)=i=1nωj2\Phi(\omega)=\sum_{i=1}^{n}{\omega}^{2}_{j},同樣的更新之後使得的ωj{\omega}_{j}值不會變得特別大。在機器學習中也將L2正則稱爲weight decay,在迴歸問題中,關於L2正則的迴歸還被稱爲Ridge Regression嶺迴歸。weight decay還有一個好處,它使得目標函數變爲凸函數,梯度下降法和L-BFGS都能收斂到全局最優解。

需要注意的是,L1正則化會導致參數值變爲0,但是L2卻只會使得參數值減小,這是因爲L1的導數是固定的,參數值每次的改變量是固定的,而L2會由於自己變小改變量也變小。λ\lambda在權衡擬合能力和泛化能力對整個模型的影響,越大,對參數值懲罰越大,泛化能力越好。

LR與SVM
邏輯迴歸和svm作爲經典的分類算法,被放在一起討論的次數特別多,這裏只討論一些我贊同的觀點。

相同點:

  1. 都是分類算法
  2. 都是監督學習算法
  3. 都是判別模型
  4. 都能通過核函數方法針對非線性情況分類
  5. 目標都是找一個分類超平面
  6. 都能減少離羣點的影響

不同點:

  1. 損失函數不同,邏輯迴歸是cross entropy loss,svm是hinge loss
  2. 邏輯迴歸在優化參數時所有樣本點都參與了貢獻,svm則只取離分離超平面最近的支持向量樣本。這也是爲什麼邏輯迴歸不用核函數,它需要計算的樣本太多。並且由於邏輯迴歸受所有樣本的影響,當樣本不均衡時需要平衡一下每一類的樣本個數。
  3. 邏輯迴歸對概率建模,svm對分類超平面建模
  4. 邏輯迴歸是處理經驗風險最小化,svm是結構風險最小化。這點體現在svm自帶L2正則化項,邏輯迴歸並沒有
  5. 邏輯迴歸通過非線性變換減弱分離平面較遠的點的影響,svm則只取支持向量從而消去較遠點的影響
  6. 邏輯迴歸是統計方法,svm是幾何方法

Sklearn 中邏輯迴歸的使用以及參數含義

class sklearn.linear_model.LogisticRegression(penalty='l2', 
          dual=False, tol=0.0001, C=1.0, fit_intercept=True, 
          intercept_scaling=1, class_weight=None, 
          random_state=None, solver='liblinear', max_iter=100, 
          multi_class='ovr', verbose=0, warm_start=False, n_jobs=1)

penalty='l2' : 字符串‘l1’或‘l2’,默認‘l2’。
用來指定懲罰的基準(正則化參數),LogisticRegression和LogisticRegressionCV默認就帶了正則化項。penalty參數可選擇的值爲"l1"和"l2",分別對應L1的正則化和L2的正則化,默認是L2的正則化。在調參時如果我們主要的目的只是爲了解決過擬合,一般penalty選擇L2正則化就夠了。但是如果選擇L2正則化發現還是過擬合,即預測效果差的時候,就可以考慮L1正則化。
另外,如果模型的特徵非常多,我們希望一些不重要的特徵係數歸零,從而讓模型係數稀疏化的話,也可以使用L1正則化。penalty參數的選擇會影響我們損失函數優化算法的選擇。即參數solver的選擇,如果是L2正則化,那麼4種可選的算法{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}都可以選擇。
但是如果penalty是L1正則化的話,就只能選擇‘liblinear’了。這是因爲L1正則化的損失函數不是連續可導的,而{‘newton-cg’, ‘lbfgs’,‘sag’}這三種優化算法時都需要損失函數的一階或者二階連續導數。而‘liblinear’並沒有這個依賴。

dual=False: 對偶或者原始方法。Dual只適用於正則化相爲l2的‘liblinear’的情況,通常樣本數大於特徵數的情況下,默認爲False。

C=1.0: C爲正則化係數λ的倒數,必須爲正數,默認爲1。和SVM中的C一樣,值越小,代表正則化越強。

fit_intercept=True : 是否存在截距,默認存在。

intercept_scaling=1 : 僅在正則化項爲‘liblinear’,且fit_intercept設置爲True時有用。

solver='liblinear': solver參數決定了我們對邏輯迴歸損失函數的優化方法,有四種算法可以選擇。

class_weight : dict or ‘balanced’, default: None
class_weight參數用於標示分類模型中各種類型的權重,可以不輸入,即不考慮權重,或者說所有類型的權重一樣。如果選擇輸入的話,可以選擇balanced讓類庫自己計算類型權重,或者我們自己輸入各個類型的權重,比如對於0,1的二元模型,我們可以定義class_weight={0:0.9, 1:0.1},這樣類型0的權重爲90%,而類型1的權重爲10%。
如果class_weight選擇balanced,那麼類庫會根據訓練樣本量來計算權重。某種類型樣本量越多,則權重越低;樣本量越少,則權重越高。當class_weight爲balanced時,類權重計算方法如下:n_samples / (n_classes * np.bincount(y))。n_samples爲樣本數,n_classes爲類別數量,np.bincount(y)會輸出每個類的樣本數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章