線性回歸 Linear Regression


  成本函數(cost function)也叫損失函數(loss function),用來定義模型與觀測值的誤差。模型預測的價格與訓練集數據的差異稱為殘差(residuals)或訓練誤差(test errors)。

  我們可以通過殘差之和最小化實現最佳擬合,也就是說模型預測的值與訓練集的數據最接近就是最佳擬合。對模型的擬合度進行評估的函數稱為殘差平方和(residual sum of squares)成本函數。就是讓所有訓練數據與模型的殘差的平方之和最小。

  

  我們用R方(r-squared)評估預測的效果。R方也叫確定系數(coefficient of determination),表示模型對現實數據擬合的程度。計算R方的方法有幾種。一元線性回歸中R方等於皮爾遜積矩相關系數(Pearson product moment correlation coefficient 或Pearson's r)的平方。這種方法計算的R方一定介於0~1之間的正數。其他計算方法,包括scikit-learn中的方法,不是用皮爾遜積矩相關系數的平方計算的,因此當模型擬合效果很差的時候R方會是負值。

SStot是方差平方和  SSres是殘差的平方和 

一元線性回歸

X_test = [[8], [9], [11], [16], [12]]
y_test = [[11], [8.5], [15], [18], [11]]
model = LinearRegression()
model.fit(X, y)
model.score(X_test, y_test)

 score方法計算R方

多元線性回歸

 最小二乘的代碼

from numpy.linalg import lstsq
print(lstsq(X, y)[0])

多項式回歸

一種特殊的多元線性回歸方法,增加了指數項(x 的次數大於1)。現實世界中的曲線關系都是通過增加多項式實現的,其實現方式和多元線性回歸類似。

 \(f(x)=\alpha x^2+\beta_1 x+\beta_2\)

多項式 函數PolynomialFeatures

import numpy as np
from sklearn.linear_model import  LinearRegression
from sklearn.preprocessing import PolynomialFeatures

X_train = [[6], [8], [10], [14], [18]]
y_train = [[7], [9], [13], [17.5], [18]]
X_test = [[6], [8], [11], [16]]
y_test = [[8], [12], [15], [18]]
regressor = LinearRegression()
regressor.fit(X_train, y_train)
xx = np.linspace(0, 26, 100)
yy = regressor.predict(xx.reshape(xx.shape[0], 1))
plt = LRplt.runplt()
plt.plot(X_train, y_train, 'k.')
plt.plot(xx, yy)
quadratic_featurizer = PolynomialFeatures(degree=2)
X_train_quadratic = quadratic_featurizer.fit_transform(X_train)
X_test_quadratic = quadratic_featurizer.transform(X_test)
regressor_quadratic = LinearRegression()
regressor_quadratic.fit(X_train_quadratic, y_train)
xx_quadratic = quadratic_featurizer.transform(xx.reshape(xx.shape[0], 1))
plt.plot(xx, regressor_quadratic.predict(xx_quadratic), 'r-')
plt.show()
print(X_train)
print(X_train_quadratic)
print(X_test)
print(X_test_quadratic)
print '一元線性回歸 r-squared', regressor.score(X_test, y_test)
print '二次回歸 r-squared', regressor_quadratic.score(X_test_quadratic, y_test)

 

多項式比一次的R值更高,效果好一些。

正則化

正則化(Regularization)是用來防止擬合過度的方法。正則化就是用最簡單的模型解釋數據。(奧卡姆剃刀原理(Occam's razor))

嶺回歸(Ridge Regression)嶺回歸增加L2范數項(相關系數向量平方和的平方根)來調整成本函數(殘差平方和)

\(R = \sum_{i=1}^{n} ( y_i - x_i^T \beta)^2 +\lambda \sum_{j=1}^{p}\beta_j^2\)

(L0、L1與L2范數參考 )

最小收縮和選擇算子(Least absolute shrinkage and selection operator,LASSO),增加L1范數項(相關系數向量平方和的平方根)來調整成本函數(殘差平方和)

\(R=\sum_{i=1}^{n}( y_i - x_i^T \beta)^2 +\lambda\sum_{j=1}^{p}\beta_j\)

LASSO方法會產生稀疏參數,大多數相關系數會變成0,模型只會保留一小部分特征。而嶺回歸還是會保留大多數盡可能小的相關系數。當兩個變量相關時,LASSO方法會讓其中一個變量的相關系數會變成0,而嶺回歸是將兩個系數同時縮小。
scikit-learn還提供了彈性網(elastic net)正則化方法,通過線性組合L1和L2兼具LASSO和嶺回歸的內容。可以認為這兩種方法是彈性網正則化的特例。

 梯度下降

梯度下降算法是用來評估函數的局部最小值,

可以用梯度下降法來找出成本函數最小的模型參數值。梯度下降法會在每一步走完后,計算對應位置的導數,然后沿着梯度(變化最快的方向)相反的方向前進。總是垂直於等高線。

但是殘差平方和的成本函數是個凸函數,梯度下降可以找到全局最小值,而對於部分存在波峰波谷的函數,只能找到局部的。

梯度下降的重要參數(Learning rate)步長小,迭代就小,步長長迭代就大,根據NG的ML公開課推薦的是按照三倍 來縮放步長0.01,0.03,0.1,0.3。

如果按照每次迭代后用於更新模型參數的訓練樣本數量划分,有兩種梯度下降法。批量梯度下降(Batch gradient descent)每次迭代都用所有訓練樣本。隨機梯度下降(Stochastic gradient descent,SGD)每次迭代都用一個訓練樣本,這個訓練樣本是隨機選擇的。當訓練樣本較多的時候,隨機梯度下降法比批量梯度下降法更快找到最優參數。批量梯度下降法一個訓練集只能產生一個結果。而SGD每次運行都會產生不同的結果。SGD也可能找不到最小值,因為升級權重的時候只用一個訓練樣本。它的近似值通常足夠接近最小值,尤其是處理殘差平方和這類凸函數的時候。

import numpy as np
from sklearn.datasets import load_boston
from sklearn.linear_model import SGDRegressor
from sklearn.cross_validation import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.cross_validation import train_test_split
data = load_boston()
#分割測試集和訓練集
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target)
#歸一化
X_scaler = StandardScaler()
y_scaler = StandardScaler()

X_train = X_scaler.fit_transform(X_train)
y_train = y_scaler.fit_transform(y_train)
X_test = X_scaler.transform(X_test)
y_test = y_scaler.transform(y_test)

regressor = SGDRegressor(loss='squared_loss')
#交叉驗證
scores = cross_val_score(regressor, X_train, y_train, cv=5)
print '交叉驗證R方值:', scores
print '交叉驗證R方均值:', np.mean(scores)
regressor.fit_transform(X_train, y_train)
print '測試集R方值:', regressor.score(X_test, y_test)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM