線性迴歸(Linear Regression)

線性迴歸(Linear Regression)屬於監督式學習,探討獨立變數(Independent Variabe)與相依變數(Dependent Variable)的關係。建立線性迴歸模型,輸入獨立變數來推論與預測相依變數。


3-1 線性迴歸

線性迴歸可以使用函式y=f(x)表示,x為獨立變數,y為相依變數,就可以使用此函式,輸入x產生預估目標值y。這種使用一個獨立變數和一個相依變數的線性迴歸稱作簡單線性回歸(Simple Linear Regression)。簡單線性迴歸y=f(x)是一條直線,如下圖。

可以使用「y = m*x + b」表示一條直線,b為截距(Intercept),m是斜率(Slope)。如上圖,該直線為「y = 1*x + 0.5」,截距為0.5,斜率為1。

線性迴歸適合預測連續性的目標值,例如:下雨量、溫度、房價、二氧化碳排放量,不適合預測離散性的目標值,例如:有或沒有、生存或死亡。線性迴歸適合用於輸入資料(獨立變數)與輸出目標值(相依變數),可以找到一條線進行預測,但不是所有連續性目標值的問題都可以使用線性迴歸,有時輸入值與目標值的分佈太過分散,無法找到能夠準確預估目標值的線。

如何找出一條損失(Loss)最少的線,就要定義損失(Loss)函式,線性迴歸最常用的損失函式為Mean Square Error(MSE,均方差),公式如下,預估值(y ̂i)與正確值(yi)差平方和的平均值。

上圖三個點與線性迴歸的均方差(MSE),計算過程如下表。當均方差(MSE)越大表示y與預估y ̂差異越大,降低此數值讓線性迴歸能夠更精確預估y值。

3-2 使用sklearn實作線性迴歸

使用sklearn實作線性迴歸,輸入獨立變數與相依變數到線性迴歸模型,就可計算出線性迴歸的係數與截距,使用此模型進行預估。使用sklearn實作線性迴歸的步驟如下。

(1)輸入資料

train_X, test_X, train_y, test_y = train_test_split(input_data, target, test_size=0.2, random_state=42, shuffle=True)

(2)建立與訓練線性迴歸模型

model = LinearRegression() 

model.fit(train_X, train_y) 

print ('係數: ', model.coef_)

print ('截距: ',model.intercept_)

(3)使用模型進行預測

pred = model.predict(test_X) 

(4)使用MSE計算損失

score = mean_squared_error(pred, test_y) 

print("MSE:", score)

3-3 線性迴歸模型實作範例

3-3-1 預測體重

(3-3-1預測體重.ipynb)

使用身高預估體重,本範例測資來自於Kaggle網站,可以從以下網址下載data.csv。

https://www.kaggle.com/tmcketterick/heights-and-weights

Step1)匯入資料

匯入data.csv到DataFrame。

程式說明

第1到4行:匯入函式庫

第5行:請從Kaggle網站下載data.csv,本範例將檔案放置於E磁碟機的data資料夾,使用者可以自行更改為指定的磁碟機與資料夾,讀取data.csv轉換成DataFrame儲存到變數df。

第6行:函式head顯示變數df的前五筆資料。

執行結果

Step2)檢查資料與分析資料

檢查資料是否有空值,顯示資料筆數、欄位名稱、第一筆資料與第一筆資料的目標值。

程式說明

第1行:使用函式isnull檢查資料是否有空值,如果欄位有空值就會回傳True,轉換成數值1,加總結果就會是空值個數。

第2到3行:使用shape顯示資料的筆數,函式keys顯示欄位名稱。

第4到5行:iloc顯示指定範圍的資料內容,使用[]顯示指定欄位的資料內容。

執行結果

Step3)繪製身高與體重分佈圖

使用繪圖了解資料間關係,繪製身高與體重的分佈圖。

程式說明

第1行:匯入函式庫matplotlib。

第2行:設定繪圖的中文字型。

第3到6行:使用plt.scatter繪製身高(df.Height)與體重(df.Weight)的散佈圖。

執行結果

Step4)整理資料

準備機器學習模型的訓練資料與測試資料。

程式說明

第1行:資料要先進行處理才能輸入線性迴歸模型,使用函式drop從輸入資料中去除體重 (Weight),使用變數X參考到此執行結果。

