机器学习中的线性回归要求因变量和自变量之间的关系是线性的。如果数据的分布更复杂,如下图所示,该怎么办?线性模型可以用于拟合非线性数据吗?我们如何生成最佳捕获数据的曲线呢?我们将在这篇文章中回答这些问题。
目录为什么使用多项式回归
过度拟合与欠拟合
偏差与差异权衡取舍
将多项式回归应用于波士顿住房数据集。
为什么使用多项式回归?
为了理解多项式回归的必要性,让我们先生成一些随机机器学习数据集。
import numpy as npimport matplotlib.pyplot as pltnp.random.seed(0)x = 2 - 3 * np.random.normal(0, 1, 20)y = x - 2 * (x ** 2) + 0.5 * (x ** 3) + np.random.normal(-3, 3, 20)plt.scatter(x,y, s=10)plt.show()
生成的数据看起来像
让我们将机器学习中的线性回归模型应用于此数据集。Python代码如下:
import numpy as npimport matplotlib.pyplot as pltfrom sklearn.linear_model import LinearRegressionnp.random.seed(0)x = 2 - 3 * np.random.normal(0, 1, 20)y = x - 2 * (x ** 2) + 0.5 * (x ** 3) + np.random.normal(-3, 3, 20)# transforming the data to include another axisx = x[:, np.newaxis]y = y[:, np.newaxis]model = LinearRegression()model.fit(x, y)y_pred = model.predict(x)plt.scatter(x, y, s=10)plt.plot(x, y_pred, color='r')plt.show()
最佳拟合线的图是
我们可以看到直线无法捕获数据中的模式。这是一个不拟合的例子。计算线RMSE和R²得分给出:RMSE of linear regression is 15.908242501429998.
R2 score of linear regression is 0.6386750054827146
为了克服不拟合,我们需要增加模型的复杂性。
为了生成一个高阶方程,我们可以添加原始特征的幂作为新特征。线性模型,
可以转化为
这仍然被认为是线性模型,因为与特征相关的系数/权重仍然是线性的。x²只是一个特征。然而我们拟合的曲线本质上是二次曲线。
为了将原始特征转换成更高阶的项,我们将使用scikit-learn提供的多项式特征类。接下来,我们使用线性回归对机器学习模型进行训练。Python代码如下:
import operatorimpo