线性模型也可以用拟合非线性数据。一个简单的方法就是将每个特征的幂次方添加为一个新特征,然后在这个拓展过的特征集上训练线性模型,这种方法被称为多项式回归。
首先,基于简单的二次方程制造一些非线性数据(添加随机噪声)。
m = 100
X = 6 * np.random.rand(m,1)-3
y = 0.5 * X**2 + X + 2 + np.random.randn(m,1)
plt.plot(X,y,'.')
显然,直线永远不可能拟合这些数据。
接着,使用Scikit-Learn的PolynomialFeatures类来对训练数据进行转换,将每个特征的平方(二次多项式)做为新特征加入训练集(这个例子只有一个特征)。
from sklearn.preprocessing import PolynomialFeatures
poly_features = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly_features.fit_transform(X)
这里X_poly包含原本的特征X和该特征的平方。
现在对这个扩展后的训练集匹配一个LinearRegression模型。
lr = LinearRegression()
lr.fit(X_poly, y)
lr.intercept_, lr.coef_
参数值结果为:(array([1.63169494]), array([[0.96088538, 0.55805853]]))。和原方程很接近,看来拟合得不错。
最后,用图形来表示预测结果。
c= np.linspace(-3,3,100).reshape(-1,1)
c_poly = poly_features.fit_transform(c)
y_predict = lr.predict(c_poly)
plt.plot(c,y_predict)
plt.plot(X,y,'.')