第2行:取出相依變數體重 (Weight),使用變數y參考到此執行結果。

第3行:使用train_test_split將資料隨機挑選出訓練集與測試集,原始資料的百分之80為訓練集,剩餘百分之20為測試集,設定random_state為42。

第4到6行:使用shape顯示原始資料、訓練資料與測試資料的維度大小。

執行結果

Step5)建立與訓練模型

使用LinearRegression建立模型與訓練模型。

程式說明

第1行:建立線性迴歸模型。

第2行:輸入訓練資料到模型進行訓練。

第3到4行:顯示模型係數與截距。

執行結果

Step6)模型預測

輸入測試資料到模型進行預測,並計算損失值(MSE)。

程式說明

第1行:以test_X為輸入,使用函式predict進行預測,使用變數pred參考到此結果。

第2行:使用函式mean_squared_error計算預測結果pred,與目標結果test_y的損失MSE,使用變數score參考到此結果。

第3行:顯示變數score。

執行結果

Step7)繪製身高與體重散布圖與線性迴歸分析圖

程式說明

使用「plt.plot(test_X, pred, c="red")」繪製身高與體重線性迴歸分析圖(第4行),其餘請參考Step3的說明。

執行結果

3-3-2 預測房價

(3-3-2預測房價.ipynb)

使用房屋買賣資訊,例如:坪數、樓層、房間數等預估房價,本範例測資來自於Kaggle網站,可以從以下網址下載kc_house_data.csv。

https://www.kaggle.com/swathiachath/kc-housesales-data

Step1)匯入資料

匯入kc_house_data.csv到DataFrame。

程式說明

第1到6行:匯入函式庫。

第7行:匯入kc_house_data.csv到DataFrame,使用變數df參考到此結果。

第8行:函式head顯示變數df的前五筆資料。

執行結果

Step2)檢查資料

檢查資料是否有空值,顯示資料筆數、欄位名稱、第一筆資料與第一筆資料的目標值。

程式說明

第1行:使用函式isnull檢查資料是否有空值,如果欄位有空值就會回傳True,轉換成數值1,加總結果就會是空值個數。

第2到3行:使用shape顯示資料的筆數,函式keys顯示欄位名稱。

第4到5行:iloc顯示指定範圍的資料內容,使用[]顯示指定欄位的資料內容。執行結果

執行結果

繪製房間數與房價、屋齡與房價的關係圖。

程式說明

第1行:計算屋齡到欄位age。 

第2行:設定繪圖的中文字型。

第3到6行:使用plt.scatter繪製房間數(df.bedrooms)與房價(df.price的散佈圖。

第7到10行:使用plt.scatter繪製屋齡(df.age)與房價(df.price)的散佈圖。

Step3)整理資料

準備機器學習模型的訓練資料與測試資料。

程式說明

第1行:刪除不需要的欄位,price(價格)、id(編號)、date(成交日期) 、zipcode(郵遞區號) 、lat (緯度)、long(經度)與房屋售價無關,yr_built(完工日期)已經轉換成屋齡。

第2行:price(售價)以萬為單位。

第3行:使用train_test_split將資料隨機挑選出訓練集與測試集,原始資料的百分之80為訓練集,剩餘百分之20為測試集,設定random_state為42。

第4到6行:用shape顯示原始資料、訓練資料與測試資料的維度大小。

執行結果

Step4)建立與訓練模型

使用LinearRegression建立模型與訓練模型。

程式說明

第1行:建立線性迴歸模型。

第2行:輸入訓練資料到模型進行訓練。

第3到4行:顯示模型係數與截距。

執行結果

Step5)模型預測

輸入測試資料到模型進行預測,並計算損失值(MSE)。

程式說明

第1行:以test_X為輸入,使用函式predict進行預測,使用變數pred參考到此結果。

第2行:使用函式mean_squared_error計算預測值pred,與目標值test_y的損失MSE,使用變數score參考到此結果。

第3行:顯示變數score。

執行結果

Step6)只使用房間數進行線性迴歸

程式說明

使用「loc[:, ['bedrooms']]」只取出欄位bedrooms進行分析(第1到2行),其餘請參考本範例之前說明。

執行結果

可以發現當使用欄位越少時,損失值(MSE)數值越大。