背景
上次的 ITA 項目開始接觸機器學習相關的知識,從本文開始,我将學習并介紹機器學習最常用的幾種算法,并使用 scikit-learn 相關模型完成相關算法的 demo。
線性回歸
線性回歸,是利用數理統計中回歸分析,來确定兩種或兩種以上變量間互相依賴的定量關系的一種統計分析方法。我們通過拟合最佳直線來建立自變量和因變量的關系,這條最佳直線叫做回歸線,并且用
Y= a*x + b
這條線性等式來表示。
了解線性回歸可以想象一下一般人身高與體重之間的關系,在不能準确測試體重的情況下,按照身高進行排序,也能大體得出體重的大小。這是現實生活中使用線性回歸的例子。
在這個例子中,Y 是體重(因變量),x 是身高(自變量),a 和 b 分别為斜率和截距,可以通過最小二乘法獲得。
身高體重
準備資料
自己僞造了一些資料
import matplotlib.pyplot as plt
def runplt():
plt.figure()
plt.title(u'Height-Weight')
plt.xlabel(u'Height')
plt.ylabel(u'Weight')
plt.axis([150, 190, 40, 90])
plt.grid(True)
return plt
plt = runplt()
x = [[155], [157], [166], [177], [187]]
y = [[55], [60], [63], [70], [79]]
plt.plot(x, y, 'k.')
plt.show()
複制
建立并拟合模型
from sklearn.linear_model import LinearRegression
import numpy as np
# 建立并拟合模型
model = LinearRegression()
model.fit(x, y)
print('預測身高180同學的體重:$%.2f' % model.predict(np.array([180]).reshape(-1, 1))[0])
複制
上述代碼中 sklearn.linear_model.LinearRegression 類是一個估計器(estimator)。估計器依據觀測值來預測結果。在 scikit-learn 裡面,所有的估計器都帶有:
- fit()
- predict()
fit() 用來分析模型參數,predict() 是通過 fit()算出的模型參數構成的模型,對解釋變量進行預測獲得的值。
因為所有的估計器都有這兩種方法,所有 scikit-learn 很容易實作不同的模型。
線性回歸分類
線性回歸的兩種主要類型是一進制線性回歸和多元線性回歸。一進制線性回歸的特點是隻有一個自變量。多元線性回歸則存在多個自變量。找最佳拟合直線的時候,你可以拟合到多項或者曲線回歸。這些就被叫做多項或曲線回歸。
一進制線性回歸
一進制線性回歸模型是
Y= a*x + b
,求解一進制線性回歸模型的本質就是求解參數 a 和 b 的過程,最常用的方法為最小二乘法。
殘差預測值
模型的殘差是訓練樣本點與線性回歸模型的縱向距離
# 殘差預測值
y2 = model.predict(x)
plt.plot(x, y, 'k.')
plt.plot(x, y2, 'g-')
for idx, x in enumerate(x):
plt.plot([x, x], [y[idx], y2[idx]], 'r-')
plt.show()
複制
如圖所示:
我們可以通過殘差之和最小化實作最佳拟合,也就是說模型預測的值與訓練集的資料最接近就是最佳拟合。對模型的拟合度進行評估的函數稱為殘差平方和(residual sum of squares)成本函數。就是讓所有訓練資料與模型的殘差的平方之和最小化,如下所示:
其中, yi 是觀測值, f(xi)f(xi) 是預測值。
import numpy as np
print('殘差平方和: %.2f' % np.mean((model.predict(x) - y) ** 2))
複制
殘差平方和: 2.05
模型評估
使用線性回歸得出模型後,我們可以用 R 方(r-squared)評估模型的效果。R方也叫确定系數(coefficient of determination),表示模型對現實資料拟合的程度。
一進制線性回歸中R方等于皮爾遜積矩相關系數(Pearson product moment correlation coefficient或Pearson’s r)的平方。這種方法計算的R方一定介于0~1之間的正數。其他計算方法,包括scikit-learn中的方法,不是用皮爾遜積矩相關系數的平方計算的,是以當模型拟合效果很差的時候R方會是負值。
LinearRegression的score方法可以計算R方
## 測試集
x_test = [[156], [163], [166], [170], [188]]
y_test = [[56], [63], [63], [72], [80]]
print('R方: ', model.score(x_test, y_test))
複制
R 方: 0.898422638707
R 方是 0.898 說明測試集裡面大多數的資料都可以通過模型解釋
多元回歸
多元回歸即存在多個自變量,比如影響體重的因素不僅僅有身高,還有胸圍,假設 x 中的第一個參數為身高,第二個參數為胸圍。
from sklearn.linear_model import LinearRegression
## 僞造資料
x = [[155, 80], [157, 82], [166, 85], [177, 90], [187, 97]]
y = [[55], [60], [63], [70], [79]]
model = LinearRegression()
model.fit(x, y)
## 僞造測試集
x_test = [[156, 80], [163, 83], [166, 84], [170, 87], [188, 99]]
y_test = [[56], [63], [63], [72], [80]]
predictions = model.predict(x_test)
for i, prediction in enumerate(predictions):
print('Predicted: %.2f, Target: %s' % (prediction, y_test[i]))
print('R-squared: %.2f' % model.score(x_test, y_test))
複制
Predicted: 56.05, Target: [56]
Predicted: 60.03, Target: [63]
Predicted: 61.30, Target: [63]
Predicted: 65.56, Target: [72]
Predicted: 82.42, Target: [80]
R-squared: 0.83
多項式回歸
上面兩個例中,都假設自變量和響應變量的關系是線性的。真實情況未必如此,現實世界中的曲線關系都是通過增加多項式實作的,其實作方式和多元線性回歸類似。在 scikit-learn 中,我們使用 PolynomialFeatures 建構多項式回歸模型。下面比較多項式回歸和線性回歸的差別。
from sklearn.preprocessing import PolynomialFeatures
# 建立線性回歸,并用訓練的模型繪圖
model = LinearRegression()
model.fit(x, y)
xx = np.linspace(150, 190, 100)
yy = model.predict(xx.reshape(xx.shape[0], 1))
plt = runplt()
plt.plot(x, y, 'k.')
plt.plot(xx, yy)
# degree=3表示多項式最高項為3
polynomial_featurizer = PolynomialFeatures(degree=3)
x_train_polynomial = polynomial_featurizer.fit_transform(x)
x_test_polynomial = polynomial_featurizer.transform(x_test)
model_polynomial = LinearRegression()
model_polynomial.fit(x_train_polynomial, y)
xx_polynomial = polynomial_featurizer.transform(xx.reshape(xx.shape[0], 1))
plt.plot(xx, model_polynomial.predict(xx_polynomial), 'r-')
plt.show()
# 輸出結果
print(x)
print(x_train_polynomial)
print(x_test)
print(x_test_polynomial)
print('1 r-squared', model.score(x_test, y_test))
print('2 r-squared', model_polynomial.score(x_test_polynomial, y_test))
複制
拟合過度
我們不斷改變 polynomial_featurizer = PolynomialFeatures(degree=3) 中 degree 的參數,當 degree = 5 的時候曲線經過所有的點,這種情況就成為拟合過度(over-fitting)。當模型出現拟合過度的時候,并沒有從輸入和輸出中推導出一般的規律,而是記憶訓練集的結果,這樣在測試集的測試效果就不好了。
代碼位址