- Python機器學習(原書第3版)
- (美)塞巴斯蒂安·拉施卡 瓦希德·米爾賈利利
- 5049字
- 2021-06-11 16:13:40
3.3 基于邏輯回歸的分類概率建模
雖然感知器規則提供了良好且易用的入門級機器學習分類算法,但其最大缺點是,如果類不是完全線性可分的,那么它將永遠不收斂。前一節的分類任務就是該場景的一個示例。直觀地說,原因是權重在不斷更新,因為每次迭代至少會有一個錯誤分類樣本存在。當然,我們也可以改變學習速率,增加迭代次數,但是要小心感知器永遠都不會在該數據集上收斂。
為了提高效率,現在讓我們來看看邏輯回歸,這是一種簡單且強大的解決線性二元分類問題的算法。不要望文生義,邏輯回歸是一種分類模型,但不是回歸模型。
3.3.1 邏輯回歸與條件概率
邏輯回歸是一種很容易實現的分類模型,但僅在線性可分類上表現不錯。它是行業中應用最廣泛的分類算法之一。與感知器和Adaline類似,本章所介紹的邏輯回歸模型也是一個用于二元分類的線性模型。
用于多元分類的邏輯回歸
請注意,邏輯回歸可以很容易地推廣到多元分類,這被稱為多項式邏輯回歸或softmax回歸。關于多項式邏輯回歸的更詳細的討論超出了本書的范圍,但是感興趣的讀者可以在我的講稿中找到更多的信息(https://sebastianraschka.com/pdf/lecture-notes/stat479ss19/L05_gradient-descent_slides.pdf或http://rasbt.github.io/mlxtend/user_guide/classifier/SoftmaxRegression/)。
在多元分類設置中使用邏輯回歸的另外一種方法是利用之前討論過的OvR技術。
要解釋作為概率模型的邏輯回歸原理,首先要介紹讓步比(odds),即某一特定事件發生的概率。讓步比可以定義為,p代表正事件的概率。正事件并不一定意味著好,它指的是要預測的事件,例如,病人有某種疾病的可能性;可以認為正事件的分類標簽y=1。可以進一步定義logit函數,這僅僅是讓步比的對數形式(log-odds):
注意log是自然對數,與計算機科學中的通用慣例一致。logit函數的輸入值取值在0到1之間,并將其轉換為整個實數范圍的值,可以用它來表示特征值和對數概率(log-odds)之間的線性關系:

這里p(y=1|x)是給定特征x,某個特定樣本屬于類1的條件概率。
實際上,我們感興趣的是預測某個樣本屬于某個特定類的概率,它是logit函數的逆函數。
這也被稱為邏輯sigmoid函數,由于其特別的S形,有時簡稱為sigmoid函數或S形函數:
其中z為凈輸入,是權重和樣本特征的線性組合:
z=wTx=w0x0+w1x1+…+wmxm
注意,與第2章中用過的約定類似,w0代表偏置單元,是為x0提供的額外輸入值,其值為1。
現在用-7到7之間的一些值簡單地繪出sigmoid函數來觀察具體的情況:

執行前面的示例代碼,現在我們應該能看到S形曲線,如圖3-2所示。

圖 3-2
從圖3-2可以看出,當z趨向無限大時(z→∞),?(z)的值接近于1,因為當z值很大時,e-z的值會變得非常小。類似地,作為越來越大的分母,當z→∞時,?(z)的值趨于0。因此得出這樣的結論:sigmoid函數將以實數值作為輸入,并在截距為?(z)=0.5時轉換為[0,1]范圍內的值。
為了直觀地理解邏輯回歸模型,我們可以把它與第2章介紹的Adaline聯系起來。在Adaline中,用恒等函數?(z)=z作為激活函數。在邏輯回歸中,只是簡單地將前面定義的sigmoid函數作為激活函數。Adaline和邏輯回歸的區別如圖3-3所示。

圖 3-3
sigmoid函數的輸出則被解釋為特定樣本屬于類1的概率,?(z)=P(y=1|x;w),假設特征x被權重w參數化。例如,對于某種花的樣本,計算出?(z)=0.8,說明該樣本屬于Iris-versicolor
的機會為80%。因此,該樣本屬于Iris-setosa
的概率可以計算為P(y=0|x;w)=1-P(y=1|x;w)=0.2或者20%。預測概率可以通過閾值函數簡單地轉換為二元輸出:

前面的sigmoid函數圖等同于下述結果:

事實上,對于許多應用實踐來說,我們不僅對預測分類標簽感興趣,而且對估計類成員概率也特別有興趣(應用閾值函數之前sigmoid函數的輸出)。例如,天氣預報用邏輯回歸不僅能預測某天是否會下雨,而且還能預報下雨的可能性。同樣,可以用邏輯回歸來預測病人有特定疾病某些癥狀的機會,這就是邏輯回歸在醫學領域備受歡迎的原因。
3.3.2 學習邏輯代價函數的權重
學習了如何使用邏輯回歸模型來預測概率和分類標簽,現在簡要討論一下如何擬合模型的參數(例如前一章的權重w)上一章代價函數定義為誤差平方和:

為了在Adaline分類模型中學習權重w,我們簡化了函數。要解釋清楚如何得到邏輯回歸的代價函數,在建立邏輯回歸模型時,需要首先定義最大似然函數L,假設數據集中的每個樣本都是相互獨立的。公式為:

在實踐中,很容易最大化該方程的自然對數(求其最大值),故定義了對數似然函數:

首先,應用對數函數降低數值下溢的可能性,這種情況在似然率非常小的情況下可能發生。其次,假如你還記得微積分的話,可以把因子乘積轉換成因子求和,這樣就可以通過加法技巧更容易地得到該函數的導數。
現在可以用梯度上升等優化算法最大化這個對數似然函數。另外一個選擇是改寫對數似然函數作為代價函數J,就像在第2章中那樣,用梯度下降方法最小化代價函數J:

為了能更好地理解這個代價函數,讓我們計算一個訓練樣本的代價:
J(?(z),y;w)=-ylog(?(z))-(1-y)log(1-?(z))
從上面的方程可以看到,如果y=0,第一項為零,如果y=1,第二項為零:

通過下述簡短的代碼繪制一張圖,以說明對于不同的?(z)值,分類一個訓練樣本的代價:

圖3-4繪制了0到1范圍內(sigmoid函數的輸入值z的范圍為-10到10),x軸的sigmoid激活函數y軸是相關聯的邏輯代價。

圖 3-4
從圖3-4可以看到,如果正確地預測樣本屬于類1,代價就會接近0(實線)。類似地,可以在y軸上看到,如果正確地預測y=0(虛線),那么代價也接近0。然而,如果預測錯誤,代價就會趨于無窮大。關鍵就在于用越來越大的代價懲罰錯誤的預測。
3.3.3 將Adaline實現轉換為一個邏輯回歸算法
如果要自己動手實現邏輯回歸,可以直接用新的代價函數取代第2章Adaline實現中的代價函數J:

在對訓練樣本進行分類的過程中,用該公式來計算每次迭代的代價。另外,需要用sigmoid激活函數替換線性激活函數,同時改變閾值函數,返回類標簽0和1,而不是返回-1和1。如果能在Adaline編碼中完成這三步,即可獲得下述邏輯回歸的代碼實現:


當擬合邏輯回歸模型時,必須記住該模型只適用于二元分類。
所以,只考慮Iris-setosa
和Iris-versicolor
兩種花(類0
和類1
),并驗證邏輯回歸的有效性:

運行上述代碼可以繪制如圖3-5所示的決策區域圖。

圖 3-5
邏輯回歸的梯度下降學習算法
應用微積分可以發現,梯度下降邏輯回歸過程中的權重更新相當于第2章討論Adaline時用過的方程。但是要注意的是,下面的梯度下降學習規則推導是為那些對邏輯回歸梯度下降學習規則的原理感興趣的讀者而準備的,并非學習本章其余部分的必要條件。
首先從計算對數似然函數的偏導數開始:

在繼續我們的討論之前,先計算sigmoid函數的偏導數:

現在可以在第一個等式中替換,得到下列等式;

記住,目的是要找出可以最大化對數似然的權重,這樣我們就可以通過下列方式更新每個權重:

因為要更新所有的權重,所以把通用的更新規則表達如下:
w:=w+Δw
我們把Δw定義為:
Δw=η▽l(w)
由于最大化對數似然相當于最小化前面定義的代價函數J,因此,可以得到下述梯度下降更新規則:

這與第2章中的Adaline梯度下降規則相同。
3.3.4 用scikit-learn訓練邏輯回歸模型
前一小節我們剛討論了實用的代碼以及相關的數學計算,這有助于解釋Adaline與邏輯回歸概念之間的差異。現在來學習如何用scikit-learn或者更優化的邏輯回歸來實現,我們也默認支持多元分類的場景。請注意,在scikit-learn的新版中,將會自動選擇多元分類、多項式或者OvR技術。我們將在下面的代碼示例中用sklearn.linear_model.LogisticRegression
類以及熟悉的fit
方法,在三種花的標準化訓練數據集上訓練模型。同時,為了方便解釋,我們將設置multi_class='ovr'
。讀者可能想與把參數定義為multi_class='multinomial'
的結果進行對比。請注意,multinomial
設置通常推薦用于排他性分類,比如鳶尾花數據集中出現的那些。在這里,“排他”意味著每個訓練樣本只能屬于某類(多元分類的訓練樣本可以屬于多個類)。
現在,讓我們看看下面的示例代碼:

在訓練數據上擬合模型后,上述代碼把決策區域、訓練樣本和測試樣本繪制出來,如圖3-6所示。

圖 3-6
請注意,目前有許多不同的優化算法用于解決優化問題。為了最小化凸損失函數,如邏輯回歸的損失,我們建議用比常規隨機梯度下降(SGD)更先進的方法。實際上,scikit-learn實現了一系列這樣的優化算法,可以通過解算器參數'newton-cg'
、'lbfgs'
、'liblinear'
、'sag'
和'saga'
來指定調用這些算法。
當邏輯回歸損失呈凸點時,大多數優化算法應該很容易收斂到全局損失的最小點。但是,某些算法有一定的相對優勢。例如,當前版本(v 0.21)中的scikit-learn,以'liblinear'
作為解算器的默認值,無法處理多項式損失,而且局限于多元分類的OvR。但是,scikit-learn的未來版本(即v 0.22),將默認解算器變為更靈活的'lbfgs'
,代表內存受限的BFGS(Broyden-Fletcher-Goldfarb-Shanno)算法(https://en.wikipedia.org/wiki/Limited-memory_BFGS)。為了采用這個新的默認選擇,本書在使用邏輯回歸時將顯式地指定solver='lbfgs'
。
看到前面用來訓練邏輯回歸模型的示例代碼,你可能會想:“這個神秘的參數C到底是什么呢?”下一節,我們將先介紹過擬合和正則化的概念,然后再討論該參數。在此之前,我們先討論一下類成員的概率問題。
可以用predict_proba
計算訓練數據集中某個樣本屬于某個特定類的概率。例如,可以用如下方法預測測試數據集中前三類的概率:

執行這段代碼會返回如下數組:

第一行對應屬于第一種花的概率,第二行對應屬于第二種花的概率,以此類推。注意,所有列數據之和為1(可以通過執行lr.predict_proba(X_test_std[:3, :]).sum(axis=1)
來確認)。
第一行的最大值約為0.85,這意味著第一個樣本屬于第三種花(Iris-virginica
)的預測概率為85%。你可能已經注意到,我們可以通過識別每行中最大列的值得到預測的分類標簽,例如可以用NumPy的argmax
函數實現:

執行該調用返回對應于Iris-virginica
、Iris-setosa
和Iris-setosa
的分類結果:
在前面的代碼示例中,我們計算了條件概率,并用NumPy的argmax
函數將其手動轉換為分類標簽。實際上,在用scikit-learn時,獲得分類標簽更方便的方法是直接調用predict
方法:

最后提醒一句,如果想單獨預測花樣本的分類標簽:sciki-learn期望輸入一個二維數組,因此,必須先把單行轉換成這種格式。調用NumPy的reshape
方法增加一個新維度可以將一行數據轉換成為二維數組,代碼如下:

3.3.5 通過正則化解決過擬合問題
過擬合是機器學習中的常見問題,雖然模型在訓練數據上表現良好,但不能很好地泛化未見過的新數據或測試數據。如果某個模型出現了過擬合問題,我們會說該模型有高方差,這有可能是因為相對于給定的數據,參數太多,從而導致模型過于復雜。同樣,模型也可能會出現欠擬合(高偏差)的情況,這意味著模型不足以捕捉訓練數據中的復雜模式,因此對未知數據表現不佳。
雖然迄今我們只遇到過線性分類模型,但是比較線性決策邊界和更復雜的非線性決策邊界,是解釋過擬合與欠擬合問題的最好方法,如圖3-7所示。

圖 3-7
偏差-方差權衡
研究人員經常用術語“偏置”和“方差”或“偏置-方差權衡”來描述模型的性能,也就是說,你可能偶然會在談話、書籍或文章中發現人們提到模型具有“高方差”或“高偏置”。那么,這是什么意思?一般來說,我們可以說“高方差”與過擬合成正比,“高偏置”與欠擬合成正比。
在機器學習模型的場景中,如果我們多次重復訓練一個模型,例如在訓練數據集的不同子集上,方差可以用于測量模型對特定樣本進行分類時預測結果的一致性(或可變性)。可以說,模型對訓練數據中的隨機性很敏感。相比之下,偏置測量的是,假如在不同的訓練數據集上反復建模,預測值離正確值有多遠;偏置測量的是非隨機性引起的系統誤差。
如果你對術語“偏置”和“方差”的技術規范和推導感興趣,可以從下面網站獲取我的課堂講義:https://sebastianraschka.com/pdf/lecture-notes/stat479fs18/08_eval-intro_notes.pdf
找到一個好的偏置-方差權衡的方法是通過正則化來調整模型的復雜性。正則化是處理共線性(特征間的高相關性)、濾除數據中的噪聲并最終防止過擬合的一種非常有用的方法。
正則化背后的邏輯是引入額外的信息(偏置)來懲罰極端的參數值(權重)。最常見的正則化是所謂的L2正則化(有時也稱為L2收縮或權重衰減),可寫作:
這里λ為所謂的正則化參數。
正則化與特征歸一化
特征縮放(如標準化)之所以重要,其中一個原因就是正則化。為了使得正則化起作用,需要確保所有特征的衡量標準保持統一。
通過增加一個簡單的正則項,就可以正則化邏輯回歸的代價函數,這將在模型訓練的過程中縮小權重:

通過正則化參數λ,保持權重較小時,我們可以控制模型與訓練數據的擬合程度。加大λ值可以增強正則化的強度。
scikit-learn實現LogisticRegression
類的參數C
來自下一節要介紹的支持向量機中的約定。C
是正則化參數λ的倒數,與λ直接相關。因此,減小逆正則化參數C
意味著增加正則化的強度,這可以通過繪制對兩個權重系數進行L2正則化后的圖像予以展示:


通過執行上面的代碼,我們用不同的逆正則化參數C
值擬合10個邏輯回歸模型。為了方便講解,我們只收集分類標簽為1的權重系數(這里對應數據集中的第2類,即Iris-versicolor
)而不是所有類,記住我們使用OvR技術進行多元分類。
如圖3-8所示,如果減小參數C
,即增加正則化的強度,那么權重系數會縮小。

圖 3-8
其他關于邏輯回歸的資源
由于深入討論各種分類算法超出了本書的范圍,我強烈建議讀者閱讀斯科特·梅納德博士2009年的書籍Logistic Regression: From Introductory to Advanced Concepts and Applications,以了解更多關于邏輯回歸方面的知識。
- Learning Microsoft Windows Server 2012 Dynamic Access Control
- JavaScript百煉成仙
- Python數據可視化:基于Bokeh的可視化繪圖
- Mastering Entity Framework
- Learning Elixir
- MySQL數據庫管理與開發(慕課版)
- Building a Quadcopter with Arduino
- Learning ArcGIS for Desktop
- RESTful Java Web Services(Second Edition)
- 移動增值應用開發技術導論
- 快樂編程:青少年思維訓練
- 鋁合金陽極氧化與表面處理技術(第三版)
- Alfresco for Administrators
- Python程序設計案例教程:從入門到機器學習(微課版)
- 數據庫基礎與應用實驗教程:Visual FoxPro 6.0