一、邏輯迴歸基本概念
1. 什麼是邏輯迴歸
邏輯迴歸就是這樣的一個過程:面對一個迴歸或者分類問題,建立代價函式,然後通過優化方法迭代求解出最優的模型引數,然後測試驗證我們這個求解的模型的好壞。
Logistic迴歸雖然名字裡帶“迴歸”,但是它實際上是一種分類方法,主要用於兩分類問題(即輸出只有兩種,分別代表兩個類別)
迴歸模型中,y是一個定性變數,比如y=0或1,logistic方法主要應用於研究某些事件發生的概率
2. 邏輯迴歸的優缺點
優點:
1)速度快,適合二分類問題
2)簡單易於理解,直接看到各個特徵的權重
3)能容易地更新模型吸收新的資料
缺點:
對資料和場景的適應能力有侷限性,不如決策樹演算法適應性那麼強
3. 邏輯迴歸和多重線性迴歸的區別
Logistic迴歸與多重線性迴歸實際上有很多相同之處,最大的區別就在於它們的因變數不同,其他的基本都差不多。正是因為如此,這兩種迴歸可以歸於同一個家族,即廣義線性模型(generalizedlinear model)。
這一家族中的模型形式基本上都差不多,不同的就是因變數不同。這一家族中的模型形式基本上都差不多,不同的就是因變數不同。
- 如果是連續的,就是多重線性迴歸
- 如果是二項分佈,就是Logistic迴歸
- 如果是Poisson分佈,就是Poisson迴歸
- 如果是負二項分佈,就是負二項迴歸
4. 邏輯迴歸用途
- 尋找危險因素:尋找某一疾病的危險因素等;
- 預測:根據模型,預測在不同的自變數情況下,發生某病或某種情況的概率有多大;
- 判別:實際上跟預測有些類似,也是根據模型,判斷某人屬於某病或屬於某種情況的概率有多大,也就是看一下這個人有多大的可能性是屬於某病。
5. Regression 常規步驟
- 尋找h函式(即預測函式)
- 構造J函式(損失函式)
- 想辦法使得J函式最小並求得迴歸引數(θ)
6. 構造預測函式h(x)
1) Logistic函式(或稱為Sigmoid函式),函式形式為:
對於線性邊界的情況,邊界形式如下:
其中,訓練資料為向量:
最佳引數:
構造預測函式為:
函式h(x)的值有特殊的含義,它表示結果取1的概率,因此對於輸入x分類結果為類別1和類別0的概率分別為:
$P(y=1|x;\theta )=h_{\theta }(x)$
$P(y=0|x;\theta )=1-h_{\theta }(x)$
7.構造損失函式J(m個樣本,每個樣本具有n個特徵)
Cost函式和J函式如下,它們是基於最大似然估計推導得到的。
8. 損失函式詳細推導過程
1) 求代價函式
概率綜合起來寫成:
取似然函式為:
對數似然函式為:
最大似然估計就是求使l(θ)取最大值時的θ,其實這裡可以使用梯度上升法求解,求得的θ就是要求的最佳引數。
在Andrew Ng的課程中將J(θ)取為下式,即:
2) 梯度下降法求解最小值
θ更新過程可以寫成:
9. 向量化
ectorization是使用矩陣計算來代替for迴圈,以簡化計算過程,提高效率。
向量化過程:
約定訓練資料的矩陣形式如下,x的每一行為一條訓練樣本,而每一列為不同的特稱取值:
g(A)的引數A為一列向量,所以實現g函式時要支援列向量作為引數,並返回列向量。
θ更新過程可以改為:
綜上所述,Vectorization後θ更新的步驟如下:
- 求 A=x*θ
- 求 E=g(A)-y
- 求:
10.正則化
(1) 過擬合問題
過擬合即是過分擬合了訓練資料,使得模型的複雜度提高,繁華能力較差(對未知資料的預測能力)
下面左圖即為欠擬合,中圖為合適的擬合,右圖為過擬合。
(2)過擬合主要原因
過擬合問題往往源自過多的特徵
解決方法
1)減少特徵數量(減少特徵會失去一些資訊,即使特徵選的很好)
- 可用人工選擇要保留的特徵;
- 模型選擇演算法;
2)正則化(特徵較多時比較有效)
- 保留所有特徵,但減少θ的大小
(3)正則化方法
正則化是結構風險最小化策略的實現,是在經驗風險上加一個正則化項或懲罰項。正則化項一般是模型複雜度的單調遞增函式,模型越複雜,正則化項就越大。
正則項可以取不同的形式,在迴歸問題中取平方損失,就是引數的L2範數,也可以取L1範數。取平方損失時,模型的損失函式變為:
lambda是正則項係數:
- 如果它的值很大,說明對模型的複雜度懲罰大,對擬合資料的損失懲罰小,這樣它就不會過分擬合資料,在訓練資料上的偏差較大,在未知資料上的方差較小,但是可能出現欠擬合的現象;
- 如果它的值很小,說明比較注重對訓練資料的擬合,在訓練資料上的偏差會小,但是可能會導致過擬合。
正則化後的梯度下降演算法θ的更新變為:
部分內容參考自:http://blog.csdn.net/pakko/article/details/37878837
二、Python實現邏輯迴歸
from sklearn.linear_model import LogisticRegression Model = LogisticRegression() Model.fit(X_train, y_train) Model.score(X_train,y_train) # Equation coefficient and Intercept Print(‘Coefficient’,model.coef_) Print(‘Intercept’,model.intercept_) # Predict Output Predicted = Model.predict(x_test)
轉載於:https://blog.csdn.net/chibangyuxun/article/details/53148005