1、什么是邏輯回歸
邏輯回歸是應(yīng)用非常廣泛的一個分類機(jī)器學(xué)習(xí)算法,它將數(shù)據(jù)擬合到一個logistic函數(shù)中,從而能夠完成對事件發(fā)生的概率進(jìn)行預(yù)測。
從大的類別上來說,邏輯回歸是一種有監(jiān)督的統(tǒng)計學(xué)習(xí)方法,主要用于對樣本進(jìn)行分類。
在線性回歸模型中,輸出一般是連續(xù)的,例如
y=f(x)=ax+b
對于每一個輸入的x,都有一個對應(yīng)的y輸出。x和y都是連續(xù)型數(shù)據(jù)。但是對于邏輯回歸,輸入可以是連續(xù)的,但輸出一般是離散的,即只有有限多個輸出值。
所以邏輯回歸不是一個回歸類的模型,而是用于處理分類的問題,例如常見的二分類問題,拋硬幣只有正面朝上和反面朝上兩種結(jié)果,聽一首歌只有喜歡和不喜歡兩種可能,考試只有通過和不通過兩種結(jié)果。

2、邏輯回歸與線性回歸的關(guān)系

通過函數(shù)S的作用,我們可以將輸出的值限制在區(qū)間[0, 1]上,p(x)則可以用來表示概率p(y=1|x),即當(dāng)一個x發(fā)生時,y被分到1那一組的概率。最終為了得到y(tǒng)只有兩種取值結(jié)果,可y現(xiàn)在一個區(qū)間[0, 1]內(nèi),需要將y的值在[0, 1]這個區(qū)間上選擇一個閾值,通常是0.5,當(dāng)y>0.5時,就將這個x歸到1這一類,如果y<0.5就將x歸到0這一類。這里閾值是可以根據(jù)實(shí)際情況調(diào)整的。
3、邏輯回歸案例
在本案例中,主要研究學(xué)習(xí)時間與考試是否通過的預(yù)測,輸出的結(jié)果只有通過和不通過兩種,可以使用邏輯回歸模型。







根據(jù)測試數(shù)據(jù)對模型進(jìn)行評估,準(zhǔn)確率為%100,,結(jié)合圖4總數(shù)據(jù)集的散點(diǎn)圖結(jié)果來看,這個模型的準(zhǔn)確率還是非常高的,但是由于訓(xùn)練數(shù)據(jù)量偏少,準(zhǔn)確率會存在誤差,樣本數(shù)據(jù)量越大,模型的準(zhǔn)確率會越高。


