1.1.16.多項式迴歸:基函式拓展線性迴歸模型

機器學習中一種常見模式是使用線性模型去訓練非線性模型。這種方式保持了常見線性方法的快速性,同時適用於更廣泛的資料。

例如,一個簡單的線性迴歸可以通過係數拓展到多項式。在標準線性迴歸情況下,你看你有一個類似二維資料的模型:


如果我們要將資料擬合成一個拋物面而不是平面,我們可以將這些特診組合到二項式中,模型如下所示:


(令人驚訝的)觀察到這仍然是一個線性模型:要想到這一點,想象以下建立一個新變數


通過重新的標記資料,我麼可以寫成這樣:


我們可以得到多項式迴歸於我們上面考慮的同一類線性模型可以通過相同的方式解決。通過考慮這些函式構建高維空間內的線性擬合,改模型可以適合更加廣泛的資料。

這裡有一個例子應用於一維資料的一個例子,它使用不用程度的多項式特徵:


這張圖使用的是多項式特徵前處理器建立的。改前處理器將輸入資料矩陣轉換成給定度數的新資料矩陣,使用如下:

from sklearn.preprocessing import PolynomialFeatures
import numpy as np

X = np.arange(6).reshape(3, 2)
#print(X)#[[0 1] [2 3] [4 5]]

poly = PolynomialFeatures(degree=2)

print(poly.fit_transform(X))#->x1,x2->1,x1,x2,x1^2,x2^2,x1x2
'''[[ 1.  0.  1.  0.  0.  1.]
 [ 1.  2.  3.  4.  6.  9.]
 [ 1.  4.  5. 16. 20. 25.]]'''

這裡的x從,這些新的被用到了模型中去

這種預處理可以通過Pipeline工具進行簡化。表示簡單多項式迴歸的單個物件可以如下建立和使用:

from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
import numpy as np
model = Pipeline([('poly', PolynomialFeatures(degree=3)),('linear', LinearRegression(fit_intercept=False))])
x = np.arange(5)
y = 3 - 2 * x + x ** 2 - x ** 3
model = model.fit(x[:, np.newaxis], y)
#print(model.named_steps['linear'].coef_)[ 3. -2.  1. -1.]

用多項式特徵訓練線性模型能夠精準地恢復輸入多項式係數

在某些情況下,沒有必要包含任何單一特徵的更高權力,而只需要所謂的互動特徵,這些特徵可以在最明顯的特徵上相乘。 這些可以通過設定interaction_only = True從PolynomialFeatures獲得。

例如,當處理布林特徵時,對於所有n,x_i ^ n = x_i因此是無用的; 但x_i x_j表示兩個布林值的結合。 這樣,我們可以用線性分類器來解決異或問題:

from sklearn.linear_model import Perceptron

from sklearn.preprocessing import PolynomialFeatures
import numpy as np
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = X[:, 0] ^ X[:, 1]

#print(y)#[0 1 1 0]


X = PolynomialFeatures(interaction_only=True).fit_transform(X).astype(int)
#print(X)
'''[[1 0 0 0]
 [1 0 1 0]
 [1 1 0 0]
 [1 1 1 1]]'''
clf = Perceptron(fit_intercept=False, max_iter=10, tol=None,shuffle=False).fit(X, y)
#print(clf.predict(X))#[0 1 1 0]
#print(clf.score(X,y))1.0