一、scikit-learn 中的多項式回歸
1)實例過程
-
模擬數據
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 + np.random.normal(0, 1, 100)
- 相對於scikit-learn中的多項式回歸,自己使用多項式回歸,就是在使用線性回歸前,改造了樣本的特征;
- sklearn 中,多項式回歸算法(PolynomialFeatures)封裝在了 preprocessing 包中,也就是對數據的預處理;
- 對於多項式回歸來說,主要做的事也是對數據的預處理,為數據添加一些新的特征;
-
使用 PolynomialFeatures 生成新的數據集
from sklearn.preprocessing import PolynomialFeatures poly = PolynomialFeatures(degree=2) poly.fit(X) X2 = poly.transform(X) X2.shape # 輸出:(100, 3) X2[:5, :] # 輸出:
array([[1. , 2.98957009, 8.93752931], [1. , 0.5481444 , 0.30046228], [1. , 2.43260405, 5.91756246], [1. , 1.86837318, 3.49081835], [1. , 2.89120321, 8.35905598]])
- degree=2:表示對原本數據集 X 添加一個最多為 2 次冪的相應的多項式特征;
- poly.transform(X):將原本數據集 X 的每一種特征,轉化為對應的多項式的特征;
- X2:生成的多項式特征相應的數據集;
- 疑問:X 的樣本原有一個特征,經過 PolynomialFeatures 后生成了 3 個特征?
- X2 == [1., x, x2];
- 使用 LinearRegression 類操作新的數據集 X2
from sklearn.linear_model import LinearRegression 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()
二、Pipeline(管道)
1)疑問:如果數據集有 n 個特征,經過 PolynomialFeatures 生成的數據集有多少個?
-
模擬數據集
X = np.arange(1, 11).reshape(-1, 2) X.shape # 輸出:(5, 2) X # 輸出: array([[ 1, 2], [ 3, 4], [ 5, 6], [ 7, 8], [ 9, 10]])
- 當 degree = 2
poly = PolynomialFeatures(degree=2) poly.fit(X) X2 = poly.transform(X) X2.shape # 輸出:(5, 6) X2 # 輸出: array([[ 1., 1., 2., 1., 2., 4.], [ 1., 3., 4., 9., 12., 16.], [ 1., 5., 6., 25., 30., 36.], [ 1., 7., 8., 49., 56., 64.], [ 1., 9., 10., 81., 90., 100.]])
- 當 degree = 3
poly = PolynomialFeatures(degree=3) poly.fit(X) X3 = poly.transform(X) X3.shape # 輸出:(5, 10) X3 # 輸出: array([[ 1., 1., 2., 1., 2., 4., 1., 2., 4., 8.], [ 1., 3., 4., 9., 12., 16., 27., 36., 48., 64.], [ 1., 5., 6., 25., 30., 36., 125., 150., 180., 216.], [ 1., 7., 8., 49., 56., 64., 343., 392., 448., 512.], [ 1., 9., 10., 81., 90., 100., 729., 810., 900., 1000.]])
- 分析:經過 PolynomialFeatures 之后,樣本特征呈指數增長,新增的特征包含了所有可能的所樣式;
2)Pipeline 過程
-
使用多項式回歸的過程
- 將原始數據集 X 講過 PolynomialFeatures 算法,生成多項式的特征的樣本的數據集;
- 數據歸一化(StandardScaler):如果 degree 非常的大,樣本生成的特征的數據的差距也會變動非常的大;
- 將新的數據集傳給線性回歸算法:LinearRegression;
- Pipeline 將這 3 步合為一體,使得每次使用多項式回歸時,不需要重復這 3 個過程;
- 具體操作過程
- 模擬數據
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, 100)
- 使用 Pipeline
from sklearn.pipeline import Pipeline from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures from sklearn.preprocessing import StandardScaler import numpy as np import matplotlib.pyplot as plt # 實例化 Pipeline poly_reg = Pipeline([ ("poly", PolynomialFeatures(degree=2)), ("std_scaler", StandardScaler()), ("lin_reg", LinearRegression()) ]) 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()