【機器學習速成寶典】模型篇03邏輯斯諦回歸【Logistic回歸】(Python版)


目錄

  一元線性回歸、多元線性回歸、Logistic回歸、廣義線性回歸、非線性回歸的關系

  什么是極大似然估計

  邏輯斯諦回歸(Logistic回歸)

  多類分類Logistic回歸

  Python代碼(sklearn庫)


 

一元線性回歸、多元線性回歸、邏輯斯諦回歸、廣義線性回歸、非線性回歸的關系  

  通過上圖(插圖摘自周志華《機器學習》及互聯網)可以看出:

  線性模型雖簡單,卻擁有着豐富的變化。例如對於樣例,當我們希望線性模型的預測值逼近真實標記y時,就得到了線性回歸模型:。當令模型逼近y的衍生物,比如時,就得到了對數線性回歸(Log-linear regression)模型,這樣的模型稱為“廣義線性回歸(Generalized linear regression)模型”。

 

什么是極大似然估計(Maximum Likelihood Estimate,MLE)

  引例

  有兩個射擊運動員,一個專業水平,一個業余水平,但是不知道哪個是專業的哪個是業余的。那么如何判斷呢? 讓兩個運動員都打幾槍,A運動員平均水平9.8環,B運動員平均水平2.2環,那我們就判斷了:A遠動員是專業的,B運動員是業余的。因為射擊成績已經產生了9.8環,當未知參數=專業水平時,射擊成績=9.8環的概率最大。這就是極大似然法。

  極大似然法:事情已經發生了,當未知參數等於多少時,能讓這個事情發生的概率最大,執果索因。

  百度百科定義

  極大似然估計,只是一種概率論在統計學的應用,它是參數估計的方法之一。說的是已知某個隨機樣本滿足某種概率分布,但是其中具體的參數不清楚,參數估計就是通過若干次試驗,觀察其結果,利用結果推出參數的大概值。極大似然估計是建立在這樣的思想上:已知某個參數能使這個樣本出現的概率最大,我們當然不會再去選擇其他小概率的樣本,所以干脆就把這個參數作為估計的真實值。

 

邏輯斯諦回歸(Logistic回歸)

  上一節討論了如何使用線性模型進行回歸學習,但若要做的是分類任務該怎么辦?答案就蘊含在Logistic模型中。

  在Logistic模型中,我們是用去擬合,其中y是樣本x作為正例的概率。針對Logistic模型,這里有幾個問題:(1)為什么要這樣做擬合?(2)真實的訓練集的標記都是1或0(正例或負例)而不是概率怎么辦?下面我們一一解答。

  假設我們有訓練集:

 

 

  首先解釋:(1)為什么要這樣做擬合?

  二娃:既然你的標記是概率值,是一個連續的值,是不是可以用線性模型去進行模型學習?當對新樣本進行預測的時候,如果模型預測的概率值>0.5就輸出1;如果模型預測的概率值<=0.5就輸出0?

  好,那我們就實驗一下二娃提供的思路。

 

  從圖像上可以看出由於最后兩個樣本點的原因,導致我們的擬合出來的直線的斜率變小,截距變高,如果按照二娃的思路來做,模型的效果很差。所以不能用線性模型去直接擬合概率值y。

  翠花:那我們為何不直接找一條分割線去分割,而是非要去擬合呢?在本例中,直接用“尺寸如果>5.5輸出1,尺寸<=5.5輸出0”的規則豈不是很好?

  其實,翠花的思路是我們未來要講的支持向量機(SVM)。但是當樣本量較大時SVM的收斂速度很慢,所以SVM從2012年開始漸漸退出歷史舞台。在用於分類的模型有很多,這里我們先介紹Logistic模型。

  我們接着說二娃的問題。線性模型直接擬合概率值y的方法不好用,那么去擬合(正例概率/反例概率,稱為幾率,再取對數,稱為對數幾率),當對新樣本進行預測的時候,如果模型預測值>0就輸出1;如果模型預測值<=0就輸出0呢?

 

  很明顯,從圖像擬合的情況看,模型在訓練集上的表現很好。

  那為什么要這樣做擬合呢?首先,Logistic模型公式為:,轉換形式后:,我們來討論一下函數(一種Sigmoid函數)的性質

   圖摘自自周志華《機器學習》

 

  函數是一個單調可微函數,當z趨於正無窮時,函數值趨於1;當z趨於負無窮時,函數值趨於0;而且關於點(0,1/2)中心對稱。這種Sigmoid函數適合擬合概率值。可以粗略的畫出擬合曲線:

 

 

  因此,當有新的樣本輸入時,Logistic回歸模型中的函數會計算出它是正例的概率。若y>0.5模型預測為1(是惡性腫瘤),否則為0(非惡性腫瘤)。

 

  隨后解釋:(2)真實的訓練集的標記都是1或0(正例或負例)而不是概率怎么辦?

  假設數據集為

 

  我們知道函數可以表示某個樣例是正例的概率。雖然其中的是未知的,是未知參數,但是可以表示出每一個樣例屬於其標記的概率,如:

