1. 程式人生 > >2.邏輯回歸算法梳理

2.邏輯回歸算法梳理

優缺點 hub XML lan 損失函數 .py 兩個 矩陣 thml

學習內容:

1、邏輯回歸與線性回歸的聯系與區別

2、 邏輯回歸的原理

3、邏輯回歸損失函數推導及優化

4、 正則化與模型評估指標

5、邏輯回歸的優缺點

6、樣本不均衡問題解決辦法

7. sklearn參數

參考資料

1、西瓜書 2、cs229吳恩達機器學習課程 3、 李航統計學習 4、谷歌搜索


一、邏輯回歸與線性回歸的聯系與區別

應用場景:線性回歸主要用來解決連續值預測的問題,邏輯回歸用來解決分類的問題,輸出的屬於某個類別的概率。

參數估計:

1、線性回歸中使用的是最小化平方誤差損失函數,對偏離真實值越遠的數據懲罰越嚴重。這樣做會有什麽問題呢?假如使用線性回歸對{0,1}二分類問題做預測,則一個真值為1的樣本,其預測值為50,那麽將會對其產生很大的懲罰,這也和實際情況不符合,更大的預測值說明為1的可能性越大,而不應該懲罰的越嚴重。

2、邏輯回歸使用對數似然函數進行參數估計,使用交叉熵作為損失函數,對預測錯誤的懲罰是隨著輸出的增大,逐漸逼近一個常數,這就不存在上述問題了

2、 邏輯回歸的原理

面對一個回歸或者分類問題,建立代價函數,然後通過優化方法叠代求解出最優的模型參數,然後測試驗證我們這個求解的模型的好壞。

Logistic回歸雖然名字裏帶“回歸”,但是它實際上是一種分類方法,主要用於兩分類問題(即輸出只有兩種,分別代表兩個類別)

回歸模型中,y是一個定性變量,比如y=0或1,logistic方法主要應用於研究某些事件發生的概率

3、邏輯回歸損失函數推導及優化

概率損失函數:P(y|x,θ) = (hθ

(x))y * (1-hθ(x))1-y

取對數後得到對數似然函數:l(θ) = ∑(y*hθ(x) + (1-y)(1-hθ(x))

最大似然估計就是要求得使 l(θ)取最大值時的 θ ,這裏可以使用梯度上升法求解。我們稍微變換一下:

J(θ)=1/m * l(θ)

優化方法:J(θ) = l(θ) + 1/m * ∑ θ2

4、 正則化與模型評估指標

(1) 過擬合問題
過擬合即是過分擬合了訓練數據,使得模型的復雜度提高,繁華能力較差(對未知數據的預測能力)

(2)過擬合主要原因
過擬合問題往往源自過多的特征
解決方法
1)減少特征數量(減少特征會失去一些信息,即使特征選的很好)
• 可用人工選擇要保留的特征;
• 模型選擇算法;
2)正則化(特征較多時比較有效)
• 保留所有特征,但減少θ的大小

(3)正則化方法
正則化是結構風險最小化策略的實現,是在經驗風險上加一個正則化項或懲罰項。正則化項一般是模型復雜度的單調遞增函數,模型越復雜,正則化項就越大。

正則項可以取不同的形式,在回歸問題中取平方損失,就是參數的L2範數,也可以取L1範數。取平方損失時,模型的損失函數變為:

J(θ) = l(θ) + 1/m * ∑ θ2

lambda是正則項系數:
• 如果它的值很大,說明對模型的復雜度懲罰大,對擬合數據的損失懲罰小,這樣它就不會過分擬合數據,在訓練數據上的偏差較大,在未知數據上的方差較小,但是可能出現欠擬合的現象;
• 如果它的值很小,說明比較註重對訓練數據的擬合,在訓練數據上的偏差會小,但是可能會導致過擬合。
正則化後的梯度下降算法θ的更新變為:

θ = θ - λ/m *∑ (h(x)-y)*x - λ/m * θ

5、邏輯回歸的優缺點

優點:
1)速度快,適合二分類問題
2)簡單易於理解,直接看到各個特征的權重
3)能容易地更新模型吸收新的數據
缺點:
對數據和場景的適應能力有局限性

6、樣本不均衡問題解決辦法

1) 擴大數據集
  當遇到類別不均衡問題時,首先應該想到,是否可能再增加數據(一定要有小類樣本數據),更多的數據往往戰勝更好的算法。因為機器學習是使用現有的數據多整個數據的分布進行估計,因此更多的數據往往能夠得到更多的分布信息,以及更好分布估計。即使再增加小類樣本數據時,又增加了大類樣本數據,也可以使用放棄一部分大類數據(即對大類數據進行欠采樣)來解決。
2)嘗試其它評價指標
  從前面的分析可以看出,準確度這個評價指標在類別不均衡的分類任務中並不能work,甚至進行誤導(分類器不work,但是從這個指標來看,該分類器有著很好的評價指標得分)。因此在類別不均衡分類任務中,需要使用更有說服力的評價指標來對分類器進行評價。

