(一)認識回歸
回歸是統計學中最有力的工具之中的一個。
機器學習監督學習算法分為分類算法和回歸算法兩種,事實上就是依據類別標簽分布類型為離散型、連續性而定義的。
顧名思義。分類算法用於離散型分布預測,如前面講過的KNN、決策樹、朴素貝葉斯、adaboost、SVM、Logistic回歸都是分類算法。回歸算法用於連續型分布預測。針對的是數值型的樣本,使用回歸。能夠在給定輸入的時候預測出一個數值。這是對分類方法的提升,由於這樣能夠預測連續型數據而不不過離散的類別標簽。
回歸的目的就是建立一個回歸方程用來預測目標值。回歸的求解就是求這個回歸方程的回歸系數。預測的方法當然十分簡單,回歸系數乘以輸入值再所有相加就得到了預測值。
1,回歸的定義
回歸最簡單的定義是,給出一個點集D,用一個函數去擬合這個點集。而且使得點集與擬合函數間的誤差最小,假設這個函數曲線是一條直線,那就被稱為線性回歸,假設曲線是一條二次曲線,就被稱為二次回歸。
2,多元線性回歸
假定預測值與樣本特征間的函數關系是線性的,回歸分析的任務,就在於依據樣本X和Y的觀察值。去預計函數h,尋求變量之間近似的函數關系。定義:

當中,n = 特征數目;
為了方便。記x0= 1。則多變量線性回歸能夠記為:
。(θ、x都表示(n+1,1)維列向量)
Note:注意多元和多次是兩個不同的概念。“多元”指方程有多個參數。“多次”指的是方程中參數的最高次冪。多元線性方程是如果預測值y與樣本全部特征值符合一個多元一次線性方程。
3,廣義線性回歸
用廣義的線性函數:
wj是系數,w就是這個系數組成的向量。它影響着不同維度的Φj(x)在回歸函數中的影響度,Φ(x)是能夠換成不同的函數。這種模型我們覺得是廣義線性模型,Φ(x)=x時就是多元線性回歸模型。
(二)線性回歸的求解
說到回歸,經常指的也就是線性回歸。因此本文闡述的就是多元線性回歸方程的求解。如果有連續型值標簽(標簽值分布為Y)的樣本,有X={x1,x2,...,xn}個特征,回歸就是求解回歸系數θ=θ0,
這里的誤差是指預測y值和真實y值之間的差值,使用該誤差的簡單累加將使得正差值和負差值相互抵消。所以採用平方誤差(最小二乘法)。
平方誤差能夠寫做:

至於為何採用最小誤差平方和來求解,其統計學原理可參考“對線性回歸、邏輯回歸、各種回歸的概念學習”的“深入線性回歸”一節。
在數學上。求解過程就轉化為求一組θ值使求上式取到最小值,那么求解方法有梯度下降法、Normal Equation等等。梯度下降有例如以下特點:須要預先選定步長a、須要多次迭代、特征值須要Scaling(統一到同一個尺度范圍)。因此比較復雜。另一種不須要迭代的求解方式--Normal Equation,簡單、方便、不須要Feature Scaling。Normal Equation方法中須要計算X的轉置與逆矩陣,計算量非常大,因此特征個數多時計算會非常慢,僅僅適用於特征個數小於100000時使用;當特征數量大於100000時使用梯度法。另外,當X不可逆時就有嶺回歸算法的用武之地了。
以下就概括一下經常使用的幾種求解算法。
1。梯度下降法(Gradient Descent)
依據平方誤差。定義該線性回歸模型的損耗函數(Cost Function)為:
,(系數是為了方便求導展示)
線性回歸的損耗函數的值與回歸系數θ的關系是碗狀的。僅僅有一個最小點。線性回歸的求解過程如同Logistic回歸,差別在於學習模型函數hθ(x)不同,梯度法具體求解過程參考“機器學習經典算法具體解釋及Python實現---Logistic回歸(LR)分類器”。
2,Normal Equation(也叫普通最小二乘法)
Normal Equation算法也叫做普通最小二乘法(ordinary least squares),其特點是:給定輸人矩陣X,假設XTX的逆存在並能夠求得的話。就能夠直接採用該方法求解。
其求解理論也十分簡單:既然是是求最小誤差平方和。另其導數為0就可以得出回歸系數。
矩陣X為(m,n+1)矩陣(m表示樣本數、n表示一個樣本的特征數),y為(m。1)列向量。
上述公式中包括XTX, 也就是須要對矩陣求逆,因此這個方程僅僅在逆矩陣存在的時候適用。然而。矩陣的逆可能並不存在,后面“嶺回歸”會討論處理方法。
3。局部加權線性回歸
線性回歸的一個問題是有可能出現欠擬合現象。由於它求的是具有最小均方誤差的無偏預計。顯而易見,假設模型欠擬合將不能取得最好的預測效果。所以有些方法同意在預計中引人一些偏差,從而減少預測的均方誤差。當中的一個方法是局部加權線性回歸(LocallyWeightedLinearRegression, LWLR )。在該算法中,我們給待預測點附近的每一個點賦予一定的權重.於是公式變為:
。W是(m,m)矩陣,m表示樣本數。
LWLR使用 “核”(與支持向量機中的核類似)來對附近的點賦予更高的權重。
核的類型能夠自由選擇,最經常使用的核就是高斯核,高斯核相應的權重例如以下:
,k須要優化選擇.
局部加權線性回歸也存在一個問題,即添加了計算量,由於它對每一個點做預測時都必須使用整個數據集。而不是計算出回歸系數得到回歸方程后代入計算就可以。因此該算法不被推薦。
4,嶺回歸(ridge regression)和縮減方法
當數據的樣本數比特征數還少時候。矩陣XTX的逆不能直接計算。即便當樣本數比特征數多時,XTX 的逆仍有可能無法直接計算。這是由於特征有可能高度相關。這時能夠考慮使用嶺回歸,由於當XTX 的逆不能計算時。它仍保證能求得回歸參數。簡單說來。嶺回歸就是對矩陣XTX進行適當的修正,變為(I是單位矩陣,對角線為1,其它為0)從而使得矩陣非神秘,進而能對式子求逆。在這樣的情況下,回歸系數的計算公式將變成:
為了使用嶺回歸和縮減技術,首先須要對特征做標准化處理,使各特征值的取值尺度范圍同樣,從而保證各特征值的影響力是同樣的。
怎樣設置 λ 的值?通過選取不同的λ 來反復上述測試過程。終於得到一個使預測誤差最小的λ 。可通過交叉驗證獲取最優值--在測試數據上。使誤差平方和最小。
嶺回歸最先用來處理特征數多於樣本數的情況,如今也用於在預計中加人偏差。從而得到更好的預計。其實,上述公式是在最小平方誤差和公式里引入了每一個特征的懲處因子得到,為的是防止過度擬合(過於復雜的模型),在損失函數里添加一個每一個特征的懲處因子。這就是線性回歸的正則化(參考“Coursera公開課筆記: 斯坦福大學機器學習第七課“正則化(Regularization)”)。

