邏輯回歸
邏輯回歸,是一種名為“回歸”的線性分類器,其本質是由線性回歸變化而來的,一種廣泛使用于分類問題中的廣義回歸算法
其中??0被稱為截距(intercept), ??1~??n 被稱為系數(coefficient)
矩陣表示:
通過函數z,線性回歸使用輸入的特征矩陣X來輸出一組連續型的標簽值y_pred,以完成各種預測連續型變量的任務 (比如預測產品銷量,預測股價等等)。
標簽是離散型變量,如果是滿足0-1分布的離散型變量,使用邏輯回歸這個回歸模型
回歸模型可以實現分類效果, 使用sigmod函數
sigmod函數
線性回歸方程z變換為g(z),并且將g(z)的值分布在(0,1)之間,且當g(z)接近0時樣本的標簽為類別0,當g(z)接近1時樣本的標簽為類別1
e:e是自然對數的底數,是一個無限不循環小數,其值是2.71828...
函數解釋: Sigmoid函數是一個S型的函數,當自變量z趨近正無窮時,因變量g(z)趨近于1,而當z趨近負無窮時,g(z)趨近于0,它能夠將任何實數(非0和1的標簽數據)映射到(0,1)區間,使其可用于將任意值函數轉換為更適合二分類的函數
MinMaxScaler與Sigmoid的區別:MinMaxScaler歸一化之后,是可以取到0和1的(最大值歸一化后就是1,最小值歸一化后就是0),但Sigmoid函數只是無限趨近于0和1
#測試,查看sigmod函數是否可以將線性回歸返回的任意實數壓縮到0-1之間
import numpy as np
num=15
1/(1+(np.e**-num))
邏輯回歸和線性回歸之間的關聯
將 z=??Tx 代入
y(x)是邏輯回歸返回的標簽值 , y(x)的取值都在[0,1]之間 , y(x)和1-y(x)相加必然為1
形似幾率:y(x)/1-y(x)
y(x)邏輯回歸的形似幾率取對數的本質是線性回歸z,是在對線性回歸模型的預測結果取對數幾率來讓其的結果無限逼近0和1。因此,邏輯回歸又被稱為“對數幾率回歸“(logistic Regression )
邏輯回歸的形似幾率取對數就是線性回歸
-
線性回歸解的對數幾率就是邏輯回歸
因此邏輯回歸是由線性回歸變化而來的
線性回歸的核心任務是通過求解θ構建z這個預測函數,并希望預測函數z能夠盡量擬合數據
邏輯回歸的核心任務:求解θ來構建一個能夠盡量擬合數據的預測函數z,并通過向預測函數中輸入特征矩陣來獲取相應的標簽值y。
邏輯回歸的優點
-
邏輯回歸是一個受工業商業熱愛,使用廣泛的模型。
1.邏輯回歸對線性關系(特征與標簽之間的線性關系極強的數據)的擬合效果好.數據之間的聯系是非線性的,不要使用邏輯回歸!
2.邏輯回歸計算快:對于線性數據,邏輯回歸的擬合和計算都非???,計算效率優于SVM和隨機森林
3.邏輯回歸返回的分類結果不是固定的0,1,而是以小數形式呈現的類概率數字:我們因此可以把邏輯回歸返回的結果當成連續型數據來利用。
-
總結:
- 邏輯回歸的本質是一個返回對數幾率的在線性數據上表現優異的分類器,它主要被應用在金融領域。注意,雖然我們熟悉的邏輯回歸通常被用于處理二分類問題,但邏輯回歸也可以做多分類。
邏輯回歸的損失函數
-
在邏輯回歸分類的時候,不管原始樣本中的類別使用怎樣的值或者文字表示,邏輯回歸統一將其視為0類別和1類別。
- 由于邏輯回歸是用于分類的,因此該損失函數和線性回歸的損失函數是不一樣的,邏輯回歸采用的損失函數是:對數似然損失函數
注意:沒有求解參數需求的模型是沒有損失函數的,比如KNN,決策樹。
-
損失函數被寫作如下:
-
使用-log函數為損失函數的原因:損失函數的本質就是,預測對則沒有損失,反之則損失需要變的很大,而-log函數在[0,1]之間正好符合這一點。
-log(h)表示分類到正例1的損失
-log(1-h)表示分類到反例0的損失
-
損失函數表征預測值與真實值之間的差異程度,如果預測值與真實值越接近則損失函數應該越小
損失函數解釋
yilog(h)表示分類到真實標簽的正例的損失,根據-log函數得知如果分類正確則損失值小,反之損失大
-(1-yi)log(1-h)表示分類到真實標簽反例的損失,根據-log函數得知如果分類正確則損失小,反之損失大
兩者相加就獲得了邏輯回歸模型總分類結果的損失
-
將邏輯回歸對應的預測結果帶入損失函數:
8.png
梯度下降
邏輯回歸的數學目的是求解能夠讓模型最優化,擬合程度最好的參數??的值,即求解能夠讓損失函數J(??)最小化的??值。
梯度下降原理介紹
-
假設現在有一個帶兩個特征并且沒有截距的邏輯回歸y(x1,x2),兩個特征所對應的參數分別為[??1,??2]
損失函數 J(??1,??2)在以??1,??2和J為坐標軸的三維立體坐標系上的圖像:
梯度下降.gif
尋求的是損失函數的最小值,也就是圖像的最低點
梯度下降是在眾多[??1,??2]可能的值中遍歷,一次次求解坐標點的梯度向量,不斷讓損失函數的取值J逐漸逼近最小值,再返回這個最小值對應的參數取值[??1,??2]的過程。
正則化
-
注意:
- 避免出現模型在訓練集上表示優秀,卻在測試集上表現糟糕,模型就會出現過擬合的問題.因此出現正則化,正則化是用來防止模型過擬合的過程,常用的有L1正則化和L2正則化兩種選項,分別通過在損失函數后加上參數向量??的L1范式和L2范式的倍數來實現。這個增加的范式,被稱為“正則項”,也被稱為"懲罰項"。
-
L1范式
-
L1范式表現為參數向量??中的每個參數的絕對值之和
9.L1范式.png
-
-
L2范式
- L2范數表現為參數向量??中的每個參數的平方和的開方值
10.L2范式.png
J(??)是損失函數,C是用來控制正則化程度的超參數,n是方程中特征的總數,也是方程中參數的總數,j代表每個??參數(w系數)。j>=1,是因為我們的參數向量中,第一個參數是??0,是截距它通常是不參與正則化的。
-
總結:
我們知道損失函數的損失值越?。ㄔ谟柧毤蓄A測值和真實值越接近)則邏輯回歸模型就越有可能發生過擬合(模型只在訓練集中表現的好,在測試集表現的不好)的現象。通過正則化的L1和L2范式可以加入懲罰項C來矯正模型的擬合度。因為C越小則損失函數會越大表示正則化的效力越強,參數??會被逐漸壓縮的越來越小。
注意:L1正則化會將參數w壓縮為0,L2正則化只會讓參數盡量小,不會取到0。
-
L1和L2范式的區別
在L1正則化在逐漸加強的過程中,攜帶信息量小的、對模型貢獻不大的特征的參數w,會比攜帶大量信息的、對模型有巨大貢獻的特征的參數更快地變成0,所以L1正則化本質是一個特征選擇的過程。L1正則化越強,參數向量中就越多的參數為0,選出來的特征就越少,以此來防止過擬合。因此,如果特征量很大,數據維度很高,我們會傾向于使用L1正則化。
L2正則化在加強的過程中,會盡量讓每個特征對模型都有一些小的貢獻,但攜帶信息少,對模型貢獻不大的特征的參數w會非常接近于0。通常來說,如果我們的主要目的只是為了防止過擬合,選擇L2正則化就足夠了。但是如果選擇L2正則化后還是過擬合,模型在未知數據集上的效果表現很差,就可以考慮L1正則化。
建立兩個邏輯回歸,L1正則化和L2正則化的差別:
from sklearn.linear_model import LogisticRegression as LR
from sklearn.datasets import load_breast_cancer
import numpy as np
from sklearn.model_selection import train_test_split
#加載樣本數據
data = load_breast_cancer()
X = data.data
y = data.target
#建立兩種模型
lrl1 = LR(penalty="l1",C=0.1,solver="liblinear")
lrl2 = LR(penalty="l2",C=0.1)
#邏輯回歸的重要屬性coef_,查看每個特征所對應的參數
lrl1.fit(X,y)
print('L1范式:',lrl1.coef_)
lrl2 = lrl2.fit(X,y)
print('L2范式:',lrl2.coef_)
L1范式: [[ 0.61541583 0. 0.2536785 -0.00457022 0. 0.
0. 0. 0. 0. 0. 0.
0. -0.0491644 0. 0. 0. 0.
0. 0. 0.4536192 -0.13120128 -0.1414278 -0.02004643
0. 0. 0. 0. 0. 0. ]]
L2范式: [[ 0.57759855 0.1939224 0.32429513 -0.01172603 -0.01976427 -0.0961107
-0.13487158 -0.05670151 -0.02736746 -0.00534154 0.02389697 0.22340603
0.05462525 -0.08773606 -0.00185201 -0.02067312 -0.02868267 -0.00742861
-0.00660566 -0.00186004 0.60918523 -0.28469475 -0.20256723 -0.01543876
-0.03639686 -0.30101307 -0.37373944 -0.10976898 -0.08801033 -0.0282845 ]]
邏輯回歸API
from sklearn.linear_model import LogisticRegression
-
超參數介紹:
- penalty:
- 可以輸入l1或者l2來指定使用哪一種正則化方式。不填寫默認"l2"。 注意,若選擇"l1"正則化,參數solver僅能夠使用求解方式”liblinear"和"saga“,若使用“l2”正則 化,參數solver中所有的求解方式都可以使用。
- C:
- 懲罰項。必須是一個大于0的浮點數,不填寫默認1.0,即默認正則項與損失函數的比值是1:1。C越小,損失函數會越大,模型對損失函數的懲罰越重,正則化的效力越強,參數會逐漸被壓縮得越來越小。
- max_iter:
- 梯度下降中能走的最大步數,默認值為100.步數的不同取值可以幫助我們獲取不同的損失函數的損失值。計算出最優的max_iter的值,一般是通過繪制學習曲線對其進行取值。
- solver:
- 梯度下降法只是求解邏輯回歸參數??的一種方法。sklearn為我們提供了多種選擇,讓我們可以使用不同的求解器來計算邏輯回歸。求解器的選擇,由參數"solver"控制,共有五種選擇。
- liblinear:是二分類專用(梯度下降),也是現在的默認求解器。
-
lbfgs,newton-cg,sag,saga:是多分類專用,幾乎不用。
11.png
- 梯度下降法只是求解邏輯回歸參數??的一種方法。sklearn為我們提供了多種選擇,讓我們可以使用不同的求解器來計算邏輯回歸。求解器的選擇,由參數"solver"控制,共有五種選擇。
- multi_class:
- 輸入"ovr", "multinomial", "auto"來告知模型,我們要處理的分類問題的類型。默認是"ovr"。
- 'ovr':表示分類問題是二分類,或讓模型使用"一對多"的形式來處理多分類問題。
- 'multinomial':表示處理多分類問題,這種輸入在參數solver是'liblinear'時不可用。
- "auto":表示會根據數據的分類情況和其他參數來確定模型要處理的分類問題的類型。比如說,如果數據是二分類,或者solver的取值為"liblinear","auto"會默認選擇"ovr"。反之,則會選擇"multinomial"。
- class_weight:
- 表示樣本不平衡處理的參數。樣本不平衡指的是在一組數據中,某一類標簽天生占有很大的比例,或誤分類的代價很高
- None:
- 因此我們要使用參數class_weight對樣本標簽進行一定的均衡,給少量的標簽更多的權重,讓模型更偏向少數類, 向捕獲少數類的方向建模。該參數默認None,此模式表示自動給與數據集中的所有標簽相同的權重,即自動1: 1。
- balanced:
- 當誤分類的代價很高的時候,我們使用”balanced“模式,可以解決樣本不均衡問題。
- penalty:
乳腺癌數據集下,max_iter的學習曲線
%matplotlib inline
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
l2 = []
l2_test = []
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=420)
for i in np.arange(1,201,10):
lrl2 = LR(penalty="l2",solver="liblinear",C=0.9,max_iter=i)
lrl2.fit(Xtrain,Ytrain)
#模型在訓練集的表現
l2.append(accuracy_score(lrl2.predict(Xtrain),Ytrain))
#模型在測試集上的表現
l2_test.append(accuracy_score(lrl2.predict(Xtest),Ytest))
graph = [l2,l2_test]
color = ["black","red"]
label = ["L2train","L2test"]
plt.figure(figsize=(20,5))
for i in range(len(graph)):
plt.plot(np.arange(1,201,10),graph[i],color[i],label=label[i])
plt.legend(loc=4)
plt.xticks(np.arange(1,201,10))
plt.show()