前面幾天闡述了線性回歸的最小二乘法(OLS)在做回歸時,一致地看待每一個樣本點,是典型的無偏估計,會得到一個使得殘差最小的權(quán)重參數(shù)。然而,在面對一堆數(shù)據(jù)集存在多重共線性時,OLS 就變得對樣本點的誤差極為敏感,最終回歸后的權(quán)重參數(shù)方差變大。這就是需要解決的共線性回歸問題,一般思想是放棄無偏估計,損失一定精度,對數(shù)據(jù)做有偏估計,這里介紹兩種常用的算法:脊回歸和套索回歸。 00 基本概念 多重共線性(Multicollinearity)是指線性回歸模型中的自變量之間由于存在高度相關(guān)關(guān)系而使模型的權(quán)重參數(shù)估計失真或難以估計準確的一種特性,多重是指一個自變量可能與多個其他自變量之間存在相關(guān)關(guān)系。 例如一件商品的銷售數(shù)量可能與當?shù)氐娜司杖牒彤數(shù)厝丝跀?shù)這兩個其他因素存在相關(guān)關(guān)系。 在研究社會、經(jīng)濟問題時,因為問題本身的復雜性,設計的因素很多。在建立回歸模型時,往往由于研究者認識水平的局限性,很難在眾多因素中找到一組互不相關(guān),又對因變量 y 產(chǎn)生主要影響的變量,不可避免地出現(xiàn)所選自變量出現(xiàn)多重相關(guān)關(guān)系的情形。 在前面的介紹中,我們已經(jīng)知道普通最小二乘法(OLS)在進行線性回歸時的一個重要假設就是數(shù)據(jù)集中的特征之間不能存在嚴重的共線性。最迫切的是,我們在拿到一堆數(shù)據(jù)集時,該如何診斷這些特征間是不是存在共線性問題呢? 01 如何診斷多重共線性 根據(jù)已有的參考文獻,常用的多重共線性的診斷方法包括:方差膨脹因子法,特征根分析法,相關(guān)系數(shù)法等,基于這些方法的啟發(fā),本文初步地闡述個人的一些方法,不一定準確,僅代表個人的理解。 我們可以繪制每個特征與 y 間的關(guān)系圖,然后肉眼對比每個特征對 y 的影響情況,關(guān)系走勢圖相近的那些特征就是可能存在共線性的。 例如,下面所示的一個例子是房子的價值與兩個影響它的特征:特征1和特征2,方便起見我們選取了10個樣本點來進行兩個特征間的相關(guān)性分析,在 Jupyter notebook中做了測試,代碼如下: #導入兩個常用模塊 import numpy as np import matplotlib.pyplot as plt #2個特征的樣本X X=np.array([[20.5,19.8],[21.2,20.4],[22.8,21.1], [18.2,23.6],[20.3,24.9],[21.8,26.7], [25.2,28.9],[30.7,31.3],[36.1,35.8], [44.3,38.2]]) #標簽值 y y=np.array([7.8,8.6,8.7,7.9,8.4,8.9,10.4,11.6,13.9,15.8]) #繪制特征1和y的散點圖 plt.scatter(X[:,0],y) plt.show() #繪制特征2和y的散點圖 plt.scatter(X[:,1],y) plt.show() 從散點圖中可以看出,這兩個特征和y的關(guān)系趨勢很相似,進一步放到一起繪制折線圖: plt.plot(X,y,marker='o') plt.show() 可以看到這兩個特征與y的關(guān)系呈現(xiàn)出相同的曲線走勢,我們初步這兩個特征可能具有相關(guān)性,這僅僅是在一個觀察層面。 怎么進行量化分析呢? 在之前,機器學習儲備(1):相關(guān)系數(shù),這篇推送中,介紹了用來判斷兩個特征間的相關(guān)程度的公式,我們考慮具有一般性的公式,通常兩個變量間的相關(guān)系數(shù)的定義如下: 將上述公式,實現(xiàn)為代碼,如下所示: #特征1和特征2的協(xié)方差 cov = np.cov(X[:,0],X[:,1]) cov array([[ 70.44544444, 49.15144444], [ 49.15144444, 41.24455556]]) #特征1的標準差 sigmaX1 = cov[0,0]**0.5 #特征2的標準差 sigmaX2 = cov[1,1]**0.5 #相關(guān)系數(shù) r = cov[0,1]/(sigmaX1*sigmaX2) r 0.9118565340789303 相關(guān)系數(shù)為0.911,說明特征1與特征2之間有高度的線性正相關(guān)關(guān)系。當相關(guān)系數(shù)為0時,表明沒有關(guān)系,為負數(shù)時,表明特征1與特征2之間有負相關(guān)關(guān)系,即有一個這樣的你增我減,你減我增的趨勢。 如果忽略這個問題,還是要采取普通最小二乘法來進行回歸,可能導致的問題簡單來說是造成權(quán)重參數(shù)估計值的方差變大,在上一篇推文(機器學習之線性回歸:OLS 無偏估計及相關(guān)性python分析)中,分析得不夠透徹,沒有深刻地認清多重共線性造成的后果:參數(shù)方差變大這個問題。比如,樣本的特征如下: A =np.array([[0.9999,2],[2,4],[4,8]]),y = np.array([1,2,3]),可以看到此時是強線性相關(guān)的,直接用直接求權(quán)重公式la.inv((A.T.dot(A))).dot(A.T).dot(y),得出參數(shù): array([-1999.9998031, 1000.3999014]), 再降低一些線性相關(guān)強度: A =np.array([[0.9900,2],[2,4],[4,8]]),得出參數(shù): array([-20. , 10.4]) 再降低,A =np.array([[0.900,2],[2,4],[4,8]]),得出參數(shù): array([-2. , 1.4]) 再降低A =np.array([[0.8,2],[2,4],[4,8]]),得出參數(shù): array([-1. , 0.9]) 再降低A =np.array([[0.5,2],[2,4],[4,8]]),得出參數(shù): array([-0.4, 0.6]) 畫出以第一個權(quán)重參數(shù)隨著線性相關(guān)性的增加的趨勢圖:可以看到在0.9999時驟降,表明方差突然變大,變化幅度為2000左右。 拿掉0.9999這個特征取值后,變化幅度為20。 因此驗證了多重共線性越強,造成的后果:參數(shù)方差越大。 接下來,嘗試改進普通最小二乘法來解決共線性問題。 02 添加正則化項解決共線性 正則化在機器學習中扮演者重要的角色,一方面它有可能解決經(jīng)常出現(xiàn)的過擬合問題,另一方面能解決上文提到這種病態(tài)矩陣,也就是不適定問題。對于正則化的理解,將會是以后機器學習需要反復仔細體會的一項重要技術(shù)。 在普通最小二乘法的基礎上,將代價函數(shù)加一個正則化項,就可以解決共線性問題,這個方法犧牲了權(quán)重參數(shù)的精度,帶來的收益是解決了共線性帶來的不穩(wěn)定。如果添加一個L1正則項,算法稱為套索回歸,如果添加一個L2正則化項,稱為脊回歸,公式分別表示為: 套索回歸 脊回歸 下面在Jupyter Notebook,直接調(diào)用sklearn庫中的回歸分析的API,分析上面的共線性數(shù)據(jù)在使用普通最小二乘,L1最小二乘(套索),L2最小二乘(脊回歸)下回歸樣本后,對新來的數(shù)據(jù)的預測精度。 我們用上節(jié)例子來闡述正則化項的作用,用的測試樣本如下所示: X =np.array([[0.9999,2],[2,4],[4,8]]) y = np.array([1,2,3]) 直接調(diào)用sklearn的接口: from sklearn import linear_model #OLS reg = linear_model.LinearRegression() reg.fit(X,y) 得到的權(quán)重參數(shù): array([ 5000.00000002, -2499.75000001]) #脊回歸 ridreg = linear_model.Ridge (alpha = .5) ridreg.fit (X, y) 得到的權(quán)重參數(shù): array([ 0.12589929, 0.25173425]) #套索回歸 ridreg = linear_model.Lasso(alpha = 0.1) ridreg.fit (X, y) 得到的權(quán)重參數(shù): array([ 0. , 0.30535714]) 可以看到脊回歸和套索回歸由于正則化項不同,最終導致的權(quán)重參數(shù)也一樣,最令人印象深刻的是,套索回歸由于使用了L1正則化,直接將特征1的權(quán)重參數(shù)置為0,也就是將強線性相關(guān)項中的某一個直接拋棄掉,只取其中一個特征項作為主特征項進行分析計算。 OLS算法得出的權(quán)重參數(shù)在上節(jié)已經(jīng)驗證過,稍微改變一下線性相關(guān)的強度,導致的權(quán)重參數(shù)改變巨大,也就是參數(shù)的方差很大,這說明它的不穩(wěn)定性。 03 總結(jié) 在上節(jié)中,我們闡述了如何診斷多重共線性問題,以及通過添加正則化項為什么可以解決這個問題,在本文的論證中我們舉的例子是兩個特征間的共線性,這種方法簡單直觀地進一步驗證了OLS權(quán)重參數(shù)的方差和共線性的關(guān)系,以及脊回歸和套索回歸加上正則化項后發(fā)揮的作用。 在本文論述中有些術(shù)語可能不夠精確,還請各位多包涵。謝謝各位的閱讀。 讓我們看一下遠邊的大海,和巍峨的高山,放松一下吧! --------------------- 作者:算法channel 來源:CSDN 原文:https://blog.csdn.net/xo3ylAF9kGs/article/details/78623269 版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接! |
|