機器學習系列(二十二)——多項式迴歸

多項式迴歸

前面我們學習過線性迴歸,線性迴歸模型需要假設數據背後存在線性關係。

而實際中,有線性關係的數據集比較少,更多的數據之間是非線性關係。進而——多項式迴歸產生。
其實多項式迴歸完全是線性迴歸的思路,只是相當於在原來的數據上增加了二次項、三次項、...等更高次的多項式特徵項,然後用線性迴歸求解。

下面以一個例子來感受一下多項式迴歸,首先生成模擬數據集:

import numpy as np
import matplotlib.pyplot as plt
x = np.random.uniform(-3,3,size=100)
X = x.reshape(-1,1)
y = 0.5 * x**2 +x +2 +np.random.normal(0,1,size=100)
plt.scatter(x,y)
plt.show()

大致符合二次曲線y=0.5x^{2}+x+2,加入了人工的高斯噪聲,圖示如下:

首先用線性迴歸模型求出迴歸方程,並作出迴歸方程:

'''線性迴歸'''
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X,y)
y_predict = lin_reg.predict(X)
plt.scatter(x,y)
plt.plot(x,y_predict,color='r')
plt.show()

迴歸方程圖示:

從圖中可以明顯看出,線性迴歸的效果在該數據集上不夠好,有沒有解決辦法呢?那就是添加一個原特徵的二次方項特徵,然後對這兩個特徵做線性迴歸,這就是最簡單的多項式迴歸,這裏我們已經知道數據符合二次分佈了,實際中的數據可能要用到更高次冪的多項式特徵:

X2 = np.hstack([X,X**2])
lin_reg2 = LinearRegression()
lin_reg2.fit(X2,y)
y_predict2 = lin_reg2.predict(X2)
plt.scatter(x,y)
plt.plot(np.sort(x),y_predict2[np.argsort(x)],color='r')#有序排序後繪製曲線
plt.show()

添加二次項後的迴歸結果:

此時的迴歸結果已經好很多,我們可以查看回歸係數:

和真實數據的係數和截距是吻合的。


scikit-learn中的多項式迴歸和pipeline

添加多項式特徵

現在來看一下sklearn中的多項式迴歸,實際上sklearn並沒有爲多項式迴歸封裝類,只是可以爲它方便生成帶多項式特徵的數據集,然後再用線性迴歸求解:

from sklearn.preprocessing import PolynomialFeatures
'''添加最多degree次冪特徵'''
poly = PolynomialFeatures(degree=2)
poly.fit(X)
X2 = poly.transform(X)
X2.shape //out:(100,3)
X2[:5,:]

可以看到sklearn添加多項式特徵後,自動爲我們補了一列1,這相當於x的0次冪,這樣求得的係數裏會有0。

from sklearn.linear_model import LinearRegression
lin_reg2 = LinearRegression()
lin_reg2.fit(X2,y)
lin_reg2.coef_

求解結果:

求解結果和我們添加二次特徵後求解結果一樣。

sklearn中的pipeline

從上面看來好像每次使用多項式迴歸都需要先加入多項式特徵,然後實際中往往還要對數據進行歸一化,最後再使用線性迴歸求解,這樣繁瑣的過程很容易讓人蒙圈。爲此:sklearn爲我們提供了一個叫pipeline的類,這個類可以很方便地將多個步驟封裝到一塊,按照pipeline裏我們定義的順序執行:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
'''傳入步驟對應的類'''
poly_reg = Pipeline([
    ("poly",PolynomialFeatures(degree=2)),
    ("std_scaler",StandardScaler()),
    ("lin_reg",LinearRegression())
])

上面我們就定義了一個pipeline,裏面就是多項式迴歸的三個步驟:添加特徵,歸一化,線性迴歸求解。下面求解此模型

'''沿着pipeline順序執行'''
x = np.random.uniform(-3,3,size=100)
X = x.reshape(-1,1)
y = 0.5 * x**2 +x +2 +np.random.normal(0,1,size=100)

poly_reg.fit(X,y)
y_predict = poly_reg.predict(X)
plt.scatter(x,y)
plt.plot(np.sort(x),y_predict[np.argsort(x)],color='r')#有序排序之後繪製曲線
plt.show()

求解結果圖示:

可以看到定義好pipeline之後,看起來好像一個步驟就能求解了。


本篇主要是多項式迴歸的介紹,和PCA相比,PCA要實現數據降維,而多項式迴歸則是要對數據升維,這是機器學習中很重要的數據處理思想。具體是升維還是降維要針對不同數據集。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章