问题引入
import numpy as np
import sklearn.linear_model as lm
import sklearn.pipeline as pl
import sklearn.preprocessing as sp
import matplotlib.pyplot as mp
假设我们有如下数据:
train_x = np.array([1, 3, 4, 6, 9, 12, 18])
train_y = np.array([3, 7, 12, 15, 18, 20, 21])
train_x = train_x.reshape(-1, 1)
train_xx = np.linspace(train_x.min(), train_x.max(), 500).reshape(-1, 1)
我们通过线性拟合模型可以得到一条回归线:
model1 = lm.LinearRegression()
model1.fit(train_x, train_y)
pred_y1 = model1.predict(train_x)
我们发现, 回归直线的拟合程度不是很好.
通过观察, 我们容易直到, 这几个点更像是分布在一条曲线上
多项式回归
我们假设多项式方程为: y = w0 + w1* x + w2 * x^2 + w3 * x^3 + ...
多项式回归的目的在于, 求得一组合适的w0, w1, w2, w3, ...
, 使得多项式曲线能够较好地拟合数据.
为了更方便地解决多项式回归问题, 我们不妨设x1 = x
, x2 = x^2
, x3 = x^3
… 于是乎, 我们把多项式回归问题转化成了线性回归问题.
model2 = pl.make_pipeline(
sp.PolynomialFeatures(3), #最高次数
lm.LinearRegression()
)
model2.fit(train_x, train_y)
pred_y2 = model2.predict(train_x)
我们增大最高次项的次数, 将得到与训练数据拟合程度更高的曲线:
model2 = pl.make_pipeline(
sp.PolynomialFeatures(10),
lm.LinearRegression()
)
model2.fit(train_x, train_y)
pred_y2 = model2.predict(train_x)
我们发现, 得到的回归曲线似乎失去了一般性, 我们称这种现象为"过拟合"