前面介紹了機器學習中最簡單的線性迴歸模型,機器學習第一篇——線性模型。今天,我們就來看看傳說中的邏輯迴歸(logistic regression)。
大家首先想一想,如果我們想要用已求得的線性模型來完成對樣本的二分類,一個最簡單的做法如下。
這樣雖然可以完成對數據樣本的分類,但這樣的分類有許多的弊端:
- 沒有體現輸出值越大的樣本屬於正樣本的可能性越大;
- 分類函數其實是單位階躍函數,不具有連續、可導的性質。
爲了解決以上兩點的弊端,我們試圖找到一個分類函數,希望它在作用上和單位階躍函數類似,但具有連續、可導的性質。這樣就引出了對數機率函數(logistic function) ,它的函數圖像如下。
它在x>0時輸出大於0.5,我們可以設爲正樣本,並且x越大,輸出越接近1,則認爲樣本屬於正樣本的概率越大。在x<0的情況類似。我們利用這個函數進行分類的原理如下。
那麼問題就來了,假設我們有一批已知分類的數據樣本,我們通過什麼辦法求出W和b呢。我們可以利用極大似然的思想,就是讓每個數據樣本屬於其真實分類的概率越大越好。具體做法如下。
我們的目標就是max lnL(w,b)。具體的解法如下。
好了,到此爲止,邏輯迴歸的原理就講清楚了。下面我們來看看如何使用scikit-learn上的LogisticRegression。一個簡單的例子如下。
from sklearn.linear_model import LogisticRegression
XTrain = [[0,0],[1,1]]
YTrain = [0,1]
reg = LogisticRegression()
reg.fit(XTrain, YTrain)
print(reg.score(XTrain,YTrain))
下面對LogisticRegression中的參數進行說明:
Parameters:
penalty : str, ‘l1’ or ‘l2’, default: ‘l2’
選擇以哪種方式進行正則化,有 ‘l1’ 和 ‘l2’兩種選擇,分別對應L1和L2的正則化,默認 ‘l2’。正則化的主要作用是緩解模型過擬合問題。
tol : float, default: 1e-4
算法停止的容忍標準,當相鄰的兩個迭代差小於該值是,算法停止運行。
C : float, default: 1.0
正則化係數λ的倒數,C越小,正則化力度越大。
fit_intercept : bool, default: True
和線性迴歸一樣,是否使用獨立變量b。
class_weight : dict or ‘balanced’, default: None
class_weight參數用於標示分類模型中各種類別的權重,可以不輸入,即不考慮權重,或者說所有類別的權重一樣。如果選擇輸入的話,可以選擇balanced讓類庫自己計算類型權重,或者我們自己輸入各個類型的權重,比如對於0,1的二元分類模型,我們可以定義class_weight={0:0.9, 1:0.1},這樣類別0的權重爲90%,而類別1的權重爲10%。
如果class_weight選擇balanced,那麼類庫會根據訓練樣本量來計算權重。某種類型樣本量越多,則權重越低,樣本量越少,則權重越高。
該參數的主要作用:
第一種是誤分類的代價很高。比如對癌症患者和非癌症患者進行分類,將癌症患者分類爲非癌症患者的代價很高,因爲這樣的錯分
可以會使一個患者沒有得到及時的治療。但將非癌症患者分類爲癌症患者則沒有那麼嚴重,這樣再進行檢查就能知道錯分了。此時,我們可以適當提高癌症患者的權重。
第二種是樣本是高度失衡的,比如我們有合法用戶和非法用戶的二元樣本數據10000條,裏面合法用戶有9995條,非法用戶只有5條,如果我們不考慮權重,則我們可以將所有的測試集都預測爲合法用戶,這樣預測準確率理論上有99.95%,但是卻沒有任何意義。這時,我們可以選擇balanced,讓類庫自動提高非法用戶樣本的權重。
solver : {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’}
選擇求解優化問題的方法。默認‘liblinear’。
liblinear:使用了開源的liblinear庫實現,內部使用了座標軸下降法來迭代優化損失函數。
lbfgs:擬牛頓法的一種,利用損失函數二階導數矩陣即海森矩陣來迭代優化損失函數。
newton-cg:也是牛頓法家族的一種,利用損失函數二階導數矩陣即海森矩陣來迭代優化損失函數。
sag:即隨機平均梯度下降,是梯度下降法的變種,和普通梯度下降法的區別是每次迭代僅僅用一部分的樣本來計算梯度,適合於樣本數據多的時候。
max_iter : int, default: 100
算法執行的最大迭代次數。只適用於solver 取值爲 newton-cg, sag and lbfgs。
multi_class : str, {‘ovr’, ‘multinomial’}, default: ‘ovr’
多分類問題的解決方法。ovr對應one-vs-rest方法,multinomial對應MvM方法。
Attributes:
coef_ : array, shape (1, n_features) or (n_classes, n_features)
模型的參數,即W向量。
intercept_ : array, shape (1,) or (n_classes,)
模型的截距,即獨立變量b。
Methods:
fit
(X, y[, sample_weight])
利用數據樣本X,y擬合模型,求出模型的W和b。
predict
(X)
對數據樣本X進行預測,返回對應的分類。
對數據樣本X進行預測,返回樣本屬於每一個分類的概率。
score
(X, y[, sample_weight])
計算模型在數據樣本X,y上的得分。
以上就是本次的全部內容。喜歡我的請關注微信公衆號:追夢程序員。