機器學習初級算法(二)——線性回歸

python進階者 發佈 2020-01-06T18:52:14+00:00

線性回歸原理一般而言,房價會受很多因素的影響而波動,如果我們假設房價只與房產面積已經廳室數量有關係,可以看到房價、面積、廳室呈現以下數據:房產數據我們可以將價格y和面積x1、廳室數量x2的關係表示為f(x)=θ0+θ1x1+θ2x2,很顯然,我們的目的是使得f(x)儘量等於y,這

線性回歸原理

一般而言,房價會受很多因素的影響而波動,如果我們假設房價只與房產面積已經廳室數量有關係,可以看到房價、面積、廳室呈現以下數據:

我們可以將價格y和面積x1、廳室數量x2的關係表示為f(x)=θ0+θ1x1+θ2x2,很顯然,我們的目的是使得f(x)儘量等於y,這就是一個直觀的線性回歸的樣式。

  • 線性回歸的一般形式

假設有數據集{(x1, y1), (x2, y2), ..., (xn, yn)},其中,xi=(xi1; xi2; xi3; ...; xid)∈n表示變量的數量,d表示每個變量的維度。那麼,我們可以用以下函數來描述y和x之間的關係:

如何來確定θ的值,使得f(x)儘可能接近y呢?回歸問題中常用的性能度量是均方誤差,可以表示為如下公式:

我們可以選擇合適的θ來讓均方誤差最小化。

  • 極大似然估計

下面我們用極大似然估計來解釋為什麼要用均方誤差作為線性回歸的性能度量。我們可以把目標值和變量寫成如下等式:

ϵ表示我們未觀測到的變量的印象,即隨機噪音。我們假定ϵ是獨立同分布,服從高斯分布。根據中心極限定理得到如下結果:

我們建立極大似然函數,即描述數據遵從當前樣本分布的機率分布函數。由於樣本的數據集獨立同分布,因此可以寫成如下形式:

我們選擇可以使似然函數最大化的θ,這就是極大似然估計的思想。為了方便計算,我們計算時通常對對數似然函數求最大值,即對兩邊取對數,推導結果如下:

由上述推導可知,最大化似然函數與最小化紅框部分是等價的(前面的1/2是為了後續計算方便的)。顯然,這一結果就是均方誤差,因此我們證明了用這個式子作為代價函數來優化線性回歸模型在統計學的角度上來說是合理的。

線性回歸的損失函數、代價函數與目標函數

首先明確損失函數、代價函數與目標函數的概念。損失函數度量的是單樣本預測的錯誤程度,損失函數值越小,模型就越好。代價函數度量的是全部樣本集的平均誤差。目標函數則是代價函數和正則化函數,也是模型最終要優化的函數。

從上述概念中可以發現,代價函數已經可以度量樣本集的平均誤差了,那麼我們為什麼還要設定目標函數呢?這是因為當模型複雜度增加時,有可能出現對訓練集模擬得很好,但是對測試集的效果卻不好,也就是我們所說的過擬合現象,我們也稱之為結構化風險。結構化風險最小化就是為了防止過擬合而提出來的策略。定義模型複雜度為J(F),則目標函數可表示為如下形式:

其中,λJ(F)我們稱為正則化,其目的就是防止過擬合。當訓練集本身存在噪聲時,擬合曲線對未知影響因素的擬合往往不是最好的。通常,隨著模型複雜度的增加,訓練誤差會減少;但測試誤差會先增加後減小。我們的最終目的是使測試誤差達到最小,因此我們需要選取適合的目標函數。

線性回歸的優化方法

常見的優化方法有梯度下降法、最小二乘法矩陣、牛頓法和擬牛頓法。對於線性回歸模型,我們一般選用批隨機梯度下降法(與隨機梯度下降法不同,但現在我們所說的隨機梯度下降往往是批隨機梯度下降)來優化模型。推導過程如下:

其中,下標j表示第j個參數,上標i表示第i個數據點。隨機梯度下降法的優點是當數據點很多時,運行效率更高;缺點是由於每次只針對一批樣本更新參數,未必能找到最快路徑達到最優值,甚至有時候會出現參數在最小值附近徘徊無法收斂。如果函數為非凸函數,有可能找到的並非全局最優值,而是局部最優值。

線性回歸的評價指標

線性回歸是典型的回歸問題,對於回歸問題,常用的評價指標有均方誤差(MSE)、均方根誤差(RMSE)和平均絕對誤差(MAE),但這些評價指標都無法消除量綱不一致而導致的誤差值特別大的問題,因此對於線性回歸,我們最常用的指標是R^2,可以避免量綱不一致問題。

其中,VAR為實際結果與預測結果的方差,從式子中可以看出,R^2能夠讓回歸模型可以成功解釋數據方差部分在數據固有方差中所占的比例,R^2越接近1,表示可解釋力度越大,模型擬合的效果也就越好。

使用sklearn實現一個簡單的線性回歸案例

sklearn(scikit-learn)是基於Python實現的機器學習工具以及簡單高效的數據挖掘和數據分析工具,其內部集成了常用的所有機器學習模型,線性回歸模型就包含在sklearn的linear_model庫中。因此,在使用時,我們需要將該線性回歸模型導入。

from sklearn.linear_model import LinearRegression

下面我們通過一個簡單的例子來感受一下線性回歸模型的整個流程。首先我們利用NumPy生成數據:

import numpy as np
from sklearn.linear_model import LinearRegression

# 生成隨機數種子 使每次產生的隨機數都一樣
np.random.seed(49)
x = np.random.rand(500, 3)
print(x)
# 構建映射關係,模擬真實的數據待預測值
# 映射關係設置為y = 2.1 + 2.8*x1 + 5.4*x2
y = x.dot(np.array([2.1, 2.8, 5.4]))

這裡生成了一組映射關係為y = 2.1 + 2.8*x1 + 5.4*x2的數據,然後就可以利用sklearn的線性回歸模型來訓練模型並將訓練好的模型用於預測。

# 生成模型
lr = LinearRegression(fit_intercept=True)
# 訓練模型
lr.fit(x, y)
print("訓練的參數值結果為:%s" % (lr.coef_))
# 評估模型
print('R^2為:%s' % (lr.score(x, y)))
# 預測目標值
x_test = np.array([2, 4, 5]).reshape(1,-1)
y_test = lr.predict(x_test)
print("預測值為: %s" % (y_test))

運行結果如下所示:

由於我們設置的線性回歸模型比較簡單,只有三個參數,因此它的準確度達到了100%。

關鍵字: