多项式回归入门案例 —— 构造一元二次方程拟合模型

简介

关于多项式回归

多项式回归升维是一种在数据处理和建模中的技术,通过将原始的输入特征进行多项式组合来创建新的特征,从而增加特征的维度,以解决模型的欠拟合问题。

例如,如果原始特征是 x ,可以创建新的特征如 \(x^2\)\(x^3\) 等。这样就将一维的特征空间扩展到了更高维。

升维的主要目的是为了能够捕捉数据中更复杂的非线性关系。通过引入高次项,可以使模型更好地拟合非线性的数据模式。

例如,对于一个简单的抛物线关系 \(y = a*x^2 + b*x + c\) ,如果只使用原始的 x 作为特征进行线性回归,可能无法很好地拟合数据。但通过升维创建 \(x^2\) 特征,就能够用多项式回归模型准确地捕捉这种抛物线关系。

然而,过度的升维可能会导致过拟合,即模型在训练数据上表现很好,但在新数据上泛化能力差。因此,在使用多项式回归升维时,需要谨慎选择多项式的次数和特征组合,通常会结合交叉验证等技术来选择合适的模型复杂度。

本案例中,随机生成了一个带噪声的一元二次方程和若干组随机数据,使用numpy操作矩阵,sklearn库训练模型,matplotlib对源数据和模型可视化。

关键代码

使用sklearn为多项式升维提供了便捷的工具,下示例代码使用PolynomialFeatures类对源特征进行升维操作

  • degree:升维后的维度上限

  • interaction_only:是否只生成交互项:

    • 当 interaction_only=False(默认值)时,PolynomialFeatures 会生成所有可能的多项式组合,包括所有阶数的单项式和交互项。例如,对于两个特征 \(x_1\)\(x_2\) ,如果 degree=2,则生成的特征集将包括 \([1, x_1, x_2, x_1 * x_2, x_2^2]\)

    • 当 interaction_only=True 时,PolynomialFeatures 只生成交互项和零阶项。这意味着它不会生成任何特征的单独高次项,只生成不同特征之间的交互项。继续上面的例子,如果 degree=2 且 interaction_only=True,则生成的特征集将只包括 \([1, x_1 * x_2]\)


from sklearn.preprocessing import PolynomialFeatures
# 对X进行多项式升维 本例中,升维前的X仅有X^1一维,升维后的X将包含[X^0, X^1, X^2]三维
poly = PolynomialFeatures(degree=2, interaction_only=False)
X = X.reshape(-1, 1)  # 转变为列数为1的二维数组
X_poly = poly.fit_transform(X)

运行截图

image

image

Full Code

import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

# 样本数、特征数
n, m = 100, 1

# 函数和导函数
func = lambda x : (x - 3.5) ** 2 - 4.5 * x + 10
grad = lambda x : 2 * (x - 3.5) - 4.5

X = np.linspace(0, 11.5, n)

# 训练目标y需要在f(x)的基础上添加噪声
y = func(X) + np.random.randn(n)

# 对X进行多项式升维
poly = PolynomialFeatures(degree=2, interaction_only=False)
X = X.reshape(-1, 1)
X_poly = poly.fit_transform(X)

# 数据切片,前80%作为训练数据
train_cnt = int(0.8 * n)
X_poly_train, y_train = X_poly[:train_cnt], y[:train_cnt]
X_poly_test, y_test = X_poly[train_cnt:], y[train_cnt:]

# 建模
model = LinearRegression(fit_intercept=True)
model.fit(X_poly_train, y_train)

# 不使用科学计数法打印
np.set_printoptions(suppress=True)

print("W:", model.coef_)
print("b:", model.intercept_)
print("多项式升维度模型得分 (越接近1,拟合度越高) :", model.score(X_poly_test, y_test))

# 可视化部分
plt.scatter(X, y)
# 根据自定义参数创建的函数
plt.plot(X, func(X), 'green', label="Created Function Curve")
# 拟合得到的图像
y_pred = model.predict(X_poly)
plt.plot(X_poly[:, 1], y_pred, 'red', label="Model Fitted Curve")

# 添加标题和轴标签
plt.title('Polynomial Regression Fitting Case')
plt.xlabel('x')
plt.ylabel('y')
# 添加图例
plt.legend()
plt.show()

posted @ 2024-08-08 15:02  AnUpdatingHam  阅读(24)  评论(0编辑  收藏  举报