官术网_书友最值得收藏!

  • 機器學習(第2版)
  • 趙衛(wèi)東 董亮編著
  • 2835字
  • 2025-01-16 17:43:26

2.1.5 線性回歸

線性回歸(Linear Regression)是一種通過擬合自變量與因變量之間的最佳線性關(guān)系,來預測目標變量的方法?;貧w過程是給出一個樣本集,用函數(shù)擬合這個樣本集,使樣本集與擬合函數(shù)間的誤差最小。生物統(tǒng)計學家高爾頓研究父母和子女身高的關(guān)系時發(fā)現(xiàn):即使父母的身高都“極端”高,其子女不見得會比父母高,而是有“衰退”(Regression)至平均身高的傾向。具體地說,回歸分析包括以下內(nèi)容。

(1)確定輸入變量與目標變量間的回歸模型,即變量間相關(guān)關(guān)系的數(shù)學表達式。

(2)根據(jù)樣本估計并檢驗回歸模型及未知參數(shù)。

(3)從眾多的輸入變量中,判斷哪些變量對目標變量的影響是顯著的。

(4)根據(jù)輸入變量的已知值來估計目標變量的平均值并給出預測精度。

線性回歸的類型包括簡單線性回歸和多元線性回歸。簡單線性回歸使用一個自變量,通過擬合最佳線性關(guān)系來預測因變量。多元線性回歸使用多個獨立變量,通過擬合最佳線性關(guān)系來預測因變量。

如何獲得回歸模型的公式?一元線性回歸本質(zhì)上就是尋找一條直線y=ax+b,使所有樣本點都盡量在這條直線上或靠近這條直線。每一個點對應(x,y)坐標,是實際的點,而通過回歸公式預測的縱坐標值為y=ax+b,將所有點的預測值與實際值的差取平方后求和,就可以算出這條直線總的誤差L(a,b):

