對數幾率回歸
對數幾率回歸(logistic regression),又稱為邏輯回歸,雖然它的名字是“回歸”,但實際卻是一種分類學習方法,那為什么“回歸”?個人覺得是因為它跟線性回歸的公式有點關聯。 對數幾率函數是sigmoid函數。
1、模型
線性回歸:z=w∗x+b z = w*x+ bz=w∗x+b
邏輯回歸:y=11+e−z y = \frac{1}{1+e^{-z}}y=
1+e
−z
1
線性回歸只能做數值預測,不能做分類,而階躍函數y=sign(z) y = sign(z)y=sign(z)適合做二類分類:
y={0,1,z≤0z>0 y = \begin{cases}0, & {z≤0} \\1, & {z>0} \\\end{cases}y={
0,
1,
z≤0
z>0
但由於階躍函數是不連續的,不能單調可微,因此我們需要找一個代替函數,而對數幾率函數下是這樣一個常用的替代函數:
y=11+e−x y = \frac{1}{1+e^{-x}}
y=
1+e
−x
1
使用sigmoid函數有以下優點:
1、連續性好,單調可微
2、輸入值范圍(-∞,∞),輸出值范圍(0,1),滿足概率分布
2、損失函數
y=11+e−x y = \frac{1}{1+e^{-x}}y=
1+e
−x
1
可化為 lny1−y=x ln\frac{y}{1-y} = xln
1−y
y
=x 的形式,
顯然,如果將y yy視為樣本x xx作為正例的可能性,那1−y 1-y1−y是其反例的可能性,兩者的比值就是y1−y \frac{y}{1-y}
1−y
y
,稱之為“幾率”, lny1−y ln\frac{y}{1-y}ln
1−y
y
則是“對數幾率”。
那么,
正列的概率:p(y=1∣x)=11+e−x=ex1+ex p(y=1|x) = \frac{1}{1+e^{-x}} = \frac{e^x}{1+e^x}p(y=1∣x)=
1+e
−x
1
=
1+e
x
e
x
;記作:p1=ex1+ex p_1 = \frac{e^x}{1+e^x}p
1
=
1+e
x
e
x
反例的概率:p(y=0∣x)=e−x1+e−x=11+ex p(y=0|x) = \frac{e^{-x}}{1+e^{-x}} = \frac{1}{1+e^x}p(y=0∣x)=
1+e
−x
e
−x
=
1+e
x
1
.記作:p0=11+ex p_0 = \frac{1}{1+e^x}p
0
=
1+e
x
1
使用極大似然法估計參數,則我們要最大化函數
∏mi=1(yi∗p1+(1−yi)∗p0) \prod^m_{i=1}(y_i*p_1 + (1-y_i)*p_0)∏
i=1
m
(y
i
∗p
1
+(1−y
i
)∗p
0
)
但是,現實運用中,我們的數據有十幾萬,甚至幾百萬個,而概率的值在區間(0,1)內,這么多概率相乘,結果必然是非常非常之小,我們可以用和代替乘法,這樣就可以解決這個問題了:
我們知道ln(a∗b)=lna+lnb ln(a*b) = lna+lnbln(a∗b)=lna+lnb,所以我們對概率進行對數運算,我們要最大化以下概率函數
∑mi=1(yi∗lnp1+(1−yi)∗lnp0) \sum^m_{i=1}(y_i*lnp_1 + (1-y_i)*lnp_0)∑
i=1
m
(y
i
∗lnp
1
+(1−y
i
)∗lnp
0
)
但由於損失函數是要將值降到最低的,因此:
損失函數:
l(w,b)=−∑mi=1(yi∗lnp1+(1−yi)∗lnp0) l(w,b) = -\sum^m_{i=1}(y_i*lnp_1 + (1-y_i)*lnp_0)
l(w,b)=−
i=1
∑
m
(y
i
∗lnp
1
+(1−y
i
)∗lnp
0
)
化簡:
l(w,b)=−∑mi=1(yi∗lnp1+(1−yi)∗lnp0) l(w,b) = -\sum^m_{i=1}(y_i*lnp_1 + (1-y_i)*lnp_0)l(w,b)=−∑
i=1
m
(y
i
∗lnp
1
+(1−y
i
)∗lnp
0
)
=−∑mi=1(yi∗lnez1+ez+(1−yi)∗ln11+ez) = -\sum^{m}_{i=1}(y_i*ln\frac{e^z}{1+e^z}+ (1-y_i)*ln\frac{1}{1+e^z})=−∑
i=1
m
(y
i
∗ln
1+e
z
e
z
+(1−y
i
)∗ln
1+e
z
1
)
=−∑mi=1(yi∗ln(ez1+ez∗1+ez1)+ln11+ez) = -\sum^m_{i=1}(y_i*ln(\frac{e^z}{1+e^z}*\frac{1+e^z}{1})+ ln\frac{1}{1+e^z})=−∑
i=1
m
(y
i
∗ln(
1+e
z
e
z
∗
1
1+e
z
)+ln
1+e
z
1
)
=−∑mi=1(yi∗lnez+ln11+ez) = -\sum^m_{i=1}(y_i*lne^z+ ln\frac{1}{1+e^z})=−∑
i=1
m
(y
i
∗lne
z
+ln
1+e
z
1
)
=∑mi=1−yi∗z−ln11+ez = \sum^m_{i=1}-y_i*z - ln\frac{1}{1+e^z}=∑
i=1
m
−y
i
∗z−ln
1+e
z
1
=∑mi=1(−yi∗z+ln(1+ez)) = \sum^m_{i=1}(-y_i*z + ln(1+e^z))=∑
i=1
m
(−y
i
∗z+ln(1+e
z
))
=∑mi=1(−yi∗(w∗x+b)+ln(1+ew∗x+b)) = \sum^m_{i=1}(-y_i*(w*x+ b) + ln(1+e^{w*x+ b}))=∑
i=1
m
(−y
i
∗(w∗x+b)+ln(1+e
w∗x+b
))
根據凸優化理論,經典的數值優化算法如梯度下降法、牛頓法等都可求得其最優解。
3、scikit-learn中的對數幾率回歸
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(train_X, train_y)
4、LogisticRegression 參數說明
penalty:懲罰項,str類型,可選參數為l1和l2,默認為l2。用於指定懲罰項中使用的規范。newton-cg、sag和lbfgs求解算法只支持L2規范。L1G規范假設的是模型的參數滿足拉普拉斯分布,L2假設的模型參數滿足高斯分布,所謂的范式就是加上對參數的約束,使得模型更不會過擬合(overfit),但是如果要說是不是加了約束就會好,這個沒有人能回答,只能說,加約束的情況下,理論上應該可以獲得泛化能力更強的結果。
dual:對偶或原始方法,bool類型,默認為False。對偶方法只用在求解線性多核(liblinear)的L2懲罰項上。當樣本數量>樣本特征的時候,dual通常設置為False。
tol:停止求解的標准,float類型,默認為1e-4。就是求解到多少的時候,停止,認為已經求出最優解。
c:正則化系數λ的倒數,float類型,默認為1.0。必須是正浮點型數。像SVM一樣,越小的數值表示越強的正則化。
fit_intercept:是否存在截距或偏差,bool類型,默認為True。
intercept_scaling:僅在正則化項為”liblinear”,且fit_intercept設置為True時有用。float類型,默認為1。
class_weight:用於標示分類模型中各種類型的權重,可以是一個字典或者’balanced’字符串,默認為不輸入,也就是不考慮權重,即為None。如果選擇輸入的話,可以選擇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)會輸出每個類的樣本數,例如y=[1,0,0,1,1],則np.bincount(y)=[2,3]。
那么class_weight有什么作用呢?
在分類模型中,我們經常會遇到兩類問題:
第一種是誤分類的代價很高。比如對合法用戶和非法用戶進行分類,將非法用戶分類為合法用戶的代價很高,我們寧願將合法用戶分類為非法用戶,這時可以人工再甄別,但是卻不願將非法用戶分類為合法用戶。這時,我們可以適當提高非法用戶的權重。
第二種是樣本是高度失衡的,比如我們有合法用戶和非法用戶的二元樣本數據10000條,里面合法用戶有9995條,非法用戶只有5條,如果我們不考慮權重,則我們可以將所有的測試集都預測為合法用戶,這樣預測准確率理論上有99.95%,但是卻沒有任何意義。這時,我們可以選擇balanced,讓類庫自動提高非法用戶樣本的權重。提高了某種分類的權重,相比不考慮權重,會有更多的樣本分類划分到高權重的類別,從而可以解決上面兩類問題。
random_state:隨機數種子,int類型,可選參數,默認為無,僅在正則化優化算法為sag,liblinear時有用。
solver:優化算法選擇參數,只有五個可選參數,即newton-cg,lbfgs,liblinear,sag,saga。默認為liblinear。solver參數決定了我們對邏輯回歸損失函數的優化方法,有四種算法可以選擇,分別是:
liblinear:使用了開源的liblinear庫實現,內部使用了坐標軸下降法來迭代優化損失函數。
lbfgs:擬牛頓法的一種,利用損失函數二階導數矩陣即海森矩陣來迭代優化損失函數。
newton-cg:也是牛頓法家族的一種,利用損失函數二階導數矩陣即海森矩陣來迭代優化損失函數。
sag:即隨機平均梯度下降,是梯度下降法的變種,和普通梯度下降法的區別是每次迭代僅僅用一部分的樣本來計算梯度,適合於樣本數據多的時候。
saga:線性收斂的隨機優化算法的的變重。
總結:
liblinear適用於小數據集,而sag和saga適用於大數據集因為速度更快。
對於多分類問題,只有newton-cg,sag,saga和lbfgs能夠處理多項損失,而liblinear受限於一對剩余(OvR)。啥意思,就是用liblinear的時候,如果是多分類問題,得先把一種類別作為一個類別,剩余的所有類別作為另外一個類別。一次類推,遍歷所有類別,進行分類。
newton-cg,sag和lbfgs這三種優化算法時都需要損失函數的一階或者二階連續導數,因此不能用於沒有連續導數的L1正則化,只能用於L2正則化。而liblinear和saga通吃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正則化了。
max_iter:算法收斂最大迭代次數,int類型,默認為10。僅在正則化優化算法為newton-cg, sag和lbfgs才有用,算法收斂的最大迭代次數。
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了。
verbose:日志冗長度,int類型。默認為0。就是不輸出訓練過程,1的時候偶爾輸出結果,大於1,對於每個子模型都輸出。
warm_start:熱啟動參數,bool類型。默認為False。如果為True,則下一次訓練是以追加樹的形式進行(重新使用上一次的調用作為初始化)。
n_jobs:並行數。int類型,默認為1。1的時候,用CPU的一個內核運行程序,2的時候,用CPU的2個內核運行程序。為-1的時候,用所有CPU的內核運行程序。
---------------------
作者:火雞哥
來源:CSDN
原文:https://blog.csdn.net/u012587024/article/details/81456994
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!