線性迴歸 - 統計和預測的最基礎

線性回歸 (Linear Regression) 應用於不同的方面以達到不同的目的。 描述自變量Independent Variables($ x_i $)和因變量Dependent Variables($ y $)之間的關係的方法,或者通過輸入($ x_i $)預測目標變量($ y $)。 還有助於我們了解在更改一個或多個獨立變量時對因變量變化的影響。

公式:
$$y = w_0+w_1x_1+w_2x_2+ ... +w_nx_n$$
也可以表示為:
$$h_w(x)=\sum_{i=1}^{m}{w_ix_i}=w^Tx$$

Cost Function定義為$h_w(x^{(j)})$和$y^{(j)}$之間的差的平方和。 統計學上,被稱為平方誤差(Sum of Square Error, SSE)。 為了使直線符合$n$數據點,Cost Function / SSE需要最小化以實現優化目標,這過程又稱OLS Estimation(Ordinary least squares Estimation)。

直觀地想,預測值(Predicted value)和實際目標(Actual value)值之間的差異越小,預測模型給出的結果越接近實際值,也暗示這個模型的愈準確,誤差值亦愈小,$R^2$表示線性回歸模型解釋數據的能力。愈高的$R^2$意味著模型愈有能力解釋現有的數據。 它還量度總變異, $SST$和回歸平方誤差的和, $SSR$的比例。

$R^2=\frac{SSR}{SST}$, where $0\leq R^2\leq 1$

但是,線性回歸面對著非線性關係的變數,不如其他模型那樣精確,如神經網絡,始終它假設輸入和輸出的線性關係。 線性回歸的另一個問題是它對Outlier(主要是Influence Point) 的敏感性,會影響預測結果的準確性。 在我們訓練模型之前,可以在某些圖表中或者統計結果中被識別,把Outlier踢出來解決這個問題。



In previous chapter, I have introduced the overall process of data mining. Some of you might not understand well. It should be fine since the scope of data mining across the many study areas. So as to let you guys know about the details, I will take the Python as programming language to build Linear Regression model, fit the data and finally assess the performance.

在Python中實現
上一章中,我介紹了數據挖掘的整體過程,讀者們可能會覺得比較抽象,而事實上線性迴歸,正正用在Modelling這一部分。 為了讓大家更了解細節,我將把Python作為編程語言來建立線性回歸模型,擬合數據並最終評估其性能。


1. 安裝Scikit-Learn
根據先前的文章來安裝用作Machine Learning的Package。接下來,我們可以打開Python編輯器。 最近,我沉醉於PyCharm的開發和編碼,因為它充足的提示能加快我的開發速度。 請不要擔心,這純粹是我個人的喜好,所以歡迎您使用自己喜歡的Editor。


2. 數據收集和數據可視化
在建立任何模型進行預測或分類之前,首先你要有女朋友數據。 請從GitHub的存儲庫中下載數據(data.csv)和相關資料。 你可以找到train_data.csv,其中包括20個會員的個人信息,包括姓名,年齡,性別(1:男,0:女),月薪,每月消費量。

另一個檔案test_data.csv還包括沒有目標變量的個人信息(每個月的消費量),我們將通過使用訓練數據構建的模型預測數量。

假設你已經安裝了Scikit-Learn的Package,我們可以藉助Matplotlib軟件包,以2-D圖形式顯示數據,以顯示因變量(consumption_amount)和自變量(年齡,性別,工資)之間的關係。
import matplotlib.pyplot as plt 
for i in range(2,5):    # Loop i from 2 to 4 
    plt.subplot(2, 2, i-1)    # (i-1)th graph will be added to the plot => 1st, 2nd, 3rd graph
    plt.subplots_adjust(wspace=0.3, hspace=0.3)  # Separate the 3 graph
    plt.scatter(train_data[[i]], train_data.consumption_amount, color="black")      
    plt.xlabel(train_data.columns[i])    # label of x-axis
    plt.ylabel(train_data.columns[5])   # label of y-axis
plt.show()



