2.邏輯迴歸算法梳理

一.信息論基礎

1.熵(信息論)

1948年,香農將統計物理中熵的概念,引申到信道通信的過程中,從而開創了”信息論“這門學科。香農定義的“熵”又被稱爲“香農熵” 或 “信息熵”, 即S(p1,p2,p3......pn)=Ki=1npilog2(pi)S(p_1,p_2,p_3......p_n) = -K\sum_{i=1}^np_ilog_2(p_i)其中i標記概率空間中所有可能的樣本, pip_i表示該樣本的出現機率,K是和單位選取相關的任意常數。舉個例子:

上圖來自https://blog.csdn.net/u011617765/article/details/88974769

當所有樣本等機率出現的情況下,熵達到最大值(所有可能的事件等概率時不確定性最高),對於樣本等機率分佈而言,樣本數越大,熵值越大(可能的時間越多,不確定性越高).

2.聯合熵

首先我們引入聯合分佈的概念,在這裏插入圖片描述
在這裏插入圖片描述

以上圖片來自http://www.cnblogs.com/vamei/p/3224111.html

對於[X=x,Y=y],我們尋找樣本空間中滿足這兩個取值的所有元素。這些元素構成一個樣本空間的子集,該子集的概率就是[P(X=x,Y=y)]的聯合概率。

聯合熵就是(x,y)每種情況下的離散熵的彙總即:
在這裏插入圖片描述

3.條件熵

條件熵也就是建立下條件分佈的基礎上,舉個例子,明天是晴天,那麼後天是晴天的概率.這就是一個條件概率,建立在明天是晴天的基礎概率上,預測後天也是晴天的概率.

條件熵的定義是:定義爲X給定條件下,Y的條件概率分佈的熵對X的數學期望
https://zhuanlan.zhihu.com/p/26551798 建議從例子開始看

也就是在對每個(X=x)的情況下,求出每種情況下的Y的熵 加總.

4.信息增益

https://zhuanlan.zhihu.com/p/26596036 推薦直接看例子

5.基尼不純度

https://blog.csdn.net/JJBOOM425/article/details/79997440
在這裏插入圖片描述

這裏的公式只能發生概率有關,與熵無關.比如

二.邏輯迴歸的原理

邏輯迴歸一般是針對分類問題,而線性迴歸一般是針對預測值問題.比如線性迴歸可以根據訓練集數據來預測房價的走勢,給出不同特徵值下的房價(即每次不同特徵都有可能給出不同的房價), 而邏輯迴歸就是分類判斷,比如給出一些人的特徵屬性,來判斷是否患有癌症,輸出的結果只有兩種,是和不是.

跟線性迴歸模型一樣,首先我們還是先建立線性迴歸模型即,
z=WX+bz=WX + b ,此時Z的輸出範圍還是沒有限制,這時候我們需要引入一個新函數,對這個線性模型做個變換,使得輸出值在[0,1]之間,就是sigmoid函數:
g(z)=11+xzg(z)=\frac{1}{1+x^{-z} } 函數圖像如下圖:在這裏插入圖片描述
可知 函數在z=0是,g(z)=0.5,在z趨向於正無窮時,g(z)趨向於1,在z趨向於負無窮時,g(z)趨向於0.在得到這個g(z)函數後,我們一般就會對這個函數的取值進行分類判斷,一般而言是以g(z)=0爲分界點,舉例而言,假設通過人的特徵屬性代入,我們得出g(z)=0.8>0.5,那我們認爲,這個人患有癌症,如果g(z)=0.3<0.5,那麼我們則認爲這個人沒有得癌症.(如果g(z)=0.5,可自行認定)

三.邏輯迴歸損失函數推導及優化

注意以下log 即爲In,是以e爲底數的.

1.損失函數

