機器學習(入門):邏輯回歸
1、什麼是邏輯回歸
邏輯回歸是應用非常廣泛的一個分類機器學習演算法,它將數據擬合到一個logistic函數中,從而能夠完成對事件發生的概率進行預測。
從大的類別上來說,邏輯回歸是一種有監督的統計學習方法,主要用於對樣本進行分類。
在線性回歸模型中,輸出一般是連續的,例如
y=f(x)=ax+b
對於每一個輸入的x,都有一個對應的y輸出。x和y都是連續型數據。但是對於邏輯回歸,輸入可以是連續的,但輸出一般是離散的,即只有有限多個輸出值。
所以邏輯回歸不是一個回歸類的模型,而是用於處理分類的問題,例如常見的二分類問題,拋硬幣只有正面朝上和反面朝上兩種結果,聽一首歌只有喜歡和不喜歡兩種可能,考試只有通過和不通過兩種結果。
例如:
2、邏輯回歸與線性回歸的關係
邏輯回歸也被稱為廣義線性回歸模型,它與線性回歸模型的形式基本上相同,都具有 ax+b,其中a和b是待求參數,其區別在於他們的因變數不同,多重線性回歸直接將ax+b作為因變數,即y = ax+b,而logistic回歸則通過函數S將ax+b對應到一個隱狀態p,p = S(ax+b),然後根據p與1-p的大小決定因變數的值。這裡的函數S就是Sigmoid函數:
通過函數S的作用,我們可以將輸出的值限制在區間[0, 1]上,p(x)則可以用來表示概率p(y=1|x),即當一個x發生時,y被分到1那一組的概率。最終為了得到y只有兩種取值結果,可y現在一個區間[0, 1]內,需要將y的值在[0, 1]這個區間上選擇一個閾值,通常是0.5,當y>0.5時,就將這個x歸到1這一類,如果y<0.5就將x歸到0這一類。這裡閾值是可以根據實際情況調整的。
3、邏輯回歸案例
在本案例中,主要研究學習時間與考試是否通過的預測,輸出的結果只有通過和不通過兩種,可以使用邏輯回歸模型。
(1)先建立數據集,數據集中包含「學習時間」和「通過考試」,其中通過考試中使用標籤0代表考試不通過,標籤1代表考試通過:
(2)提取特徵和標籤,把「學習時間」作為特徵,「通過考試」作為標籤:
(3)繪製散點圖,從散點圖看出原始數據的分布情況:
(4)建立訓練數據集和測試數據集,按照%80訓練數據和%20測試數據進行構建,並把數據集構建成散點圖,方便後面評估模型:
(5)構建模型,使用訓練數據構建並訓練邏輯回歸模型:
(6)評估模型:
根據測試數據對模型進行評估,準確率為%100,,結合圖4總數據集的散點圖結果來看,這個模型的準確率還是非常高的,但是由於訓練數據量偏少,準確率會存在誤差,樣本數據量越大,模型的準確率會越高。
(7)預測數據,當學習時間為3小時,模型對考試是否通過進行預測:
預測結果為通過考試,當我們輸入1個特徵(學習時間3小時)時,返回標籤0的概率值約等於0.397,返回標籤1的概率值約為0.603 大於閥值0.5
由圖中我們可以發現,當我們給定輸入一個特徵(學習時間3小時)的時候,可以返回其概率值,返回的第一個是其為0的概率值約為0.397,第二個是為1的概率值約為0.603。根據我們的決策面的結果,也就是x=3時候我們的logistic的函數值就是其為1的概率值。當這個值大於0.5的時候,我們做出決策,認為它的值為1,當這個概率值小於0.5的時候,我們做出決策,認為它的值為0。
在這裡,我們發現,返回1的概率值為0.603大於0.5,所以在此模型下,我們做出決策,認為值為1,即通過考試,通過上文我們定義的字典數據,可以發現,我們的決策是正確的。
源碼:
# coding: utf-8# ### 建立數據集# In[1]:from collections import OrderedDictimport numpy as npimport pandas as pd# In[2]:# 數據集examDict={ 學習時間:[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()# ### 提取特徵和標籤# In[4]:# 特徵featuresexam_X = examDf.loc[:,學習時間]# 標籤labesexam_y = examDf.loc[:,通過考試]# ### 繪製原始數據散點圖# In[5]:import matplotlib.pyplot as plt# 畫圖時用於顯示中文字元from pylab import mplmpl.rcParams[font.sans-serif] = [SimHei] # SimHei是黑體的意思# 散點圖plt.scatter(exam_X,exam_y,color=b,label=考試數據)# 添加圖標標籤plt.xlabel(學習時間)plt.ylabel(是否通過考試)# 顯示圖像plt.show()# ### 建立訓練數據集和測試數據集# In[6]:train_test_split是交叉驗證中常用的函數,功能是從樣本數據中隨機按比例選取訓練數據(train)和測試數據(test)第一個參數:所要劃分的樣本特徵第二個參數:所要劃分的樣本標籤train_size:訓練數據佔比,如果是整數就是樣本的數量from sklearn.cross_validation import train_test_split# 建立訓練數據和測試數據X_train,X_test,y_train,y_test = train_test_split(exam_X,exam_y,train_size=0.8)# 輸出數據大小print(原始數據特徵:,exam_X.shape, ,訓練數據特徵:,X_train.shape, ,測試數據特徵:,X_test.shape)print(原始數據標籤:,exam_y.shape, ,訓練數據標籤:,y_train.shape, ,測試數據標籤:,y_test.shape)# In[7]:# 繪製散點圖plt.scatter(X_train,y_train,color=blue,label=訓練數據)plt.scatter(X_test,y_test,color=red,label=測試數據)# 添加圖標標籤plt.legend(loc=2)plt.xlabel(學習時間)plt.ylabel(是否通過考試)# 顯示圖像plt.show()# ### 使用訓練數據訓練模型# In[8]:因樣本數據中只有一個特徵,而sklearn要求輸入的特徵必須是二維數組的類型,因此需要用reshape轉行成二維數組的類型,否則會報錯。# 將訓練數據特徵轉換成二維數組XX行*1列X_train = X_train.values.reshape(-1,1)# 將測試數據特徵轉換成二維數組XX行*1列X_test = X_test.values.reshape(-1,1)# 導入邏輯回歸包from sklearn.linear_model import LogisticRegression# 創建模型:邏輯回歸model = LogisticRegression()# 訓練模型model.fit(X_train,y_train)# ### 使用測試數據評估模型# In[9]:# 評估模型:準確率model.score(X_test,y_test)# ### 理解邏輯函數,並預測數據# In[10]:當輸入學生特徵學習時間為3小時,使用模型predict_proba方法會返回標籤概率值第一個值是標籤為0的概率值,第二個值是標籤為1的概率值# 獲取概率值model.predict_proba(3)# In[11]:# 預測數據: 使用模型的predict的方法進行預測# 在這裡輸入學生的特徵學習時間為3小時,模型會返回結果標籤pred = model.predict([[3]])print(pred)# In[12]:理解邏輯回歸函數斜率slope截距intercept# 第1步:得到回歸方程的z值# 回歸方程:z=a+bx# 截距a = model.intercept_# 回歸係數b = model.coef_# 學習時間為3小時x = 3z = a+b*x# 第2步:將z值代入邏輯回歸的函數中,得到概率值y_pred = 1/(1+np.exp(-z))print(預測的概率值:,y_pred)
推薦閱讀:
※數據分析師入門
※用Python預測「周期性時間序列」的正確姿勢
※R語言實戰第八章:回歸
※大數據之數據分析精進之路:起跑