用Python學習數據分析(5)機器學習入門必學線性回歸與邏輯回歸

有了一些數據分析的基礎後,開始踏入機器學習的大門.......

雖然有很多高深的演算法,我們從簡單的、適合入門的線性回歸和邏輯回歸模型學起。本文有原理、代碼、案例, 我比較想打好基礎,多寫了一些模型原理的梳理。

用Python進擊機器學習,首先在Anaconda中安裝好「sklearn」包。有了sklearn等包助陣,實踐機器學習方便很多。


線性回歸

顧名思義,希望將標籤Y(因變數)和特徵X(自變數)間的關係用線性方程表示。

1、拿到乾淨數據後先用散點圖看看變數是否具有相關性(注意,相關≠因果),如果非常離散就不太適合做回歸。下面圖片來自網站istics.net/Correlations,可以親自實踐感受一下相關性~

統計學角度,衡量相關性的統計量有:

  • 協方差:能判斷兩個變數的變化趨勢是否相同,但是受度量單位的影響大。

  • (皮爾遜積矩)相關係數:標準化後的協方差,消除了變化幅度對趨勢方向的影響,更能反映反映變數每單位變化的相似程度。

易知,相關係數=1時,變數完全正線性相關,=-1時完全負線性相關,=0時完全無關。

一個求相關係數並畫散點圖的小例子:

from collections import OrderedDictimport pandas as pd#數據集examDict={ 學習時間:[0.50,0.75,1.00,1.25,1.50,1.75,1.75,2.00,2.25, 2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50], 分數: [10, 22, 13, 43, 20, 22, 33, 50, 62, 48, 55, 75, 62, 73, 81, 76, 64, 82, 90, 93]}examOrderDict=OrderedDict(examDict)examDf=pd.DataFrame(examOrderDict)#提取特徵和標籤#特徵featuresexam_X=examDf.loc[:,學習時間]#標籤labesexam_y=examDf.loc[:,分數]#查看相關係數examDf.corr()#繪製散點圖import matplotlib.pyplot as plt#散點圖plt.scatter(exam_X, exam_y, color="b", label="exam data")#添加圖標標籤plt.xlabel("Hours")plt.ylabel("Score")#顯示圖像plt.show()

2、明確特徵X和標籤Y,並確認它們有相關性後,就可以做線性回歸了。開始前,我們要把數據分為訓練集和測試集。

這樣做的目的是」交叉驗證「。因為模型是用訓練集數據得到的,它可能對訓練集擬合得很好,但是放到其他數據里就不那麼完美了。為了評估模型的普適性,我們提前留出「測試集」用來計算模型的準確率。

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 = .8)

3、訓練集分好了,用Python寫幾行代碼就得到模型:

#將訓練數據特徵轉換成二維數組XX行*1列(行轉列)X_train=X_train.values.reshape(-1,1)#將測試數據特徵轉換成二維數組行數*1列(行轉列)X_test=X_test.values.reshape(-1,1)#第1步:導入線性回歸from sklearn.linear_model import LinearRegression#第2步:創建模型:線性回歸model = LinearRegression()#第3步:訓練模型model.fit(X_train , y_train)最佳擬合線:z=??+??x截距intercept:a回歸係數:b#截距a=model.intercept_#回歸係數b=model.coef_print(最佳擬合線:截距a=,a,,回歸係數b=,b)

根據截距和回歸係數我們能寫出一個線性方程Y=a*X+b,比如這裡是:Y=15.62*X +10.58

但是有個問題,這個模型是怎麼篩選的?當數據離散的時候,可能不止有一條擬合線能描述它,為什麼偏偏是這條?

我們定義:Y誤差的平方和 SSE=sum_{i=1}^{n}{(Y_{實際}-Y_{模型})^2} (稱為殘差平方和)最小的模型是最佳擬合線,這種判定方法叫」最小二乘法「。

