在机器学习中,线性回归是一种常用的预测模型,它假设输入特征和输出之间存在线性关系。然而,现实世界中的数据往往具有非线性关系,这时可以通过引入多项式特征来增强线性回归模型,使其能够拟合更复杂的非线性函数。本文将展示如何利用Python中的scikit-learn库来实现这一过程,并探讨不同多项式度数对模型拟合效果的影响。
首先,定义了一个真实的非线性函数,它是余弦函数的一部分。然后,生成了一些样本点,这些点是从真实函数中加上一些随机噪声得到的。接下来,将使用不同度数的多项式特征来拟合这些样本点,并观察模型的表现。
在模型选择过程中,经常会遇到两个问题:欠拟合和过拟合。欠拟合是指模型过于简单,无法捕捉数据中的复杂关系;而过拟合则是指模型过于复杂,以至于它学习了数据中的噪声而不是潜在的模式。在本例中,可以看到,一个一次多项式(线性函数)无法很好地拟合训练样本,这就是欠拟合的一个例子。而当多项式的度数过高时,模型可能会过拟合训练数据,即学习了数据中的噪声。
为了定量评估模型的过拟合或欠拟合,使用交叉验证的方法来计算模型在验证集上的平均平方误差(MSE)。MSE越高,说明模型从训练数据中泛化出来的能力越差。
以下是实现上述过程的Python代码示例:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
def true_fun(X):
return np.cos(1.5 * np.pi * X)
np.random.seed(0)
n_samples = 30
degrees = [1, 4, 15]
X = np.sort(np.random.rand(n_samples))
y = true_fun(X) + np.random.randn(n_samples) * 0.1
plt.figure(figsize=(14, 5))
for i in range(len(degrees)):
ax = plt.subplot(1, len(degrees), i + 1)
plt.setp(ax, xticks=(), yticks=())
polynomial_features = PolynomialFeatures(degree=degrees[i], include_bias=False)
linear_regression = LinearRegression()
pipeline = Pipeline([
("polynomial_features", polynomial_features),
("linear_regression", linear_regression),
])
pipeline.fit(X[:, np.newaxis], y)
# 使用交叉验证评估模型
scores = cross_val_score(pipeline, X[:, np.newaxis], y, scoring="neg_mean_squared_error", cv=10)
X_test = np.linspace(0, 1, 100)
plt.plot(X_test, pipeline.predict(X_test[:, np.newaxis]), label="模型")
plt.plot(X_test, true_fun(X_test), label="真实函数")
plt.scatter(X, y, edgecolor="b", s=20, label="样本")
plt.xlabel("x")
plt.ylabel("y")
plt.xlim((0, 1))
plt.ylim((-2, 2))
plt.legend(loc="best")
plt.title("度数 {}\nMSE = {:.2e} (+/- {:.2e})".format(degrees[i], -scores.mean(), scores.std()))
plt.show()
在上述代码中,首先定义了一个真实的函数`true_fun`,然后生成了30个样本点,并为每个点添加了一些随机噪声。接着,为每个多项式的度数创建了一个管道,该管道首先使用`PolynomialFeatures`来生成多项式特征,然后使用`LinearRegression`来拟合这些特征。使用`cross_val_score`函数来评估每个模型的性能,并计算了平均平方误差(MSE)。最后,绘制了模型预测的曲线、真实函数的曲线以及样本点,以便直观地比较模型的拟合效果。
通过观察不同度数的多项式模型的MSE,可以发现,当多项式度数为4时,模型几乎完美地拟合了真实函数。然而,当多项式度数增加到15时,模型的MSE显著增加,这表明模型已经开始过拟合训练数据。这个例子清楚地展示了如何通过调整多项式特征的度数来平衡模型的复杂度和泛化能力。