預(yù)測結(jié)果為通過考試,當(dāng)我們輸入1個特征(學(xué)習(xí)時間3小時)時,返回標(biāo)簽0的概率值約等于0.397,返回標(biāo)簽1的概率值約為0.603 大于閥值0.5
由圖中我們可以發(fā)現(xiàn),當(dāng)我們給定輸入一個特征(學(xué)習(xí)時間3小時)的時候,可以返回其概率值,返回的第一個是其為0的概率值約為0.397,第二個是為1的概率值約為0.603。根據(jù)我們的決策面的結(jié)果,也就是x=3時候我們的logistic的函數(shù)值就是其為1的概率值。當(dāng)這個值大于0.5的時候,我們做出決策,認(rèn)為它的值為1,當(dāng)這個概率值小于0.5的時候,我們做出決策,認(rèn)為它的值為0。
在這里,我們發(fā)現(xiàn),返回1的概率值為0.603大于0.5,所以在此模型下,我們做出決策,認(rèn)為值為1,即通過考試,通過上文我們定義的字典數(shù)據(jù),可以發(fā)現(xiàn),我們的決策是正確的。
源碼:
# coding: utf-8
# ### 建立數(shù)據(jù)集
# In[1]:
from collections import OrderedDict
import numpy as np
import pandas as pd
# In[2]:
# 數(shù)據(jù)集
examDict={
'學(xué)習(xí)時間':[0.5,0.75,1,1.25,1.5,1.75,1.75,2,2.25,2.5,
2.75,3,3.25,3.5,4,4.25,4.5,4.75,5,5.5],
'通過考試':[0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1]
}
examOrderDict=OrderedDict(examDict)
examDf=pd.DataFrame(examOrderDict)
# In[3]:
examDf.head()
# ### 提取特征和標(biāo)簽
# In[4]:
# 特征features
exam_X = examDf.loc[:,'學(xué)習(xí)時間']
# 標(biāo)簽labes
exam_y = examDf.loc[:,'通過考試']
# ### 繪制原始數(shù)據(jù)散點(diǎn)圖
# In[5]:
import matplotlib.pyplot as plt
# 畫圖時用于顯示中文字符
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # SimHei是黑體的意思
# 散點(diǎn)圖
plt.scatter(exam_X,exam_y,color='b',label='考試數(shù)據(jù)')
# 添加圖標(biāo)標(biāo)簽
plt.xlabel('學(xué)習(xí)時間')
plt.ylabel('是否通過考試')
# 顯示圖像
plt.show()
# ### 建立訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集
# In[6]:
'''
train_test_split是交叉驗(yàn)證中常用的函數(shù),功能是從樣本數(shù)據(jù)中隨機(jī)按比例選取訓(xùn)練數(shù)據(jù)(train)和測試數(shù)據(jù)(test)
第一個參數(shù):所要劃分的樣本特征
第二個參數(shù):所要劃分的樣本標(biāo)簽
train_size:訓(xùn)練數(shù)據(jù)占比,如果是整數(shù)就是樣本的數(shù)量
'''
from sklearn.cross_validation import train_test_split
# 建立訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)
X_train,X_test,y_train,y_test = train_test_split(exam_X,exam_y,train_size=0.8)
# 輸出數(shù)據(jù)大小
print('原始數(shù)據(jù)特征:',exam_X.shape,
',訓(xùn)練數(shù)據(jù)特征:',X_train.shape,
',測試數(shù)據(jù)特征:',X_test.shape)
print('原始數(shù)據(jù)標(biāo)簽:',exam_y.shape,
',訓(xùn)練數(shù)據(jù)標(biāo)簽:',y_train.shape,
',測試數(shù)據(jù)標(biāo)簽:',y_test.shape)
# In[7]:
# 繪制散點(diǎn)圖
plt.scatter(X_train,y_train,color='blue',label='訓(xùn)練數(shù)據(jù)')
plt.scatter(X_test,y_test,color='red',label='測試數(shù)據(jù)')
# 添加圖標(biāo)標(biāo)簽
plt.legend(loc=2)
plt.xlabel('學(xué)習(xí)時間')
plt.ylabel('是否通過考試')
# 顯示圖像
plt.show()
# ### 使用訓(xùn)練數(shù)據(jù)訓(xùn)練模型
# In[8]:
'''
因樣本數(shù)據(jù)中只有一個特征,而sklearn要求輸入的特征必須是二維數(shù)組的類型,
因此需要用reshape轉(zhuǎn)行成二維數(shù)組的類型,否則會報錯。
'''
# 將訓(xùn)練數(shù)據(jù)特征轉(zhuǎn)換成二維數(shù)組XX行*1列
X_train = X_train.values.reshape(-1,1)
# 將測試數(shù)據(jù)特征轉(zhuǎn)換成二維數(shù)組XX行*1列
X_test = X_test.values.reshape(-1,1)
# 導(dǎo)入邏輯回歸包
from sklearn.linear_model import LogisticRegression
# 創(chuàng)建模型:邏輯回歸
model = LogisticRegression()
# 訓(xùn)練模型
model.fit(X_train,y_train)
# ### 使用測試數(shù)據(jù)評估模型
# In[9]:
# 評估模型:準(zhǔn)確率
model.score(X_test,y_test)
# ### 理解邏輯函數(shù),并預(yù)測數(shù)據(jù)
# In[10]:
'''
當(dāng)輸入學(xué)生特征學(xué)習(xí)時間為3小時,使用模型predict_proba方法會返回標(biāo)簽概率值
第一個值是標(biāo)簽為0的概率值,第二個值是標(biāo)簽為1的概率值
'''
# 獲取概率值
model.predict_proba(3)
# In[11]:
# 預(yù)測數(shù)據(jù): 使用模型的predict的方法進(jìn)行預(yù)測
# 在這里輸入學(xué)生的特征學(xué)習(xí)時間為3小時,模型會返回結(jié)果標(biāo)簽
pred = model.predict([[3]])
print(pred)
# In[12]:
'''
理解邏輯回歸函數(shù)
斜率slope
截距intercept
'''
# 第1步:得到回歸方程的z值
# 回歸方程:z=a+bx
# 截距
a = model.intercept_
# 回歸系數(shù)
b = model.coef_
# 學(xué)習(xí)時間為3小時
x = 3
z = a+b*x
# 第2步:將z值代入邏輯回歸的函數(shù)中,得到概率值
y_pred = 1/(1+np.exp(-z))
print('預(yù)測的概率值:',y_pred)