迴歸是估計輸入資料與連續值輸出資料之間關係的過程。資料通常是實數形式的,我們的目標是估計滿足輸入到輸出對映關係的基本函式。讓我值們從一個簡單的示例開始。考慮下面的輸入與輸出對映關係:
1→2
3→6
4。3→8。6
7。1→14。2
如果要你估計輸入與輸出的關聯關係,你可以透過模式匹配輕鬆地找到結果。我們發現輸出結果一直是輸入資料的兩倍,因此輸入與輸出的轉換公式就是這樣:
f(x)=2x
這是體現輸入值與輸出值關聯關係的一個簡單函式。但是,在真實世界中通常都不會這麼簡單,輸入與輸出的對映關係函式並不是一眼就可以看出來的。
線性迴歸用輸入變數的線性組合來估計基本函式。上面的示例就是一種單輸入單輸出變數的線性迴歸。
線性迴歸的目標是提取輸入變數與輸出變數的關聯線性模型,這就要求實際輸出與線性方程預測的輸出的殘差平方和最小化。這種方法被稱為普通最小二乘法。
我們可能覺得用一條曲線對這些點進行擬合效果會更好,但是線性迴歸不允許這樣做。線性迴歸的主要優點就是方程簡單。如果想用非線性迴歸,可能會得到更準確的型,但是擬合速度會慢很多。線性迴歸模型就像下圖顯示的,用一條直線近似資料點的趨勢。接下來看看如何用 Python建立線性迴歸模型。
我們先準備好一份資料檔案data_singlevar。txt,相關資料檔案可到
https://github。com/windform/Python-Machine-Learning-Cookbook/blob/master/Chapter01/data_singlevar。txt
這個地址下載。
檔案裡第一個欄位是輸入值,第二個欄位是與逗號前面的輸入值相對應的輸出值。
(1)我們先匯入載入資料
#載入、匯入資料
import sys
import numpy as np
filename = ‘data_singlevar。txt’
x = []
y = []
with open(filename, ‘r’) as f:
for line in f。readlines():
data = [float(i) for i in line。split(‘,’)]
xt, yt = data[:-1], data[-1]
X。append(xt)
y。append(yt)
把輸入資料載入到變數x和y,其中x是資料,y是標記。在程式碼的for迴圈體中,我們解析每行資料,用逗號分割欄位。然後,把欄位轉化為浮點數,並分別儲存到變數x和y中。
(2)建立機器學習模型時,需要用一種方法來驗證模型,檢查模型是否達到一定的滿意度。為了實現這個方法,把資料分成兩組:訓練資料集( training dataset)與測試資料集( testing dataset)。訓練資料集用來建立模型,測試資料集用來驗證模型對未知資料的學習效果。因此,
先把資料分成訓練資料集與測試資料集
:
num_training = int(0。8 * len(x))
num_test = len(x) - num_training
#訓練資料
x_train = np。array(x[:num_training])。reshape((num_training,1))
y_train = np。array(y[:num_training])
#測試資料
x_test = np。array(x[num_training:])。reshape((num_test,1))
y_test = np。array(y[num_training:])
這裡用8%的資料作為訓練資料集,其餘20%的資料作為測試資料集。
(3)現在已經準備好訓練模型。接下來建立一個迴歸器物件。
from sklearn import linear_model
#建立迴歸器物件
linear_regressor = linear_model。LinearRegression()
#用訓練資料集訓練模型
linear_regressor。fit(x_train,y_train)
(4)我們利用訓練資料集訓練了線性迴歸器,向fit方法提供輸入資料即可訓練模型,接下來是擬合數據模型:
#擬合
import matplotlib。pyplot as plt
y_train_pred = linear_regressor。predict(x_train)
plt。figure()
plt。scatter(x_train,y_train,color=‘green’)
plt。plot(x_train,y_train_pred,color=‘black’,linewidth=4)
plt。title(‘Training data’)
plt。show()
從上圖可以看出,模型訓練的效果很好,但這隻能體現模型對訓練資料的擬合效果。
(5)接下來用模型對測試資料集進行預測:
#資料預測
y_test_pred = linear_regressor。predict(x_test)
plt。scatter(x_test,y_test,color=‘green’)
plt。plot(x_test,y_test_pred,color=‘black’,linewidth=4)
plt。title(‘Test data’)
plt。show()
相關閱讀:
《每天一點統計學——用最小二乘法求最佳擬合線》
《用R語言做資料分析——一元線性迴歸》