線性迴歸模型有一個主要的侷限性,那就是它只能把輸入數據擬合成直線,而多項式迴歸模型通過擬合多項式方程來克服這類問題,從而提高模型的準確性。
先看這幅圖
從圖中可以看出,數據點本身的模式中帶有自然的曲線,而線性模型是不能捕捉到這一點的。再來看看多項式模型的效果。
上圖中虛線表示線性迴歸模型,實線表示多項式迴歸模型。這個模型的曲率是由多項式的次數決定的。隨著模型曲率的增加,模型變得更準確。但是,增加曲率的同時也增加了模型的複雜性,因此擬合速度會變慢。這時就需要從模型的準確性和計算能力限制兩方面綜合考慮了。
接下來,我們來建立多項式迴歸器,
(1)加載、導入數據。這個步驟和之前的代碼一樣,因此不再贅述。
import sys
import numpy as np
filename = 'data_singlevar.txt'
x = []
y = []
with open(filename, 'r') as f:
for line in f.readlines():
data = [float(i) for i in line.split(',')]
xt, yt = data[:-1], data[-1]
x.append(xt)
y.append(yt)
(2)把數據集分成訓練數據集和測試數據集。
num_training = int(0.8 * len(x))
num_test = len(x) - num_training
# 訓練數據
x_train = np.array(x[:num_training])
y_train = np.array(y[:num_training])
# 測試數據
x_test = np.array(x[num_training:])
y_test = np.array(y[num_training:])
(3)建立多項式迴歸器。
#創建多項式迴歸器
from sklearn.preprocessing import PolynomialFeatures
polynomial = PolynomialFeatures(degree = 3)
這裡將曲線的多項式次數的初始值設置為3,接下來用數據點來計算多項式的參數:
x_train_transformed = polynomial.fit_transform(x_train)
其中,x_train_transformed表示多項式形式的輸入,與線性迴歸模型是一樣的。
(4)接下來用數據點來檢查多項式模型是否能夠準確預測。
#數據預測
datapoint = [0.39,2.78,7.11]
poly_datapoint = polynomial.fit_transform(datapoint)
poly_linear_model = linear_model.LinearRegression()
poly_linear_model.fit(x_train_transformed, y_train)
print ("\nPolynomial regression:\n", poly_linear_model.predict(poly_datapoint))
輸出結果如下:
Polynomial regression:
[-10.94807821]
我們再創建一個線性迴歸器,做一下線性迴歸的預測。
#線性迴歸預測
linear_regressor = linear_model.LinearRegression()
linear_regressor.fit(x_train,y_train)
print ("\nLinear regression:\n",linear_regressor.predict(datapoint))
輸出結果如下:
Linear regression:
[-11.0587295]
可以發現,多項式的迴歸模型的預測值更接近實際的輸出值。如果想要數據更接近實際輸出值,就需要增加多項式的次數。
(5)將多項式的次數加到10看看結果。
polynomial = PolynomialFeatures(degree = 10)
x_train_transformed = polynomial.fit_transform(x_train)
datapoint = [0.39,2.78,7.11]
poly_datapoint = polynomial.fit_transform(datapoint)
poly_linear_model = linear_model.LinearRegression()
poly_linear_model.fit(x_train_transformed, y_train)
print ("\nPolynomial regression:\n", poly_linear_model.predict(poly_datapoint))
輸出結果如下:
Polynomial regression:
[-8.15008229]
現在,預測值與實際的輸出值非常接近了。
閱讀更多 數據分析和挖掘 的文章