141、機(jī)器學(xué)習(xí)(入門):邏輯回歸

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é)果。

例如:
邏輯回歸.jpg

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

邏輯回歸也被稱為廣義線性回歸模型,它與線性回歸模型的形式基本上相同,都具有 ax+b,其中a和b是待求參數(shù),其區(qū)別在于他們的因變量不同,多重線性回歸直接將ax+b作為因變量,即y = ax+b,而logistic回歸則通過函數(shù)S將ax+b對應(yīng)到一個隱狀態(tài)p,p = S(ax+b),然后根據(jù)p與1-p的大小決定因變量的值。這里的函數(shù)S就是Sigmoid函數(shù):
邏輯回歸與線性回歸關(guān)系.jpg

通過函數(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é)果只有通過和不通過兩種,可以使用邏輯回歸模型。

(1)先建立數(shù)據(jù)集,數(shù)據(jù)集中包含“學(xué)習(xí)時間”和“通過考試”,其中通過考試中使用標(biāo)簽0代表考試不通過,標(biāo)簽1代表考試通過:
1 建立數(shù)據(jù)集.png

(2)提取特征和標(biāo)簽,把“學(xué)習(xí)時間”作為特征,“通過考試”作為標(biāo)簽:
2 提取特征和標(biāo)簽.png

(3)繪制散點(diǎn)圖,從散點(diǎn)圖看出原始數(shù)據(jù)的分布情況:
3 繪制原始數(shù)據(jù)散點(diǎn)圖.png

(4)建立訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集,按照%80訓(xùn)練數(shù)據(jù)和%20測試數(shù)據(jù)進(jìn)行構(gòu)建,并把數(shù)據(jù)集構(gòu)建成散點(diǎn)圖,方便后面評估模型:
4 建立訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集.png
4 數(shù)據(jù)集可視化.png

(5)構(gòu)建模型,使用訓(xùn)練數(shù)據(jù)構(gòu)建并訓(xùn)練邏輯回歸模型:
5 構(gòu)建模型.png

(6)評估模型:
6 評估模型.png

根據(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)確率會越高。

(7)預(yù)測數(shù)據(jù),當(dāng)學(xué)習(xí)時間為3小時,模型對考試是否通過進(jìn)行預(yù)測:
7 預(yù)測數(shù)據(jù).png
8 理解邏輯回歸函數(shù).png

預(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)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容