(, )L ab =1=i [∑n iy- +iax b 2])(

要想求出公式中的ab值,只需要使得L(a,b)取極小值即可,式中的L(a,b)為關(guān)于ab的二元函數(shù)。

如何評價回歸模型的好壞?通過統(tǒng)計學中的R2(Coefficient of Determination),也稱為判定系數(shù)、擬合優(yōu)度、決定系數(shù)等,來判斷回歸方程的擬合程度。R2是如何計算的?首先要明確以下幾個概念。

總偏差平方和(Sum of Squares for Total,SST)是每個因變量的實際值(公式中的yi)與其平均值(公式中的)的差的平方和,反映了因變量取值的總體波動情況,其值越大說明原始數(shù)據(jù)本身具有越大的波動,其公式如下。

SST=n∑(y yi- )2 i=1

例如,用銷售額與其平均銷售額的差的平方和來表示銷售額整體的波動情況,也就是說,這種波動情況是由單個銷售額與均值之間的偏差指標SST來表示的。

回歸平方和(Sum of Squares for Regression,SSR)是因變量的回歸值(由回歸方程計算取得,對應公式中的)與其均值(公式中的)的差的平方和,它反映回歸直線的波動情況。

SSR=∑n (y? yi )2-i=1

例如,回歸線表示廣告費這個變量對于總銷售額的影響,它只能解釋廣告費帶來的影響,這種影響的偏差由SSR來表示。

殘差平方和(Sum of Squares for Error,SSE)又稱誤差平方和,表示因變量的實際值與回歸值的差的平方和,它反映了回歸方程以外因素的影響,即回歸直線無法解釋的因素。

SSE=∑n ( i-i y? y 2) i=1

例如,廣告費只是影響銷售額的其中一個比較重要的因素,除了廣告費之外,還有其他因素(如產(chǎn)品質(zhì)量、客戶服務水平等)會對銷售額產(chǎn)生影響,因此銷售額不能用回歸線來解釋的部分就由SSE來表示。

總的偏差可以用回歸方程偏差加上殘差偏差來表示,其公式如下,其中SST是總的偏差, SSR是回歸平方和,即回歸方程可以表示的偏差,SSE是回歸方程不能表示的偏差。

SST = SSR + SSE

回歸方程擬合程度的好壞是看這條回歸線能夠多大程度解釋目標值(如銷售額)的變化,一般采用R2指標來計算:

R =2 SST SSR 1= -SST SSE

R2的取值為[0,1],從其定義可見,其越接近1,擬合程度越好。當R2為1時表示回歸方程可以完全解釋因變量的變化。如果R2很低,說明因變量和目標變量之間可能并不存在線性關(guān)系。

調(diào)整R2是指對R2進行修正后的值,對非顯著性變量給出懲罰,它沒有R2的統(tǒng)計學意義,與實際樣本的數(shù)值無關(guān),與R2相比,其誤差較少,是回歸分析中重要的評價指標,其值越大說明模型效果越好。

因變量預測標準誤差是指因變量的實際值與預測值的標準誤差,其值越小說明模型的準確性越高,代表性越強,擬合性越好。

F 值在方差分析表中查看,用于檢測回歸方法的相關(guān)關(guān)系是否顯著。如果顯著性水平 Sig指標大于0.05,表示相關(guān)性較弱,沒有實際意義。如果發(fā)現(xiàn)模型的Sig指標低于0.05,但是各自變量的Sig指標均超過0.05,就需要應用t檢驗查看回歸系數(shù)表中各變量的顯著性水平,可能是自變量之間出現(xiàn)了共線性問題,需要通過逐步回歸的方法將顯著性較差的自變量剔除。

假設n為實際樣本數(shù)量,可能有部分數(shù)據(jù)為空值或其他異常值,導致模型的實際擬合樣本數(shù)較少。如果發(fā)現(xiàn)其值較大,需要對數(shù)據(jù)重新進行預處理。

多元線性回歸方程公式為:

y=β 0+β1x1+β2x2+…+βkxk+u

要求每個xi是相互獨立的,其中βi表示回歸系數(shù),u為隨機誤差。

給定n個樣本數(shù)據(jù)(x1i,x2i,…,xki;yi)代入多元線性回歸方程:

1y y 0β β= +2 0β β= +x x 1 11 1 12+ x x 2 21β 1x x k kβ……+ + +1u 2 22β+2k kβ+ + +2u xny 0β β= +?1 1n nx2 2β+ …+ + xk knβ +nu

轉(zhuǎn)換成矩陣表達形式:

Y =Xβ+u ×n n1y 2Y=?1y y X=n2n1x x1? ? ?2212 x x x x 1 1 2111………( 1)× +kn n kx?2k x x k1=β+ ×k (k 1) 1β?1 0β β ×n n1u u=?2 u u 1

由此矩陣方程容易得到回歸系數(shù)βi的估計值(假設xi是相互獨立的):

XY X XT β= T ?β? (= X X XYT )-1 T

求出估計回歸系數(shù)后,需要對回歸方程進行顯著性檢驗,以確保每個自變量都是對因變量有顯著性的影響的。擬合優(yōu)度R2同樣適用于多元線性回歸的假設檢驗。

在實際應用中,多個自變量 xi相互獨立的條件很難滿足,這就需要解決多重共線性的問題,常用的方法有嶺回歸、LASSO 回歸和彈性網(wǎng)絡回歸等方法。這些回歸方法的主要思想是在回歸方程的損失函數(shù)上加上正則項,以減少自變量相關(guān)引起的回歸方程過擬合的問題。

嶺回歸、LASSO回歸和彈性網(wǎng)絡回歸方程的損失函數(shù)分別如下。

嶺回歸方程:

1=i∑n2=θL n1( ) i-θ yi )2( )h x( j j∑λ θ+ 2

LASSO回歸方程:

1=in2 1=θ( )L n∑iθ yi )2-( )h x( j jλ θ| |∑+

彈性網(wǎng)絡回歸方程:

θL( ) (=n1 n2 1=i∑θ h x( )i -i y)2 +jj j∑2j1 λ θλ θ+2∑

式中θ表示回歸系數(shù),hθ(xi)表示回歸方程對于樣本xi的估計值,yi表示樣本因變量的真實值, λ1λ2為正則化因子。當λ2=0時,彈性網(wǎng)絡回歸退化成嶺回歸;當λ1=0時,彈性網(wǎng)絡回歸退化成LASSO回歸。

嶺回歸的Python調(diào)用代碼如下:

from sklearn.linear_model import Ridge,RidgeCV
rigdeCV  =  RidgeCV(alphas=Lambdas,normalize=True,scoring='neg_mean_squared_error', cv=15)
rigdeCV.fit(X_train,Y_train)
predictedResult = rigdeCV.predict(X_test)

LASSO回歸和彈性網(wǎng)絡的Python代碼類似。

線性回歸只是自變量在局部取值范圍內(nèi)變量之間的一種近似關(guān)系,實際上變量之間更多的是非線性的關(guān)系。非線性模型是一個或多個自變量的非線性組合。

對于非線性回歸分析,為了便于利用樣本求出其中的回歸系數(shù),一般的做法是對變量進行轉(zhuǎn)換,把非線性模型轉(zhuǎn)換為線性模型,然后利用上述方法求解其中的回歸系數(shù)。例如對雙曲線函數(shù)需要進行線性變換:y1=1/y,x1=1/x,得到 y1=a+bx1。對于 y=axβ,需要做如下非線性變換:y 1=ln y,x 1=ln x,ln y=ln a+βln x,得到y 1=ln a+βx 1。

如果多個自變量之間是相互獨立或弱相關(guān)的,可以分別研究因變量與各個自變量的關(guān)系,然后加權(quán)求和,求出整個非線性回歸方程。此外,分段函數(shù)求解或許是一種可行的選擇。

【例2.1】 利用犯罪嫌疑人的足長和步幅預測其身高。

利用給定的足長、步幅和身高數(shù)據(jù)集,以足長、步幅為自變量,身高為因變量,采用二元線性回歸獲得預測身高的模型,對應的Python代碼如下:

import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # 用Axes3D庫畫三維模型圖
from sklearn.linear_model import LinearRegression
#讀取數(shù)據(jù)
df = pd.read_excel("身高預測參照表.xlsx")
df.columns = ['足長', '步幅', '身高']
# 獲取拆分后的數(shù)據(jù)x_data、y_data(其中x_data為數(shù)據(jù)集,y_data為標簽)
def get_data(data):
    x_data = data.drop(columns=['身高'], axis=1)
    y_data = data['身高']
    return x_data, y_data
x_data, y_data = get_data(df)
# 訓練模型
lr = LinearRegression()
lr.fit(x_data, y_data)
y_pred = lr.predict(x_data)
print(lr.coef_, lr.intercept_)
print(lr.score(x_data, y_data)) #顯示擬合優(yōu)度
x1_data = x_data.drop(columns=['步幅'], axis=1)
x2_data = x_data.drop(columns=['足長'], axis=1)
plt.rcParams['font.sans-serif'] = 'SimHei' # 設置字體
fig = plt.figure(figsize=(8,6)) # 設置畫布大小
ax3d = Axes3D(fig)
ax3d.scatter(x1_data,x2_data,y_data,color='b',marker='*',label='actual')  #實際樣本可視化
ax3d.scatter(x1_data,x2_data,y_pred,color='r',label='predict') #預測數(shù)據(jù)可視化
ax3d.set_xlabel('足長',color='r',fontsize=16) # 設置x軸標簽
ax3d.set_ylabel('步幅',color='r',fontsize=16) # 設置y軸標簽
ax3d.set_zlabel('身高',color='r',fontsize=16) # 設置z軸標簽
plt.suptitle("身高與足長、步幅關(guān)系模型",fontsize=20)
plt.legend(loc='upper left')
plt.show()

程序運行結(jié)果如圖2-4所示,其中可以看到回歸系數(shù)分別約為3.172、0.327和70.611,擬合優(yōu)度R2約為0.983,可見可以接受使用二元線性回歸。

圖2-4 身高與足長、步幅的關(guān)系

主站蜘蛛池模板: 屯门区| 新兴县| 诸暨市| 谢通门县| 潞西市| 子长县| 恩施市| 高安市| 彩票| 珠海市| 闸北区| 常州市| 奇台县| 竹溪县| 吉林省| 凌云县| 宜兰县| 阳曲县| 光山县| 无极县| 永春县| 桐柏县| 天等县| 潼南县| 迭部县| 新建县| 通山县| 攀枝花市| 南投县| 亚东县| 南澳县| 莆田市| 莲花县| 武邑县| 特克斯县| 浑源县| 佛坪县| 凌云县| 将乐县| 富民县| 台南县|