想知道最佳擬合線的擬合度到底如何,有多少樣本點落在線上,可以用SSE除以Y的總波動 SST=sum_{}^{}{(Y_{實際}-ar{Y}_{平均})^2} (稱為總離差平方和)來表示。

上面兩個變數都是過程,我們最終看線性回歸的擬合優度只要看 決定係數R2

R2=1-SSE/SST。R2隻能在0到1之間,越大越好,當R2=1時說明模型完全擬合,那這個模型真是太優秀了。(到後面還要考慮」過擬合「的情況...)

#線性回歸的scroe方法得到的是決定係數R平方model.score(X_test , y_test)

得到R2=0.91678,非常高了。

畫出模型:

邏輯回歸

和線性回歸不同,邏輯回歸是二分法的代表,屬於分類演算法,它的標籤值Y只有兩個:0或1。邏輯回歸可以用在一些」說一不二「的判斷上,比如」輸、贏「、」喜歡、不喜歡「......界定它們就看在決策面的哪一邊。

紅色這首歌被判為「不喜歡」

邏輯回歸的模型其實長這樣,這個0.5就是決策面,請理解為概率

z可以是線性回歸,z的結果是一個概率,當0.5<z≤1,就算作y=1,反之y=0。下面有個小例子:

比如考試複習,學0.5小時和學0.75小時通過考試的概率當然不一樣,一個是0.2一個是0.25好了,它們都沒達到決策面的概率0.5,所以標籤都是0。

也許用Python代碼解釋得更明白一些(假設已經得出模型!):

輸入一個學習時間為3小時的樣本,通過考試的概率為0.4064,沒通過的概率為0.5935,模型判斷為1-沒通過。

原理差不多了解了吧,

下面用這個案例做完整的邏輯回歸,步驟依舊是

  • 從數據集中提取特徵和標籤
  • 繪製散點圖
  • (變數需要為列向量,按照需要reshape)
  • 分為訓練集和測試集
  • 利用訓練集構造模型
  • 利用測試集評估準確率

from collections import OrderedDictimport pandas as pd數據集examDict={ 學習時間:[0.50,0.75,1.00,1.25,1.50,1.75,1.75,2.00,2.25,2.50, 2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50], 通過考試:[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)#特徵featuresexam_X=examDf.loc[:,學習時間]#標籤labesexam_y=examDf.loc[:,通過考試]import matplotlib.pyplot as plt#散點圖plt.scatter(exam_X, exam_y, color="b", label="exam data")#添加圖標標籤plt.xlabel("Hours")plt.ylabel("Pass")#顯示圖像plt.show()

train_test_split是交叉驗證中常用的函數,功能是從樣本中隨機的按比例選取訓練數據(train)和測試數據(test)第1個參數:所要劃分的樣本特徵第2個參數:所要劃分的樣本標籤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 = .8)#將訓練數據特徵轉換成二維數組XX行*1列X_train=X_train.values.reshape(-1,1)#將測試數據特徵轉換成二維數組行數*1列X_test=X_test.values.reshape(-1,1)#導入邏輯回歸包from sklearn.linear_model import LogisticRegression# 創建模型:邏輯回歸model = LogisticRegression()#訓練模型model.fit(X_train , y_train)#評估模型:準確率model.score(X_test , y_test)

準確率輸出為1,說明測試集的數據預測全部是準確的。

#回歸方程:z=??+??x#截距a=model.intercept_#回歸係數b=model.coef_

根據邏輯回歸模型 Y=frac{1}{1-e^{ax+b}} (z=ax+b) ,寫出最終得到的結果是 Y=frac{1}{1-e^{-1.113X+0.497}}


推薦閱讀:

面壁者系列:Logistic回歸
SPSS學習筆記:因變數二分類資料的logistic回歸分析
SPSS教程:手把手教你設置啞變數以及解讀結果

TAG:Python | 線性回歸 | Logistic回歸 |