3)對數據集進行重采樣
  可以使用一些策略該減輕數據的不平衡程度。該策略便是采樣(sampling),主要有兩種采樣方法來降低數據的不平衡性。

  對小類的數據樣本進行采樣來增加小類的數據樣本個數,即過采樣(over-sampling ,采樣的個數大於該類樣本的個數)。
  對大類的數據樣本進行采樣來減少該類數據樣本的個數,即欠采樣(under-sampling,采樣的次數少於該類樣本的個素)。
  采樣算法往往很容易實現,並且其運行速度快,並且效果也不錯。更詳細的內容參見這裏。
  一些經驗法則:  考慮對大類下的樣本(超過1萬、十萬甚至更多)進行欠采樣,即刪除部分樣本;  考慮對小類下的樣本(不足1為甚至更少)進行過采樣,即添加部分樣本的副本;

  考慮嘗試隨機采樣與非隨機采樣兩種采樣方法;
  考慮對各類別嘗試不同的采樣比例,比一定是1:1,有時候1:1反而不好,因為與現實情況相差甚遠;
  考慮同時使用過采樣與欠采樣。
4)嘗試產生人工數據樣本
  一種簡單的人工樣本數據產生的方法便是,對該類下的所有樣本每個屬性特征的取值空間中隨機選取一個組成新的樣本,即屬性值隨機采樣。你可以使用基於經驗對屬性值進行隨機采樣而構造新的人工樣本,或者使用類似樸素貝葉斯方法假設各屬性之間互相獨立進行采樣,這樣便可得到更多的數據,但是無法保證屬性之前的線性關系(如果本身是存在的)。
  有一個系統的構造人工數據樣本的方法SMOTE(Synthetic Minority Over-sampling Technique)。SMOTE是一種過采樣算法,它構造新的小類樣本而不是產生小類中已有的樣本的副本,即該算法構造的數據是新樣本,原數據集中不存在的。該基於距離度量選擇小類別下兩個或者更多的相似樣本,然後選擇其中一個樣本,並隨機選擇一定數量的鄰居樣本對選擇的那個樣本的一個屬性增加噪聲,每次處理一個屬性。這樣就構造了更多的新生數據。具體可以參見原始論文。
5)嘗試不同的分類算法
  強烈建議不要對待每一個分類都使用自己喜歡而熟悉的分類算法。應該使用不同的算法對其進行比較,因為不同的算法使用於不同的任務與數據。具體可以參見“Why you should be Spot-Checking Algorithms on your Machine Learning Problems”。
  決策樹往往在類別不均衡數據上表現不錯。它使用基於類變量的劃分規則去創建分類樹,因此可以強制地將不同類別的樣本分開。目前流行的決策樹算法有:C4.5、C5.0、CART和Random Forest等。基於R編寫的決策樹參見這裏。
6)嘗試對模型進行懲罰
  你可以使用相同的分類算法,但是使用一個不同的角度,比如你的分類任務是識別那些小類,那麽可以對分類器的小類樣本數據增加權值,降低大類樣本的權值(這種方法其實是產生了新的數據分布,即產生了新的數據集,譯者註),從而使得分類器將重點集中在小類樣本身上。一個具體做法就是,在訓練分類器時,若分類器將小類樣本分錯時額外增加分類器一個小類樣本分錯代價,這個額外的代價可以使得分類器更加“關心”小類樣本。如penalized-SVM和penalized-LDA算法。
  Weka中有一個懲罰模型的通用框架CostSensitiveClassifier,它能夠對任何分類器進行封裝,並且使用一個自定義的懲罰矩陣對分錯的樣本進行懲罰。
  如果你鎖定一個具體的算法時,並且無法通過使用重采樣來解決不均衡性問題而得到較差的分類結果。這樣你便可以使用懲罰模型來解決不平衡性問題。但是,設置懲罰矩陣是一個復雜的事,因此你需要根據你的任務嘗試不同的懲罰矩陣,並選取一個較好的懲罰矩陣。

7. sklearn參數

class sklearn.linear_model.LogisticRegression(

penalty=’l2’, 參數類型:str,可選:‘l1’ or ‘l2’, 默認: ‘l2’。該參數用於確定懲罰項的範數

dual=False, 參數類型:bool,默認:False。雙重或原始公式。使用liblinear優化器,雙重公式僅實現l2懲罰。

tol=0.0001, 參數類型:float,默認:e-4。停止優化的錯誤率

C=1.0, 參數類型:float,默認;1。正則化強度的導數,值越小強度越大。

fit_intercept=True, 參數類型:bool,默認:True。確定是否在目標函數中加入偏置。

intercept_scaling=1, 參數類型:float,默認:1。僅在使用“liblinear”且self.fit_intercept設置為True時有用。

class_weight=None, 參數類型:dict,默認:None。根據字典為每一類給予權重,默認都是1.

random_state=None, 參數類型:int,默認:None。在打亂數據時,選用的隨機種子。

solver=’warn’, 參數類型:str,可選:{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’}, 默認:liblinear。選用的優化器。

max_iter=100, 參數類型:int,默認:100。叠代次數。multi_class=’warn’, 參數類型:str,可選:{‘ovr’, ‘multinomial’, ‘auto’},默認:ovr。如果選擇的選項是‘ovr‘,

  那麽二進制問題適合每個標簽。對於“多項式”,最小化的損失是整個概率分布中的多項式損失擬合,即使數據是二進制的。當solver  =‘liblinear‘時,‘multinomial‘不

  可用。如果數據是二進制的,或者如果solver =‘liblinear‘,‘auto‘選擇‘ovr‘,否則選擇‘multinomial‘。

verbose=0, 參數類型:int,默認:0。對於liblinear和lbfgs求解器,將詳細設置為任何正數以表示詳細程度。

warm_start=False, 參數類型:bool,默認:False。是否使用之前的優化器繼續優化。

n_jobs=None,參數類型:bool,默認:None。是否多線程

)

參考:

https://blog.csdn.net/chibangyuxun/article/details/53148005

https://blog.csdn.net/heyongluoyao8/article/details/49408131

2.邏輯回歸算法梳理