吳恩達《機器學習》--- 線性迴歸
吳恩達老師Coursera《Machien Learing》
機器學習的模型表達
線性模型
誤差函式
線性迴歸的過程就是通過對訓練集資料的學習,選擇使得誤差函式最小化的
實現這一過程主要有兩種方法:梯度下降和Normal Equation
梯度下降
梯度下降的思想是選取導數的相反方向更新
,如圖所示:
注意引數更新的時機:
的選取決定了誤差函式收斂的速度,決定了學習的時間。
選擇
嘗試如下方法:
計算中誤差函式的導數是這樣的:
實際應用中可以通過對特徵值進行Feature Scaling和Mean Normalization來加速梯度下降其原理示意圖如下:
其方法是
Normal Equation
這是第二種優化誤差函式的方法,直接令誤差函式對
導數等於0,進而可以求得
表示式:
與梯度下降法相比,Normarl Equation無需選擇
,無需多次迭代,但是計算
為
計算量較大,因而更適於特徵規模較小的情況,通常10000以下可以考慮。
上述討論了線性迴歸的模型、誤差函式、引數訓練方法,訓練方法中還討論了梯度下降法和Normal Equation兩種方法,以及訓練過程中需要注意的問題,想要探究內部機理的同學可以仔細研究。然而使用scikit-learn實現線性迴歸,根本無需考慮這麼多問題,請看下文。
scikit-learn實現
最小二乘法
線性模型,最小化方差,求解時採用梯度下降法。
sklearn線性迴歸非常簡單,如下所示:
>>> from sklearn import linear_model
>>> reg = linear_model.LinearRegression()
>>> reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
>>> reg.coef_
array([ 0.5, 0.5])
Ridge迴歸
線性模型的一種優化,主要是為了降低資料敏感性,通過減小||w||實現,在優化目標上新增2範數 ||w||2。
>>> from sklearn import linear_model
>>> reg = linear_model.Ridge (alpha = .5)
>>> reg.fit ([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
Ridge(alpha=0.5, copy_X=True, fit_intercept=True, max_iter=None,
normalize=False, random_state=None, solver='auto', tol=0.001)
>>> reg.coef_
array([ 0.34545455, 0.34545455])
>>> reg.intercept_
0.13636...
sklearn提供RidgeCV通過交叉驗證的方式選擇最好的
>>> from sklearn import linear_model
>>> reg = linear_model.RidgeCV(alphas=[0.1, 1.0, 10.0])
>>> reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
RidgeCV(alphas=[0.1, 1.0, 10.0], cv=None, fit_intercept=True, scoring=None,
normalize=False)
>>> reg.alpha_
0.1
Lasso迴歸
目的與上述的Ridge迴歸一樣,只是優化目標是方差+|w|,新增的是1範數
>>> from sklearn import linear_model
>>> reg = linear_model.Lasso(alpha = 0.1)
>>> reg.fit([[0, 0], [1, 1]], [0, 1])
Lasso(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=1000,
normalize=False, positive=False, precompute=False, random_state=None,
selection='cyclic', tol=0.0001, warm_start=False)
>>> reg.predict([[1, 1]])
array([ 0.8])
sklearn中有Lasso的多種交叉驗證方法。
Elastic Net
優化目標新增既有1範數又有2範數
歡迎關注微信公眾號“翰墨知道”,獲取最新更新。