我感觉这是目前讲得最明白的线性回归的文章了
?Datawhale?
作者:尹曉丹,Datawhale優(yōu)秀學(xué)習(xí)者
寄語:本文對線性回歸算法的原理及模型,學(xué)習(xí)策略、算法求解和sklearn參數(shù)做了詳細的講解。同時,用例子進行Python代碼實踐。
線性回歸是利用數(shù)理統(tǒng)計中的回歸分析,來確定兩種或兩種以上變量間相互依賴的定量關(guān)系的一種統(tǒng)計分析方法,是機器學(xué)習(xí)最基礎(chǔ)的算法之一。
學(xué)習(xí)框架
模型建立
線性回歸原理
進入一家房產(chǎn)網(wǎng),可以看到房價、面積、廳室呈現(xiàn)以下數(shù)據(jù):
將價格和面積、廳室數(shù)量的關(guān)系習(xí)得為:
使得, 這就是一個直觀的線性回歸的樣式。
線性回歸模型
1. 線性回歸的一般形式
有數(shù)據(jù)集,其中,其中表示變量的數(shù)量,表示每個變量的維度。
可以用以下函數(shù)來描述y和x之間的關(guān)系:
如何來確定的值,使得 盡可能接近的值呢?均方誤差是回歸中常用的性能度量,即:
我們可以選擇,試圖讓均方誤差最小化。
2.?極大似然估計(概率角度闡釋)
下面我們用極大似然估計,來解釋為什么要用均方誤差作為性能度量??梢园涯繕?biāo)值和變量寫成如下等式:
表示我們未觀測到的變量的印象,即隨機噪音。我們假定是獨立同分布,服從高斯分布。(根據(jù)中心極限定理)
因此,
我們建立極大似然函數(shù),即描述數(shù)據(jù)遵從當(dāng)前樣本分布的概率分布函數(shù)。由于樣本的數(shù)據(jù)集獨立同分布,因此可以寫成:
選擇 ???? ,使得似然函數(shù)最大化,這就是極大似然估計的思想。為了方便計算,我們計算時通常對對數(shù)似然函數(shù)求最大值:
顯然,最大化即最小化:
這一結(jié)果即均方誤差,因此用這個值作為代價函數(shù)來優(yōu)化模型在統(tǒng)計學(xué)的角度是合理的。學(xué)習(xí)策略
1. 損失函數(shù)(Loss Function)
度量單樣本預(yù)測的錯誤程度,損失函數(shù)值越小,模型就越好。常用的損失函數(shù)包括:0-1損失函數(shù)、平方損失函數(shù)、絕對損失函數(shù)、對數(shù)損失函數(shù)等。
2. 代價函數(shù)(Cost Function)
度量全部樣本集的平均誤差。常用的代價函數(shù)包括均方誤差、均方根誤差、平均絕對誤差等。
3. 目標(biāo)函數(shù)(Object Function)
代價函數(shù)和正則化函數(shù),最終要優(yōu)化的函數(shù)。
4. 思考題
既然代價函數(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)險最小化即為了防止過擬合而提出來的策略,定義模型復(fù)雜度為 ????(????) ,目標(biāo)函數(shù)可表示為:
例如有以下6個房價和面積關(guān)系的數(shù)據(jù)點,可以看到,當(dāng)設(shè)定:
時,可以完美擬合訓(xùn)練集數(shù)據(jù),但是,真實情況下房價和面積不可能是這樣的關(guān)系,出現(xiàn)了過擬合現(xiàn)象。當(dāng)訓(xùn)練集本身存在噪聲時,擬合曲線對未知影響因素的擬合往往不是最好的。
通常,隨著模型復(fù)雜度的增加,訓(xùn)練誤差會減少;但測試誤差會先增加后減小。我們的最終目的時試測試誤差達到最小,這就是我們?yōu)槭裁葱枰x取適合的目標(biāo)函數(shù)的原因。
算法求解
梯度下降法
設(shè)定初始參數(shù),不斷迭代,使得最小化:
對其求導(dǎo)為:
即:
將所有的參數(shù)以向量形式表示,可得:
由于這個方法中,參數(shù)在每一個數(shù)據(jù)點上同時進行了移動,因此稱為批梯度下降法,對應(yīng)的,我們可以每一次讓參數(shù)只針對一個數(shù)據(jù)點進行移動,即:這個算法稱為隨機梯度下降法,隨機梯度下降法的好處是,當(dāng)數(shù)據(jù)點很多時,運行效率更高;
其缺點是,因為每次只針對一個樣本更新參數(shù),未必找到最快路徑達到最優(yōu)值,甚至有時候會出現(xiàn)參數(shù)在最小值附近徘徊而不是立即收斂。但當(dāng)數(shù)據(jù)量很大的時候,隨機梯度下降法經(jīng)常優(yōu)于批梯度下降法。
當(dāng)為凸函數(shù)時,梯度下降法相當(dāng)于讓參數(shù)不斷向的最小值位置移動。
梯度下降法的缺陷:如果函數(shù)為非凸函數(shù),有可能找到的并非全局最優(yōu)值,而是局部最優(yōu)值。
最小二乘法矩陣求解
令:
其中,
由于
且
對于向量來說,有
因此可以把損失函數(shù)寫作
為最小化,對求導(dǎo)可得:
中間兩項互為轉(zhuǎn)置,由于求得的值是個標(biāo)量,矩陣與轉(zhuǎn)置相同,因此可以寫成
令偏導(dǎo)數(shù)等于零,由于最后一項和 ???? 無關(guān),偏導(dǎo)數(shù)為0。因此,
利用矩陣求導(dǎo)性質(zhì),
和
令導(dǎo)數(shù)等于零,
牛頓法
可求得:
重復(fù)迭代,可以讓逼近取到的最小值。當(dāng)我們對損失函數(shù)進行優(yōu)化的時候,實際上是想要取到的最小值,因此迭代公式為:
當(dāng)是向量值的時候,
的偏導(dǎo)數(shù),是的海森矩陣,
問題:請用泰勒展開法推導(dǎo)牛頓法公式。
答:將泰勒公式展開到二階:
對上式求導(dǎo),并令導(dǎo)數(shù)等于0,求得值
可以求得,
牛頓法的收斂速度非???#xff0c;但海森矩陣的計算較為復(fù)雜,尤其當(dāng)參數(shù)的維度很多時,會耗費大量計算成本。我們可以用其他矩陣替代海森矩陣,用擬牛頓法進行估計。
牛頓法比梯度下降法收斂速度更快,紅色的牛頓法的迭代路徑,綠色的是梯度下降法的迭代路徑。
擬牛頓法
常用的擬牛頓法算法包括DFP,BFGS等。擬牛頓法的思路是用一個矩陣替代計算復(fù)雜的海森矩陣,因此要找到符合H性質(zhì)的矩陣。
要求得海森矩陣符合的條件,同樣對泰勒公式求導(dǎo)
即迭代后的值,代入可得:
更一般的,
為第k個迭代值。即找到矩陣,使得它符合上式。
線性回歸的評估指標(biāo)
均方誤差(MSE):
均方根誤差(RMSE):
平均絕對誤差(MAE):
但以上評價指標(biāo)都無法消除量綱不一致而導(dǎo)致的誤差值差別大的問題,最常用的指標(biāo)是,可以避免量綱不一致問題。
我們可以把理解為,回歸模型可以成功解釋的數(shù)據(jù)方差部分在數(shù)據(jù)固有方差中所占的比例,越接近1,表示可解釋力度越大,模型擬合的效果越好。
sklearn參數(shù)詳解
1. it_intercept
默認為True,是否計算該模型的截距。如果使用中心化的數(shù)據(jù),可以考慮設(shè)置為False,不考慮截距。一般還是要考慮截距。
2. normalize
默認為false. 當(dāng)fit_intercept設(shè)置為false的時候,這個參數(shù)會被自動忽略。如果為True,回歸器會標(biāo)準化輸入?yún)?shù):減去平均值,并且除以相應(yīng)的二范數(shù)。當(dāng)然啦,在這里還是建議將標(biāo)準化的工作放在訓(xùn)練模型之前。通過設(shè)置sklearn.preprocessing.StandardScaler來實現(xiàn),而在此處設(shè)置為false。
3. copy_X
默認為True, 否則X會被改寫
4. n_jobs
int 默認為1. 當(dāng)-1時默認使用全部CPUs ??(這個參數(shù)有待嘗試)
5.?可用屬性
**coef_????*訓(xùn)練后的輸入端模型系數(shù),如果label有兩個,即y值有兩列。那么是一個2D的array
6. intercept_: 截距
7. 可用的methods
fit(X,y,sample_weight=None):
X: array, 稀疏矩陣 [n_samples,n_features]
y: array [n_samples, n_targets]
sample_weight: 權(quán)重 array [n_samples] 在版本0.17后添加了sample_weight
get_params(deep=True):返回對regressor 的設(shè)置值
predict(X): 預(yù)測 基于 R^2值
score:評估
練習(xí)題
請用以下數(shù)據(jù)(可自行生成嘗試,或用其他已有數(shù)據(jù)集)
首先嘗試調(diào)用sklearn的線性回歸函數(shù)進行訓(xùn)練;
用最小二乘法的矩陣求解法訓(xùn)練數(shù)據(jù);
用梯度下降法訓(xùn)練數(shù)據(jù);
比較各方法得出的結(jié)果是否一致。
1. sklearn的線性回歸
生成數(shù)據(jù):
2.?最小二乘法
class LR_LS():def __init__(self):self.w = None def fit(self, X, y):# 最小二乘法矩陣求解#============================= show me your code =======================self.w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)#============================= show me your code =======================def predict(self, X):# 用已經(jīng)擬合的參數(shù)值預(yù)測新自變量#============================= show me your code =======================y_pred = X.dot(self.w)#============================= show me your code =======================return y_predif __name__ == "__main__":lr_ls = LR_LS()lr_ls.fit(x,y)print("估計的參數(shù)值:%s" %(lr_ls.w))x_test = np.array([4,5,7]).reshape(1,-1)print('真實值為:',x_test.dot(np.array([4.2,5.7,10.8])))print("預(yù)測值為:?%s"?%(lr_ls.predict(x_test)))3.?梯度下降法
class LR_GD():def __init__(self):self.w = None def fit(self,X,y,alpha=0.002,loss = 1e-10): # 設(shè)定步長為0.002,判斷是否收斂的條件為1e-10y = y.reshape(-1,1) #重塑y值的維度以便矩陣運算[m,d] = np.shape(X) #自變量的維度self.w = np.zeros((d)) #將參數(shù)的初始值定為0tol = 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([4,5,7]).reshape(1,-1)print('真實值為:',x_test.dot(np.array([4.2,5.7,10.8])))print("預(yù)測值為:%s"?%(lr_gd.predict(x_test)))4. 測試
在3維數(shù)據(jù)上測試sklearn線性回歸和最小二乘法的結(jié)果相同,梯度下降法略有誤差;又在100維數(shù)據(jù)上測試了一下最小二乘法的結(jié)果比sklearn線性回歸的結(jié)果更好一些。
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機器學(xué)習(xí)在線手冊深度學(xué)習(xí)在線手冊AI基礎(chǔ)下載(pdf更新到25集)本站qq群1003271085,加入微信群請回復(fù)“加群”獲取一折本站知識星球優(yōu)惠券,復(fù)制鏈接直接打開:https://t.zsxq.com/yFQV7am喜歡文章,點個在看總結(jié)
以上是生活随笔為你收集整理的我感觉这是目前讲得最明白的线性回归的文章了的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【NLP】Doc2vec原理解析及代码实
- 下一篇: Python 2退出历史舞台 一句话证明