線性回歸的原理
對于線性回歸缤至,其數(shù)據(jù)集是{(x1,y1),(x2,y2),,,,(xn,yn)},其中碎绎,xi=(xi1,,,,xid)略步, d表示的是數(shù)據(jù)的維度,n表示樣本數(shù)盯滚。對于線性回歸的一般形式為:
對于θ的確定踢械,使得f(x)無限接近y酗电。我們采用均方誤差的方式進(jìn)行衡量f(x)和y的近似程度。即:
我們的目的就是學(xué)習(xí)θ内列,使得上面的損失最小撵术。
那為什么用均方誤差進(jìn)行衡量呢?
極大似然估計(概率角度的詮釋)
下面用極大似然估計德绿,來解釋為什么要用均方誤差作為性能度量荷荤。
先講一下什么是極大似然估計
極大似然估計,通俗理解來說移稳,利用已知的樣本結(jié)果信息蕴纳,反過來猜測最有可能(最大概率)導(dǎo)致樣本出現(xiàn)該結(jié)果的模型參數(shù)值。
也就是說在提供了一種給定觀察數(shù)據(jù)來評估模型參數(shù)的方法个粱。已知模型古毛,確定參數(shù)。
我們把目標(biāo)值和變量寫成如下等式:
表示預(yù)測值和真實值之間的差距都许,我們假設(shè)是獨(dú)立同分布稻薇,服從高斯分布。(根據(jù)中心極限定理)
所以帶入上面的公式
因此對于所有樣本胶征,我們?yōu)榱耸沟酶怕蕄最大化塞椎,因此有了如下:
我們?yōu)榱俗屵@個p達(dá)到最大,也就是L(θ)最大睛低。這就是上面說的極大似然估計案狠。為了方便計算,我們計算時通常對對數(shù)似然函數(shù)求最大值钱雷,所以會采用取對數(shù)的方式骂铁,將累乘轉(zhuǎn)化成累加:
可以看出最大化l(θ)其實就是最小化
因此用均方誤差來優(yōu)化模型參數(shù)是很合理的。
線性回歸損失函數(shù)罩抗、代價函數(shù)】目標(biāo)函數(shù)
- 損失函數(shù)(Loss Function):
損失函數(shù)度量的是樣本預(yù)測錯誤的程度(對于單個樣本)拉庵。損失函數(shù)越小,擬合的程度越好套蒂,模型也就越好钞支。
常用損失函數(shù)
-
0-1損失函數(shù)、
0-1 loss 是最原始的loss操刀,它是一種較為簡單的損失函數(shù)伸辟,如果預(yù)測值與目標(biāo)值不相等,那么為1馍刮,否則為0,即:
0-1損失可用于分類問題窃蹋,但是由于該函數(shù)是非凸的卡啰,在最優(yōu)化過程中求解不方便静稻,有階躍,不連續(xù)匈辱。0-1 loss無法對x進(jìn)行求導(dǎo)振湾,在依賴于反向傳播的深度學(xué)習(xí)任務(wù)中,無法被使用亡脸,所以使用不多押搪。
2.平方損失函數(shù)、
平方損失函數(shù)標(biāo)準(zhǔn)形式如下:
特點(diǎn):
(1)經(jīng)常應(yīng)用與回歸問題
3.絕對損失函數(shù)浅碾、
絕對值損失函數(shù)是計算預(yù)測值與目標(biāo)值的差的絕對值:
4.對數(shù)損失函數(shù)等
log對數(shù)損失函數(shù)的標(biāo)準(zhǔn)形式如下:
邏輯回歸的損失函數(shù)就是log對數(shù)損失函數(shù)大州。
-
指數(shù)損失函數(shù)(exponential loss)
特點(diǎn):
(1)對離群點(diǎn)、噪聲非常敏感垂谢。經(jīng)常用在AdaBoost算法中厦画。
-
-
Hinge 損失函數(shù)
Hinge損失函數(shù)標(biāo)準(zhǔn)形式如下:
特點(diǎn):
(1)hinge損失函數(shù)表示如果被分類正確,損失為0滥朱,否則損失就為1-yf(x)
SVM就是使用這個損失函數(shù)根暑。
7.交叉熵?fù)p失函數(shù) (Cross-entropy loss function)
交叉熵?fù)p失函數(shù)的標(biāo)準(zhǔn)形式如下:
本質(zhì)上也是一種對數(shù)似然函數(shù),可用于二分類和多分類任務(wù)中徙邻。
二分類問題中的loss函數(shù)(輸入數(shù)據(jù)是softmax或者sigmoid函數(shù)的輸出):
- 代價函數(shù)(cost Function):
代價函數(shù)是度量全部樣本的平均誤差排嫌。
多分類問題中的loss函數(shù)(輸入數(shù)據(jù)是softmax或者sigmoid函數(shù)的輸出):
當(dāng)使用sigmoid作為激活函數(shù)的時候,常用交叉熵?fù)p失函數(shù)而不用均方誤差損失函數(shù)缰犁,因為它可以完美解決平方損失函數(shù)權(quán)重更新過慢的問題淳地,具有“誤差大的時候,權(quán)重更新快民鼓;誤差小的時候薇芝,權(quán)重更新慢”的良好性質(zhì).
常用的代價函數(shù)
- 均方誤差、
2.均方根誤差丰嘉、
3.平均絕對誤差
- 目標(biāo)函數(shù)(Object Function):代價函數(shù)和正則化函數(shù)夯到,最終要優(yōu)化的函數(shù)。
線性回歸的優(yōu)化方法
-
梯度下降:
初始化參數(shù)θ 迭代使得J(θ)最小化:
即:
注:下標(biāo)j表示第j個參數(shù)饮亏,上標(biāo)i表示第i個數(shù)據(jù)點(diǎn)耍贾。
將所有的參數(shù)以向量形式表示,可得:
由于這個方法中路幸,參數(shù)在每個數(shù)據(jù)點(diǎn)負(fù)梯度方面進(jìn)行了移動荐开,因此稱為批梯度下降法對應(yīng)的,我們可以每一次讓參數(shù)只針對一個數(shù)據(jù)點(diǎn)進(jìn)行移動简肴,即:
每次只用一個樣本的梯度進(jìn)行更新晃听,不是用所有樣本的梯度進(jìn)行更新,因此也叫隨即梯度下降法。
隨機(jī)梯度下降法的好處是能扒,當(dāng)數(shù)據(jù)點(diǎn)很多時佣渴,運(yùn)行效率更高;
缺點(diǎn)是初斑,因為每次只針對一個樣本更新參數(shù)辛润,未必找到最快路徑達(dá)到最優(yōu)值,甚至有時候會出現(xiàn)參數(shù)在最小值附近徘徊而不是立即收斂见秤。但當(dāng)數(shù)據(jù)量很大的時候砂竖,隨機(jī)梯度下降法經(jīng)常優(yōu)于批梯度下降法。
當(dāng)J為凸函數(shù)時鹃答,梯度下降法相當(dāng)于讓參數(shù)θ不斷向J的最小值位置移動
梯度下降法的缺陷:如果函數(shù)為非凸函數(shù)乎澄,有可能找到的并非全局最優(yōu)值,而是局部最優(yōu)值挣跋。
-
最小二乘法矩陣求解:
令
對于x(i)
hθ(x)可以得到:
為最小化J(θ) ,對θ求導(dǎo)可得:
中間兩項互為轉(zhuǎn)置,由于求得的值是個標(biāo)量避咆,矩陣與轉(zhuǎn)置相同舟肉,因此可以寫成
令偏導(dǎo)數(shù)等于零,由于最后一項和θ無關(guān)查库,偏導(dǎo)數(shù)為0路媚。
利用矩陣求導(dǎo)性質(zhì)樊销,
令導(dǎo)數(shù)等于零整慎,
3、牛頓法
重復(fù)迭代围苫,可以讓逼近取到 ??(??) 的最小值
當(dāng)我們對損失函數(shù) ??(??) 進(jìn)行優(yōu)化的時候裤园,實際上是想要取到 ??′(??) 的最小值,因此迭代公式為:
??:=?????′(??)??″(??)
其中拧揽,是
對
的偏導(dǎo)數(shù),
是
的海森矩陣腺占,
4淤袜、擬牛頓法
擬牛頓法的思路是用一個矩陣替代計算復(fù)雜的海森矩陣H,因此要找到符合H性質(zhì)的矩陣衰伯。
要求得海森矩陣符合的條件铡羡,同樣對泰勒公式求導(dǎo)
令 ??=??1 ,即迭代后的值意鲸,代入可得:
更一般的烦周,
???? 為第k個迭代值
即找到矩陣G尽爆,使得它符合上式。 常用的擬牛頓法的算法包括DFP读慎,BFGS等教翩,作為選學(xué)內(nèi)容,有興趣者可自行查詢材料學(xué)習(xí)贪壳。
線性回歸的評價指標(biāo)
均方誤差(MSE):平均絕對誤差(MAE):
但以上評價指標(biāo)都無法消除量綱不一致而導(dǎo)致的誤差值差別大的問題,最常用的指標(biāo)是R2,可以避免量綱不一致問題
R2也叫擬合優(yōu)度蚜退,越接近1闰靴,表示可解釋力度越大,模型擬合的效果越好钻注。
R2_score = 1蚂且,樣本中預(yù)測值和真實值完全相等,沒有任何誤差幅恋,表示回歸分析中自變量對因變量的解釋越好杏死。
R2_score = 0。此時分子等于分母捆交,樣本的每項預(yù)測值都等于均值淑翼。
代碼展示
生成數(shù)據(jù):
#生成數(shù)據(jù)
import numpy as np
#生成隨機(jī)數(shù)
np.random.seed(1234)
x = np.random.rand(500,3)
#構(gòu)建映射關(guān)系,模擬真實的數(shù)據(jù)待預(yù)測值,映射關(guān)系為y = 4.2 + 5.7*x1 + 10.8*x2品追,可自行設(shè)置值進(jìn)行嘗試
y = x.dot(np.array([4.2,5.7,10.8]))
先嘗試調(diào)用sklearn的線性回歸模型訓(xùn)練數(shù)據(jù):
import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
%matplotlib inline
lr = LinearRegression(fit_intercept=True)
lr.fit(x,y)
print("估計的參數(shù)值為:%s" %(lr.coef_))
print('R2:%s' %(lr.score(x,y)))
x_test = np.array([2,4,5]).reshape(1,-1)
y_hat = lr.predict(x_test)
print("預(yù)測值為: %s" %(y_hat))
估計的參數(shù)值為:[ 4.2 5.7 10.8]
R2:1.0
預(yù)測值為: [85.2]
最小二乘法的矩陣求解
class LR_LS():
def __init__(self):
self.w = None
def fit(self, X, y):
# 最小二乘法矩陣求解
self.w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
def predict(self, X):
y_pred = X.dot(self.w)
return y_pred
if __name__ == "__main__":
lr_ls = LR_LS()
lr_ls.fit(x,y)
print("估計的參數(shù)值:%s" %(lr_ls.w))
x_test = np.array([2,4,5]).reshape(1,-1)
print("預(yù)測值為: %s" %(lr_ls.predict(x_test)))
梯度下降法:
class LR_GD():
def __init__(self):
self.w = None
def fit(self,X,y,alpha=0.02,loss = 1e-10): # 設(shè)定步長為0.002,判斷是否收斂的條件為1e-10
y = y.reshape(-1,1) #重塑y值的維度以便矩陣運(yùn)算
[m,d] = np.shape(X) #自變量的維度
self.w = np.zeros((d)) #將參數(shù)的初始值定為0
tol = 1e5
#============================= show me your code =======================
while tol > loss:
h_f = X.dot(self.w).reshape(-1,1)
theta = self.w + alpha*np.mean(X*(y - h_f),axis=0) #計算迭代的參數(shù)值
tol = np.sum(np.abs(theta - self.w))
self.w = theta
#============================= show me your code =======================
def predict(self, X):
# 用已經(jīng)擬合的參數(shù)值預(yù)測新自變量
y_pred = X.dot(self.w)
return y_pred
if __name__ == "__main__":
lr_gd = LR_GD()
lr_gd.fit(x,y)
print("估計的參數(shù)值為:%s" %(lr_gd.w))
x_test = np.array([2,4,5]).reshape(1,-1)
print("預(yù)測值為:%s" %(lr_gd.predict(x_test)))
思考
- 思考題:既然代價函數(shù)已經(jīng)可以度量樣本集的平均誤差玄括,為什么還要設(shè)定目標(biāo)函數(shù)?
當(dāng)模型復(fù)雜度增加時肉瓦,有可能對訓(xùn)練集可以模擬的很好遭京,但是預(yù)測測試集的效果不好,出現(xiàn)過擬合現(xiàn)象泞莉,這就出現(xiàn)了所謂的“結(jié)構(gòu)化風(fēng)險”哪雕。結(jié)構(gòu)風(fēng)險最小化即為了防止過擬合而提出來的策略
- 問題:請用泰勒展開法推導(dǎo)牛頓法公式
將 ??(??) 用泰勒公式展開到第二階,
對上式求導(dǎo)鲫趁,并令導(dǎo)數(shù)等于0斯嚎,求得x值
可以求得,
牛頓法的收斂速度非骋快孝扛,但海森矩陣的計算較為復(fù)雜,尤其當(dāng)參數(shù)的維度很多時幽崩,會耗費(fèi)大量計算成本苦始。我們可以用其他矩陣替代海森矩陣,用擬牛頓法進(jìn)行估計慌申,