不同於線性迴歸損失函數 lossfunction=(Yiyi)2loss function = ( Y_i - y_i) ^ 2,邏輯迴歸的損失函數是 lossfunction={log(g(zi))y=1log(1g(zi))y=0 loss function=\begin{cases} -log(g(z_i)) &amp; y=1 \\ -log(1-g(z_i)) &amp; y=0 \end{cases}這裏g(z)代表預測的概率,y代表這個數據實際的分類.這裏爲什麼我們邏輯函數要用不同的損失函數,我個人認爲若直接(Yig(zi))2(Y_i-g(z_i))^2,那麼這個損失函數將會是非凸函數,即如下圖所示在這裏插入圖片描述
此圖來源自吳恩達-機器學習講義
那麼當我們運用梯度下降法去求優化的時候,很容易就陷入了局部最優,並不能達到全局最優,也就是我們求導的W,b並不是最優解.所以我們需要把損失函數構造成凸函數,使得圖像只存在全局最優,便於求得最優解.

所以現用的邏輯迴歸的損失函數是個凸函數符合我們的要求,現在我們在對這個損失函數進一步解讀,g(z)取值爲[0,1] 則上述兩個log函數也在[log0, log1]之間,即[-∞,0].當實際y=1,也就是分類爲1分類的時候,我們希望預測值(我們是根據g(z)函數進行預測)跟實際值相符,也就是我們希望g(z)也無限趨近於1,反之如果g(z)<0.5,則我們預測錯誤,我們會認爲這個是0分類.所以我們希望添加一個懲罰係數.也就是說當我們預測錯誤的時候會加大懲罰,預測正確的時候懲罰爲0,這個也就是引入log函數的意義,明顯我們知道當y=1的時候,我們預測也是1,則-log(g(z)->1)=0,也就是無懲罰,當y=1,我們預測是0,即-log(g(z)->0)–>∞,也就是預測概率完全爲0的時候,施加了一個無窮大的懲罰.
綜上,我們的損失函數既滿足了凸函數,又滿足了函數有強大的可解釋性.

2.代價函數

即cost function, 就是對損失函數的加總,因爲上面我們用的是分段函數,但是爲了便於求導,我們現在將分段函數合而一,即:yilog(g(zi))+(1yi)log(1g(zi))y_ilog(g(z_i))+(1 -y_i)log(1-g(z_i))現在我們將完整的代價函數寫出J(W,b)=1ni=1n(yilog(g(zi))+(1yi)log(1g(zi)))J(W,b)=-\frac{1}{n}\sum_{i=1}^n(y_ilog(g(z_i))+(1 -y_i)log(1-g(z_i)))

3.目標函數

目標函數則是在代價函數上再加上正則化項.這裏就不寫出了

四.正則化與模型評估指標

1.正則化

在上一章我們就提到了正則化,這裏再重複一遍

限制模型,降低過擬合風險的辦法我們成爲正則化(regularization).也就是在算法中增加參數用以降低(懲罰)W,b兩個參數對算法的影響水平.這個新增的參數若設定的大,那麼就是對(W,b)的懲罰大,也就是大幅降低他們本身對算法的影響,使得模型的斜率幾乎接近於0.如果設置的太低,那麼就幾乎對模型沒有影響,模型還是原本的過擬合情況

下面我們寫出在一般目標函數中的正則化項:λi=1n(Wi2+bi2)\lambda\sum_{i=1}^n(W_i^2+b_i^ 2)這裏的lambda就是我們說的參數.注意:正則項可以取不同的形式,在迴歸問題中一般取平方損失,就是參數的L2範數,當然你也可以取L1範數。(範數定義鏈接 https://baike.baidu.com/item/範數 L1範數=1-範數 L2範數=2-範數)

其中L2對異常值較爲敏感,若設置了很多個特徵且其中含有無用特徵,則L1範數,可以將特徵權重降爲0,稀疏化.

2.評估指標

(1).精度 (accuracy)

預測正確的樣本的佔總樣本的比例,取值範圍爲[0,1],取值越大,模型預測能力越好。

(2).F1 score

首先我們現引入四個概念

  • TP:True Positive,“真陽性” , 正確地判定了“得癌症”
  • FP:False Positive,“假陽性”, 錯誤地判定了“得癌症”
  • TN:True Negative,“真陰性”, 正確地判定了“沒得癌症”
  • FN:False Negative,“假陰性”, 錯誤地判定了“沒得癌症”

比如說預測未來會不會發生地震,本身地震發生的概率就是1%,那麼我們假定一個算法,不論輸入什麼返回的結果都是不會,那麼用準確率指標這個算法可以達到99%的準確率.但是顯然,這個算法很有問題.所以我們現在引入了這四個新概念,也就是假設總共有1000個樣本,然後裏面有10個樣本是發生了地震.依然使用上面那個算法,即1000個都是0.則TP=0, FP=0,TN=990,FN=10
我們在引入四個比率
誤檢率: falsepositiverate=FPFP+TNfalse |positive |rate =\frac{FP}{FP+TN}
查準率:precisionrate=TPTP+FP precision |rate= \frac{TP}{TP+FP}
查全率:recallrate=TPTP+FN recall| rate = \frac{TP}{TP+FN}
漏檢率:missrate=FNTP+FNmiss| rate =\frac{FN}{TP+FN}

則根據我們的算法得出,
誤檢率=0%, 查準率=0%, 查全率=0%,漏檢率=100%
可以看到通過這四個指標,我們的算法是非常差的.一般的,查準率和查全率互有衝突.也就是增加準確率會降低召回率,反之亦然。這叫做準確率與召
回率之間的折衷。
所以我們現在引入F1 score

在這裏插入圖片描述
F1 score 越大越好

(3).ROC 曲線

ROC曲線的橫座標爲false positive rate(FPR),縱座標爲 true positive rate(TPR) 當測試集中的正負樣本的分佈變化的時候,ROC曲線能夠保持不變。根據每個測試樣本屬於正樣本的概率值從大到小排序,依次將 “Score”值作爲閾值threshold,當測試樣本屬於正樣本的概率 大於或等於這個threshold時,認爲它爲正樣本,否則爲負樣本。

在這裏插入圖片描述
計算出ROC曲線下面的面積,就是AUC的值。 介於0.5和1.0之間,越大越好。

五.邏輯迴歸的優缺點

  • 優點
  1. 結果通俗易懂,自變量的係數直接與權重掛鉤,可以解釋爲自變量對目標
  2. 變量的預測價值大小
    3.** 速度快,效率高,並且容易線上算法實現,適合二分類問題 **
  3. 預測結果是界於0和1之間的概率
  4. 可以適用於連續性和類別性自變量
  • 缺點
  1. 目標變量中每個類別對應的樣本數量要充足,才支持建模。
  2. 要注意排除自變量中的共線性問題。
  3. 異常值會給模型帶來很大幹擾,應該刪除。
  4. 模型是線性分類器,容易欠擬合,分類精度不高

六.樣本不均衡問題解決辦法

在現實收集的樣本中,正負類別不均衡是現實數據中很常見的問題。一個分類器往往 Accuracy 將近90%,但是對少數樣本的判別的 Recall 卻只有10%左右。這對於我們正確找出少數類樣本非常不利。就如上面的地震發生率.
一般性解決方法如下:

  1. 欠採樣
    欠採樣(undersampling)法是去除訓練集內一些多數樣本,使得兩類數據量級接近,然後在正常進行學習
    這種方法的缺點是就是放棄了很多反例,這會導致平衡後的訓練集小於初始訓練集。而且如果採樣隨機丟棄反例,會損失已經收集的信息,往往還會丟失重要信息。
  2. 過採樣
    過採樣(oversampling)是對訓練集內的少數樣本進行擴充,既增加少數樣本使得兩類數據數目接近,然後再進行學習。
    簡單粗暴的方法是複製少數樣本,缺點是雖然引入了額外的訓練數據,但沒有給少數類樣本增加任何新的信息,非常容易造成過擬合。經過改進的過抽樣方法通過在少數類中加入隨機噪聲、干擾數據或通過一定規則產生新的合成樣本,例如SMOTE算法。
  3. 賦予正負例不同權重係數,比如Cost-Sensitive Learning
  4. 數據合成(data augmentation)人工合成一些新數據. 比如對同一張圖片進行剪切,翻轉,縮放 GAN(生成對抗學習)
  5. 組合/集成方法指的是在每次生成訓練集時使用所有分類中的小樣本量,同時從分類中的大樣本量中隨機抽取數據來與小樣本量合併構成訓練集,這樣反覆多次會得到很多訓練集和訓練模型。最後在應用時,使用組合方法(例如投票、加權投票等)產生分類預測結果。例如,在數據集中的正、負例的樣本分別爲100和10000條,比例爲1:100。此時可以將負例樣本(類別中的大量樣本集)隨機分爲100份(當然也可以分更多),每份100條數據;然後每次形成訓練集時使用所有的正樣本(100條)和隨機抽取的負樣本(100條)形成新的數據集。如此反覆可以得到100個訓練集和對應的訓練模型。
  6. 收集更多數據

七.sklearn.linear_model.LogisticRegression參數詳解

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: str型數據,參數只可設置爲’l1’或’l2’, 默認爲’l2’. 就是正則化參數選擇什麼類型.

dual:參數只可設置爲True或False, 默認爲False.用來指明是否將原問題改成他的對偶問題,對偶問題可以理解成相反問題,比如原問題是求解最大值的線性規劃,那麼他的對偶問題就是轉化爲求解最小值的線性規劃,適用於樣本較小的數據集,因樣本小時,計算複雜度較低。對偶問題 僅在使用liblinear優化器並且選擇L2範數的時候使用.當訓練集樣本數大於特徵數量的時候,建議設置dual爲False

C:浮點數,默認爲1.0.正則化係數lambda的倒數,必須是正值浮點數.跟SVM中的C類似,值越小正則化強度越大(越強越欠擬合)。

fit_intercept=True, 參數只可設置爲True或False, 默認爲True。確定是否在目標函數中加入偏置即(b)。

intercept_scaling=1, 浮點數,默認爲1.0。僅在使用“liblinear”且self.fit_intercept設置爲True時有用。

class_weight : 用來調節正負樣本比例的,默認是值爲None,也就是正負樣本的權重是一樣的.你可以以dict的形式({class_label: weight})給模型傳入任意你認爲合適的權重比,也可以輸入 “balanced” ,模型會根據正負樣本的絕對數量比來設定模型最後結果的權重比。
比如,有一數據集的正負樣本絕對數量比爲4:6,如果你給參數class_weight賦予balanced值,那麼最後模型結果中,正負樣本的權重比就會變成6:4。

在分類模型中,我們經常會遇到兩類問題:
第一種是誤分類的代價很高。比如對合法用戶和非法用戶進行分類,將非法用戶分類爲合法用戶的代價很高,我們寧願將合法用戶分類爲非法用戶,這時可以人工再甄別,但是卻不願將非法用戶分類爲合法用戶。這時,我們可以適當提高非法用戶的權重。
第二種是樣本是高度失衡的,比如我們有合法用戶和非法用戶的二元樣本數據10000條,裏面合法用戶有9995條,非法用戶只有5條,如果我們不考慮權重,則我們可以將所有的測試集都預測爲合法用戶,這樣預測準確率理論上有99.95%,但是卻沒有任何意義。這時,我們可以選擇balanced,讓類庫自動提高非法用戶樣本的權重。提高了某種分類的權重,相比不考慮權重,會有更多的樣本分類劃分到高權重的類別,從而可以解決上面兩類問題。
作者:Jark_
來源:CSDN
原文:https://blog.csdn.net/jark_/article/details/78342644
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接

max_iter : 算法收斂的最大迭代次數,即求取損失函數最小值的迭代次數,整數型.默認是100.僅在優化算法爲newton-cg, sag和lbfgs纔有用,算法收斂的最大迭代次數。

random_state : 整數型.隨機種子的設置,就是打亂訓練集的順序次數,默認是None,如果設置了隨機種子,那麼每次使用的訓練集和測試集都是一樣的,這樣不管你運行多少次,最後的準確率都是一樣的;如果沒有設置,那麼每次都是不同的訓練集和測試集,最後得出的準確率也是不一樣的。只對’sag’和’liblinear’ solver 生效.

solver :用來指明損失函數的優化方法,默認是‘liblinear’方法,可選 {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’},即總共四種優化算法.

  • 對於小數據集,'liblinear’是個好選擇,'sag’對大數據集更快
  • 對於多分類問題只能選擇, ‘newton-cg’, ‘lbfgs’, ‘sag’這三種, 'liblinear’只能限於OvR.
  • ‘newton-cg’, ‘lbfgs’, ‘sag’這三種只能用L2範數

注意:'sag’只在特徵都是差不多取值範圍的時候能夠快速收斂.所以用’sag’之前應該通過sklearn.preprocessing對數據進行預處理.

liblinear:使用了開源的liblinear庫實現,內部使用了座標軸下降法來迭代優化損失函數。
lbfgs:擬牛頓法的一種,利用損失函數二階導數矩陣即海森矩陣來迭代優化損失函數。
newton-cg:也是牛頓法家族的一種,利用損失函數二階導數矩陣即海森矩陣來迭代優化損失函數。
sag:即隨機平均梯度下降,是梯度下降法的變種,和普通梯度下降法的區別是每次迭代僅僅用一部分的樣本來計算梯度,適合於樣本數據多的時候。
總結:
liblinear適用於小數據集,而sag適用於大數據集因爲速度更快。
對於多分類問題,只有newton-cg,sag和lbfgs能夠處理多項損失,而liblinear受限於一對剩餘(OvR)。啥意思,就是用liblinear的時候,如果是多分類問題,得先把一種類別作爲一個類別,剩餘的所有類別作爲另外一個類別。一次類推,遍歷所有類別,進行分類。
newton-cg,sag和lbfgs這三種優化算法時都需要損失函數的一階或者二階連續導數,因此不能用於沒有連續導數的L1正則化,只能用於L2正則化。而liblinear通吃L1正則化和L2正則化。
同時,sag每次僅僅使用了部分樣本進行梯度迭代,所以當樣本量少的時候不要選擇它,而如果樣本量非常大,比如大於10萬,sag是第一選擇。但是sag不能用於L1正則化,所以當你有大量的樣本,又需要L1正則化的話就要自己做取捨了。要麼通過對樣本採樣來降低樣本量,要麼回到L2正則化。
從上面的描述,大家可能覺得,既然newton-cg, lbfgs和sag這麼多限制,如果不是大樣本,我們選擇liblinear不就行了嘛!錯,因爲liblinear也有自己的弱點!我們知道,邏輯迴歸有二元邏輯迴歸和多元邏輯迴歸。對於多元邏輯迴歸常見的有one-vs-rest(OvR)和many-vs-many(MvM)兩種。而MvM一般比OvR分類相對準確一些。鬱悶的是liblinear只支持OvR,不支持MvM,這樣如果我們需要相對精確的多元邏輯迴歸時,就不能選擇liblinear了。也意味着如果我們需要相對精確的多元邏輯迴歸不能使用L1正則化了。
作者:Jark_
來源:CSDN
原文:https://blog.csdn.net/jark_/article/details/78342644
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

tol: 浮點數,默認爲1e-4.停止求解的標準.就是目標函數求解到多少的時候,停止,認爲已經求出最優解。

multi_class : 分類方式選擇參數,str類型,可選參數爲ovr和multinomial,默認爲ovr.

ovr即前面提到的one-vs-rest(OvR),而multinomial即前面提到的many-vs-many(MvM)。如果是二元邏輯迴歸,ovr和multinomial並沒有任何區別,區別主要在多元邏輯迴歸上。
OvR和MvM有什麼不同?
OvR的思想很簡單,無論你是多少元邏輯迴歸,我們都可以看做二元邏輯迴歸。具體做法是,對於第K類的分類決策,我們把所有第K類的樣本作爲正例,除了第K類樣本以外的所有樣本都作爲負例,然後在上面做二元邏輯迴歸,得到第K類的分類模型。其他類的分類模型獲得以此類推。
而MvM則相對複雜,這裏舉MvM的特例one-vs-one(OvO)作講解。如果模型有T類,我們每次在所有的T類樣本里面選擇兩類樣本出來,不妨記爲T1類和T2類,把所有的輸出爲T1和T2的樣本放在一起,把T1作爲正例,T2作爲負例,進行二元邏輯迴歸,得到模型參數。我們一共需要T(T-1)/2次分類。
可以看出OvR相對簡單,但分類效果相對略差(這裏指大多數樣本分佈情況,某些樣本分佈下OvR可能更好)。而MvM分類相對精確,但是分類速度沒有OvR快。如果選擇了ovr,則4種損失函數的優化方法liblinear,newton-cg,lbfgs和sag都可以選擇。但是如果選擇了multinomial,則只能選擇newton-cg, lbfgs和sag了。
作者:Jark_
來源:CSDN
原文:https://blog.csdn.net/jark_/article/details/78342644
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

verbose : 日誌冗長度,int類型。默認爲0。0就是不輸出訓練過程,1的時候偶爾輸出結果,大於1,對於每個子模型都輸出.就是觀看每次迭代訓練的輸出結果.

warm_start : 是否使用上次的模型結果作爲初始化,默認是False,表示不使用。

n_jobs: int型數值 或者 None , 默認爲None.意思是程序運行的時候使用幾個CPU的核.只有當問題足夠大並且n_targets > 1 (個人認爲這個應該是n_jobs>1)的時候,這個才能起到加速作用. 除非是在joblib.parallel_backend 的環境下,否則None意味着只使用一個核進行計算. -1 意味着使用所有CPU核進行計算. 更多解釋詳見 Glossary.

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