3. 準備數據
如果您沒有安裝Pandas,可以參考本教程進行安裝。 安裝後,我們創建一個為“lin_reg.py”的新的python文件並導入Pandas Package。首先,我們需要在Pandas的幫助下讀取數據並將其轉換成數據的格式,這是Python中的著名Packages之一。 由於目標變量位於第六列,因此其Index應為5(因為0是Starting Index)。 我們只會選擇年齡,性別和薪水(Index:2, 3, 4)作為Input Variables,並將它們放入Numpy陣列中。
import numpy as np, pandas as pd
train_data = pd.read_csv("train_data.csv")  # pd refers to pandas
# split the data into input and target variables 
train_input = np.array(train_data[[i for i in range(2, 5)]])  # [i for i in range(2, 5)] is list comprehension that is [2, 3, 4]
train_target = np.array(train_data[[5]])

4. 建模和評估
準備好輸入和目標變數後,我們終於可以建立我們的第一個預測模型! 全靠Scikit-Learn,它節省了許多複雜的編碼和時間。 由於我們使用pip安裝了scikit-learn軟件包,我們可以從中導入linear_model。在之後,我們需要用適當的Parameters來建立一個新的線性回歸預測器。 巧合的是,我們需要的所有Parameters都設置了合適的默認值。 因此,我們沒有必要卜參數的值。
from sklearn import linear_model
model = linear_model.LinearRegression()  # Default: fit_intercept=True, normalize=False, copy_X=True, n_jobs=1

為了在訓練數據的線性回歸中訓練參數($w$,不要混淆函數的參數!),將使用function: “fit”函數。 我們將輸入數據和目標數據放入“fit”功能。 然後,將“模型”的參數($w$)調整為優化的參數,並建立用訓練數據訓練的線性回歸模型。


要注意的是,自變量的數量, $n$ = 3和訓練數據的數量, $j$ = 20。
$$h_w(x)=w_0+w_1x_1+w_2x_2+w_3x_3$$
然後,我們可以通過調整model的屬性來查看intercept($w_0$),參數($w$)的值。 另外,平均誤差和$R^2$都是對評估模型的性能的重要指標。
model.fit(train_input, train_target)

coef_of_det = model.score(train_input, train_target)  # score is the Coefficient of Determination
sse_train = sum((model.predict(train_input) - train_target)**2)
print "Intercept: ", model.intercept_
print "Coefficient: ", model.coef_
print "Sum of Square Error of Training Data: ", sse_train
print "R square: ", coef_of_det 

十分好!如果您使用默認的IDLE,你應該已經獲得了結果。 如果沒有,讓我們用Terminal運行python的檔案。
python lin_reg.py

我們可以評估模型的性能以及它如何適應訓練數據。 結果如下:
Intercept:  [ 802.27182655]
Coefficient:  [[ -23.92508808  159.8641272     0.16017803]]
Sum of Square Error of Training Data:  [ 2195542.00286537]
R square:  0.904772738595
5. 預測新數據
我們可以看到R平方 (Coefficient of Determination) 接近0.9,這意味著模型十分適合訓練數據。 一般來說,模型的參數需要被調整為最好的模型(你自己的目標決定好的指標)。 假設我們訓練的模型足以估計目標變數 (Consumption Amount)。
# predict the testing data
test_data = pd.read_csv("test_data.csv")
test_input = np.array(test_data[[i for i in range(2,5)]])
test_target = model.predict(test_input)
for i in range(5):
    print test_data.name[i], ": ", test_target[i][0]

每個會員每月消費的預測金額如下所示:
Uriah :  5177.66325009
Vanessa :  5153.03590309
Wayne :  8277.20964953
Yoyo :  5666.82497116
Zack :  4872.9185399
做得好! 你已經建立了一個用於預測和簡單的機器學習模型。 希望你能更了解線性回歸及如何應用在機器學習中。 事實上,除了線性回歸模型,還有很多預測算法。 在之後我將介紹一些更多變化和複雜的模型來作預測,例如回歸樹和神經網絡。



Comments