Note:θ0是一個常數,x0=1是固定的,那么θ0不須要懲處因子,嶺回歸公式中的I的第一個元素要為0。
這里通過引入λ來限制了全部誤差平方之和,通過引人該懲處項。能夠降低不重要的參數,這個技術在統計學中也叫做縮減(shrinkage )。縮減方法能夠去掉不重要的參數,因此能更好地理解數據。此外,與簡單的線性回歸相比,縮減法能取得更好的預測效果,縮減法還能夠看做是對一個數據模型的擬合採取了偏差(預測值與真實值差距)、方差(不同預測模型間的差距)折中方案,添加偏差的同一時候降低方差。
偏差方差折中是一個重要的概念。能夠幫助我們理解現有模型並做出改進,從而得到更好的模型。嶺回歸是縮減法的一種,相當於對回歸系數的大小施加了限制。
另一種非常好的縮減法是lasso。lasso難以求解,但能夠使用計算簡便的逐步線性回歸方法來求得近似結果。另一些其它縮減方法。如lasso、LAR、PCA回歸以及子集選擇等。與嶺回歸一樣,這些方法不僅能夠提高預測精確率,並且能夠解釋回歸系數。
5,回歸模型性能度量
數據集上計算出的回歸方程並不一定意味着它是最佳的。能夠便用預測值yHat和原始值y的相關性來度量回歸方程的好壞。
相關性取值范圍0~1,值越高說明回歸模型性能越好。
線性回歸是如果值標簽與特征值之間的關系是線性的。但有些時候數據間的關系可能會更加復雜。使用線性的模型就難以擬合,就須要引入多項式曲線回歸(多元多次擬合)或者其它回歸模型。如回歸樹。
(三)線性回歸的Python實現
本線性回歸的學習包中實現了普通最小二乘和嶺回歸算法,因梯度法和Logistic Regression差點兒同樣。也沒有特征數>10000的樣本測試運算速度,所以沒有實現。為了支持多種求解方法、也便於擴展其它解法,linearRegress對象採用Dict來存儲相關參數(求解方法為key,回歸系數和其它相關參數的List為value)。
比如嶺回歸算法在LRDict中的key=‘ridge’,value=[ws, lamba,xmean,var, ymean]。由於嶺回歸模型訓練和預測中須要對樣本進行feature scaling。所以才須要存儲xmean,var, ymean。linearRegress對象的屬性如其__init__函數所看到的:
- class linearRegress(object):
- def __init__(self,LRDict = None, **args):
- '''currently support OLS, ridge, LWLR
- '''
- obj_list = inspect.stack()[1][-2]
- self.__name__ = obj_list[0].split('=')[0].strip()
- if not LRDict:
- self.LRDict = {}
- else:
- self.LRDict = LRDict
- #to Numpy matraix
- if 'OLS' in self.LRDict:
- self.LRDict['OLS'] = mat(self.LRDict['OLS'])
- if 'ridge' in self.LRDict:
- self.LRDict['ridge'][0] = mat(self.LRDict['ridge'][0])
- self.LRDict['ridge'][2] = mat(self.LRDict['ridge'][2])
- self.LRDict['ridge'][3] = mat(self.LRDict['ridge'][3])
- self.LRDict['ridge'][4] = mat(self.LRDict['ridge'][4])
線性回歸模型Python學習包下載地址為:
Machine Learning Linear Regression-線性回歸
(四)應用和模型調優
對於須要依據一些特征的組合來預測一個值(如預測房價、菜價等)且預測值和特征組合間的關系是線性時既能夠採用線性回歸建立預測模型。通過機器學習算法建立起一個模型之后就須要在使用中不斷的調優和修正,對於線性回歸來說。最佳模型就是取得預測偏差和模型方差之間的平衡(高偏差就是欠擬合,高方差就是過擬合)。線性回歸模型中模型調優和修正的方法包含:
- 獲取很多其它的訓練樣本 - 解決高方差
- 嘗試使用更少的特征的集合 - 解決高方差
- 嘗試獲得其它特征 - 解決高偏差
- 嘗試加入多項組合特征 - 解決高偏差
- 嘗試減小
- 嘗試添加
具體的闡述能夠參考“斯坦福大學機器學習第十課“應用機器學習的建議”
參考:
Coursera公開課筆記: 斯坦福大學機器學習第七課“正則化(Regularization)
本文作者Adan,來源於:機器學習經典算法具體解釋及Python實現--線性回歸(Linear Regression)算法。
轉載請注明出處。