......,

  現在有了每一個樣例屬於其標記的概率,然后將這些概率相乘求一個總體概率S,即:

(似然函數)

  可以證明這個似然函數是一個凸函數,使用最優化方法令其最大,從而求出最優的,然后代入,完成模型的求解。

  細心的朋友一定會發現:“事情已經發生了(訓練集確定了),當未知參數()等於多少時,能讓這個事情發生的概率(S)最大,執果索因”。這正是極大似然估計的應用啊!

  因此Logistic回歸模型中學習的代價函數可以是:


  當然,我們也能求一下對數似然函數:

  損失函數也相應變為:

  

多類分類Logistic回歸

  有兩種方式:

  (1)采用one-vs-rest策略

 

  (2)采用多分類邏輯回歸策略

  設離散型隨機變量Y的取值集合是{1,2,...,K},那么多分類邏輯回歸模型是

  二分類邏輯回歸的參數估計方法也可以推廣到多分類邏輯回歸。

 

Python代碼(sklearn庫)

# -*- coding: utf-8 -*-
from numpy import *
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression

iris = load_iris()
trainX = iris.data
trainY = iris.target


clf = LogisticRegression(penalty='l2', dual=False, tol=1e-4, C=1.0,
                 fit_intercept=True, intercept_scaling=1, class_weight=None,
                 random_state=None, solver='liblinear', max_iter=100,
                 multi_class='ovr', verbose=0, warm_start=False, n_jobs=1)
'''
    @param penalty: 指定正則化策略
    @param dual:  是否求解對偶形式
    @param C:  懲罰項系數的倒數,越大,正則化項越小
    @param fit_intercept:  是否擬合截距
    @param intercept_scaling:  當solver='liblinear'、fit_intercept=True時,會制造出一個恆為1的特征,權重為b,為了降低這個人造特征對正則化的影響,可以將其設為1
    @param class_weight:  可以是一個字典或'balanced'。字典:可以指定每一個分類的權重;'balanced':可以指定每個分類的權重與該分類在訓練集中的頻率成反比
    @param max_iter:  最大迭代次數
    @param random_state:  一個整數或一個RandomState對象或None
    @param solver:  指定求解最優化問題的算法:
    'newton-cg':牛頓法;
    'lbfgs':擬牛頓法;
    'liblinear':使用liblinear;(適用於小數據集)
    'sag':使用Stochastic Average Gradient Descent算法(適用於大數據集)
    @param tol:  指定迭代收斂與否的閾值
    @param multi_class: 
    'ovr': 采用one-vs-rest策略
    'multi_class': 采用多類分類Logistic回歸
    @param verbose: 是否開啟迭代過程中輸出日志
    @param warm_start:  是否使用前一次的訓練結果繼續訓練
    @param n_jobs: 任務並行時指定使用的CPU數,-1表示使用所有可用的CPU
    
    @attribute coef_: 權重向量
    @attribute intercept_: 截距b
    @attribute n_iter_: 實際迭代次數
    
    @method fit(X,y[,sample_weight]): 訓練模型
    @method predict(X): 預測
    @method predict_log_proba(X): 返回X預測為各類別的概率的對數
    @method predict_proba(X): 返回X預測為各類別的概率
    @method score(X,y[,sample_weight]): 計算在(X,y)上的預測的准確率
'''

clf.fit(trainX, trainY)

print "權值:"+str(clf.coef_)
print "截距:"+str(clf.intercept_)
print "分數:"+str(clf.score(trainX, trainY))
print clf.predict(trainX)
print trainY

'''
C:\Anaconda2\lib\site-packages\sklearn\datasets
權值:[[ 0.41498833  1.46129739 -2.26214118 -1.0290951 ]
 [ 0.41663969 -1.60083319  0.57765763 -1.38553843]
 [-1.70752515 -1.53426834  2.47097168  2.55538211]]
截距:[ 0.26560617  1.08542374 -1.21471458]
分數:0.96
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2 1 1 1
 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
'''

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM