創建多項式回歸器

創建多項式迴歸器

線性迴歸模型有一個主要的侷限性,那就是它只能把輸入數據擬合成直線,而多項式迴歸模型通過擬合多項式方程來克服這類問題,從而提高模型的準確性。

先看這幅圖

創建多項式迴歸器

從圖中可以看出,數據點本身的模式中帶有自然的曲線,而線性模型是不能捕捉到這一點的。再來看看多項式模型的效果。

創建多項式迴歸器

上圖中虛線表示線性迴歸模型,實線表示多項式迴歸模型。這個模型的曲率是由多項式的次數決定的。隨著模型曲率的增加,模型變得更準確。但是,增加曲率的同時也增加了模型的複雜性,因此擬合速度會變慢。這時就需要從模型的準確性和計算能力限制兩方面綜合考慮了。

接下來,我們來建立多項式迴歸器,

(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]

現在,預測值與實際的輸出值非常接近了。


分享到:


相關文章: