關於邏輯迴歸(Logistic regression)模型的簡單思考

關於邏輯迴歸(Logistic regression)模型的簡單思考

Tags: 機器學習算法

  Logistic regression(LR)模型是一種分類算法,它將特徵空間映射成一種可能性,本文將從以下幾方面解釋邏輯迴歸模型:

  • 邏輯迴歸模型的定義
  • 邏輯迴歸模型的概率論解釋
  • 邏輯迴歸的引申:條件隨機場
  • 求解實現(Python)

1.邏輯迴歸模型的定義

  模型輸入爲x⃗  (簡記爲x ),輸出爲y0,1 。定義p(y=1|x)=hθ(x)=g(θTx)=11+eθTx
其中,θ 爲參數,g(z)=11+ez ,又被稱爲logistic函數或者sigmoid函數。sigmoid函數取值在(0,1) 之間。

2.邏輯迴歸的概率解釋

  考慮二分類問題,ci 表示第i 類,i0,1x 作爲輸入,表示特徵。用p(ci|x) 表示已知x 時,類別爲ci 的概率。由貝葉斯理論有:

p(ci|x)=p(ci,x)p(x)=p(ci)p(x|ci)p(x)

其中p(x)=cip(ci,x)=cip(ci)p(x|ci)
  對於二分類,帶入i=1 的值有:
p(c1|x)=11+p(c0)p(x|c0)p(c1)p(x|c1)

a=lnp(c0)p(x|c0)p(c1)p(x|c1)
  取先驗概率p(ci)Bernoulli(Φ) 時,若p(x|ck) 服從高斯分佈,且共享協方差矩陣,即p(x|ck)=1(2π)D/21|Σ|1/2exp12(xuk)TΣ1(xuk)
  則p(ck|x) 符合邏輯迴歸模型的形式。即p(ck|x)=11+ewTx
  當p(x|ck) 服從泊松分佈時,也有此結果。

高斯判別模型(Gaussian Discriminant Analysis,GDA)與邏輯迴歸模型

  高斯判別模型屬於生成模型(即對聯合概率建模),邏輯迴歸模型屬於判別模型(即對條件概率建模)。
我們將p(y=1|x;W) 看做x 的函數(W表示參數集合),可以證明有如下形式:

p(y=1|x;W)=11+exp(θTx)

  當訓練相同的數據集時,這兩個模型將得到不同的分類邊界,哪一個更好?

  1. 高斯判別模型可以轉化爲邏輯迴歸模型,反之不一定。即高斯判別模型有更強的模型假設。
  2. 當該假設正確時,GDA有更好的效果(更少的數據就可以學的不錯)。換句話說,LR魯棒性更強。
  3. LR模型的假設要求更弱,例如,如果x|yPoission(λ) ,LR仍然有效。

3.從邏輯迴歸到條件隨機場

  樸素貝葉斯和LR模型最大區別在於前者是生成模型,後者是判別模型。可以認爲兩者有相同的假設空間,在這種意義下,任何LR分類器和一個樸素貝葉斯分類器可以在相同的決策界下相互轉換。樸素貝葉斯可以轉化爲有向圖模型,LR模型可以轉換爲無向圖模型。
  LR模型的輸出是標量,CRF輸出是結構化的多元輸出(應該可以看做向量吧),因此LR模型可以看做最簡單的CRF模型。
  from C. Sutton, and A. McCallum. (2007). "An Introduction to Conditional Random Fields for Relational Learning."
圖片來源:C. Sutton, and A. McCallum. (2007). “An Introduction to Conditional Random Fields for Relational Learning”

4.用Python實現LR模型

以下代碼是搬運他人教程。詳見參考資料3。
問題描述:
辨別不同因素對研究生錄取的影響:
影響變量(predictor variables):
- gpa
- gre 分數
- rank 本科生母校聲望
預測變量:admit,表示考生是否被錄用,0/1變量

import pandas as pd
import statsmodels.api as sm
import pylab as pl
import numpy as np

# 加載數據
# 備用地址: http://cdn.powerxing.com/files/lr-binary.csv
df = pd.read_csv("http://www.ats.ucla.edu/stat/data/binary.csv")

# 重命名'rank'列,因爲rank也是pandas dataframe中一個方法的名字
df.columns = ["admit", "gre", "gpa", "prestige"]
print df.columns
# array([admit, gre, gpa, prestige], dtype=object)

# summarize the data
print df.describe()

# 將prestige設爲虛擬變量
# 虛擬變量,也叫啞變量,可用來表示分類變量、非數量因素可能產生的影響。在計量經濟學模型,需要經常考慮屬性因素的影響。例如,職業、文化程度、季節等屬性因素往往很難直接度量它們的大小。只能給出它們的“Yes—D=1”或”No—D=0”,或者它們的程度或等級。爲了反映屬性因素和提高模型的精度,必須將屬性因素“量化”。通過構造0-1型的人工變量來量化屬性因素。
dummy_ranks = pd.get_dummies(df['prestige'], prefix='prestige')
print dummy_ranks.head()

# 爲邏輯迴歸創建所需的data frame
# 除admit、gre、gpa外,加入了上面常見的虛擬變量(注意,引入的虛擬變量列數應爲虛擬變量總列數減1,減去的1列作爲基準)
cols_to_keep = ['admit', 'gre', 'gpa']
data = df[cols_to_keep].join(dummy_ranks.ix[:, 'prestige_2':])

# 需要自行添加邏輯迴歸所需的intercept變量
data['intercept'] = 1.0

# 指定作爲訓練變量的列,不含目標列`admit`
train_cols = data.columns[1:]
# Index([gre, gpa, prestige_2, prestige_3, prestige_4], dtype=object)
# 在這裏是使用了statesmodels的Logit函數,更多的模型細節可以查閱statesmodels的文檔
logit = sm.Logit(data['admit'], data[train_cols])
# 擬合模型
result = logit.fit()

# 構建預測集
# 與訓練集相似,一般也是通過 pd.read_csv() 讀入
# 在這邊爲方便,我們將訓練集拷貝一份作爲預測集(不包括 admin 列)
import copy
combos = copy.deepcopy(data)
# 數據中的列要跟預測時用到的列一致
predict_cols = combos.columns[1:]
# 預測集也要添加intercept變量
combos['intercept'] = 1.0
# 進行預測,並將預測評分存入 predict 列中
combos['predict'] = result.predict(combos[predict_cols])
# 預測完成後,predict 的值是介於 [0, 1] 間的概率值
# 我們可以根據需要,提取預測結果
# 例如,假定 predict > 0.5,則表示會被錄取
# 在這邊我們檢驗一下上述選取結果的精確度
total = 0
hit = 0
for value in combos.values:
  # 預測分數 predict, 是數據中的最後一列
  predict = value[-1]
  # 實際錄取結果
  admit = int(value[0])
  # 假定預測概率大於0.5則表示預測被錄取
  if predict > 0.5:
    total += 1
    # 表示預測命中
    if admit == 1:
      hit += 1
# 輸出結果
print 'Total: %d, Hit: %d, Precision: %.2f' % (total, hit, 100.0*hit/total)
# Total: 49, Hit: 30, Precision: 61.22

# 查看數據的要點
print result.summary()

參考資料:
1. CS229 Lecture notes(Andrwe Ng)
2. Pattern Recognition and Machine Learning(PRML)
3. Python實現邏輯迴歸(Logistic Regression in Python)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章