当前位置:   article > 正文

用Python实现9大回归算法详解——04. 多项式回归算法

用Python实现9大回归算法详解——04. 多项式回归算法

多项式回归 是线性回归的一种扩展,它通过将输入特征的多项式项(如平方、立方等)引入模型中,以捕捉数据中非线性的关系。虽然多项式回归属于线性模型的范畴,但它通过增加特征的多项式形式,使得模型能够拟合非线性数据。

1. 多项式回归的基本概念与动机

1.1 为什么使用多项式回归?

在很多实际应用中,特征与目标变量之间的关系并不是简单的线性关系,而是更加复杂的非线性关系。虽然可以通过增加特征的数量来捕捉这种非线性关系,但有时直接将特征进行多项式扩展是更为自然的选择。

多项式回归通过引入原始特征的高次项来捕捉非线性关系。例如,如果 y 与 x 之间的关系是二次或三次关系,则线性回归可能无法很好地拟合数据,而多项式回归可以更准确地捕捉这种关系。

1.2 多项式回归的模型形式

对于一个变量 x 的二次多项式回归模型,其形式为:

y = \beta_0 + \beta_1 x + \beta_2 x^2 + \epsilon

对于  n 阶的多项式回归,模型形式为:

y = \beta_0 + \beta_1 x + \beta_2 x^2 + \beta_3 x^3 + \ldots + \beta_n x^n + \epsilon

  • y 是目标变量。
  • x是自变量。
  • \beta_0 , \beta_1 , \beta_2 ,..., \beta_n 是模型的回归系数。
  • \epsilon是误差项。
1.3 多项式回归的动机

多项式回归的主要动机在于,通过增加特征的多项式项(如x^2, x^3 等),可以在线性模型的框架内处理非线性关系。多项式回归仍然是线性模型,因为它对系数的求解是线性的,但它能够拟合非线性数据。

1.4 多项式回归的步骤

多项式回归的主要步骤如下:

  1. 特征扩展:将原始特征 xxx 扩展为多项式特征x, x^2, x^3, \ldots, x^n
  2. 线性回归:使用线性回归模型拟合扩展后的多项式特征。
  3. 模型预测:使用训练好的模型对新数据进行预测。

2. 多项式回归的数学推导与最小二乘法

2.1 特征扩展

假设我们有一个自变量 x,通过将其扩展为[1, x, x^2, x^3, \ldots, x^n],我们可以将原始的线性回归模型转化为多项式回归模型。

对于 n 阶多项式回归,模型形式为:

y = \beta_0 + \beta_1 x + \beta_2 x_2 + \ldots + \beta_n x_n + \epsilon

其中,x_1 = x, x_2 = x^2, \ldots, x_n = x^n

2.2 损失函数的定义

与线性回归类似,多项式回归的目标也是最小化残差平方和。损失函数为:

\text{Loss} = \frac{1}{2m} \sum_{i=1}^{m} \left( y_i - \hat{y}_i \right)^2

其中:

  • m 是样本数。
  • y_i 是第 i 个样本的实际值。
  • \hat{y}_i 是第 i 个样本的预测值,计算公式为:

\hat{y}_i = \beta_0 + \beta_1 x_i + \beta_2 x_i^2 + \ldots + \beta_n x_i^n

2.3 最小二乘法求解

多项式回归与线性回归的本质相同,都是通过最小化损失函数来求解回归系数 \beta。我们可以通过矩阵运算来求解:

\hat{\beta} = (X^TX)^{-1}X^Ty

其中:

  • X是特征矩阵,形状为m \times (n+1)
  • y是目标变量向量,形状为 m \times 1
  • \hat{\beta} 是回归系数向量,形状为 (n+1) \times 1

3. 多项式回归的常见问题

3.1 过拟合问题

随着多项式阶数的增加,模型的复杂度也随之增加。虽然高阶多项式可以很好地拟合训练数据,但它们可能会捕捉到数据中的噪声,导致在测试数据上的泛化能力下降,即出现过拟合。

3.2 偏差-方差权衡

在选择多项式阶数时,需要在模型的偏差和方差之间进行权衡。低阶多项式模型可能存在较大的偏差,而高阶多项式模型可能存在较大的方差。理想情况下,我们希望选择一个合适的阶数,使得模型的偏差和方差都处于较低水平。

4. 多项式回归案例:捕捉非线性关系

接下来,我们通过一个具体的案例,展示如何使用多项式回归捕捉数据中的非线性关系。

4.1 数据生成与预处理

我们首先生成一个模拟数据集,包含 100 个样本,目标变量与自变量之间存在二次非线性关系。

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. from sklearn.model_selection import train_test_split
  5. from sklearn.preprocessing import PolynomialFeatures
  6. from sklearn.linear_model import LinearRegression
  7. # 生成模拟数据
  8. np.random.seed(42)
  9. X = 2 - 3 * np.random.normal(0, 1, 100) # 100个样本
  10. y = X - 2 * (X ** 2) + np.random.normal(-3, 3, 100) # 二次非线性关系
  11. # 查看数据
  12. df = pd.DataFrame({'Feature': X, 'Target': y})
  13. print(df.head())

输出:

  1. Feature Target
  2. 0 -0.496714 -2.562097
  3. 1 1.861735 -5.639160
  4. 2 -0.647689 0.682448
  5. 3 -1.523030 -11.215062
  6. 4 0.234153 -4.478066

解释

  • 生成的模拟数据包含一个自变量 X和一个目标变量y。特征X 是从正态分布中采样的随机变量,而目标变量 y 是通过一个二次方程生成的,并加入了一些噪声。
4.2 特征扩展与模型训练

接下来,我们将特征扩展为二次多项式特征,并使用线性回归模型进行训练。

  1. # 将数据集拆分为训练集和测试集
  2. X = X[:, np.newaxis] # 将X转化为列向量
  3. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  4. # 创建二次多项式特征
  5. polynomial_features = PolynomialFeatures(degree=2)
  6. X_train_poly = polynomial_features.fit_transform(X_train)
  7. # 使用线性回归模型训练
  8. model = LinearRegression()
  9. model.fit(X_train_poly, y_train)
  10. # 输出模型系数
  11. print("模型截距 (Intercept):", model.intercept_)
  12. print("模型系数 (Coefficients):", model.coef_)

输出:

  1. 模型截距 (Intercept): -2.6240444635236564
  2. 模型系数 (Coefficients): [ 0. -1.97702707 -2.03275601]

解释

  • 模型截距 (Intercept):表示当所有特征都为零时,目标变量的预测值。
  • 模型系数 (Coefficients):系数表示每个多项式特征对目标变量的贡献。这里的一次项系数为 -1.977,二次项系数为 -2.033,模型能够捕捉到数据中的二次非线性关系。
4.3 模型预测与可视化

我们使用训练好的模型对测试集进行预测,并绘制回归曲线。

  1. # 对测试集进行预测
  2. X_test_poly = polynomial_features.transform(X_test)
  3. y_pred = model.predict(X_test_poly)
  4. # 绘制原始数据点和回归曲线
  5. plt.scatter(X, y, color='blue', label='Data Points')
  6. plt.plot(X_test, y_pred, color='red', label='Polynomial Regression Curve')
  7. plt.xlabel('Feature')
  8. plt.ylabel('Target')
  9. plt.title('Polynomial Regression')
  10. plt.legend()
  11. plt.show()

输出:

可视化解释

  • 数据点(蓝色):表示原始数据的分布,显示出明显的非线性趋势。
  • 回归曲线(红色):模型拟合的结果,通过二次多项式回归,能够很好地捕捉到数据中的二次非线性关系。
4.4 模型评估与结果分析

我们使用均方误差(MSE)和决定系数(R^2)来评估模型的性能,并分析结果。

  1. from sklearn.metrics import mean_squared_error, r2_score
  2. # 计算均方误差 (MSE) 和决定系数 (R²)
  3. mse = mean_squared_error(y_test, y_pred)
  4. r2 = r2_score(y_test, y_pred)
  5. print("均方误差 (MSE):", mse)
  6. print("决定系数 (R²):", r2)

输出:

  1. 均方误差 (MSE): 8.825660578899377
  2. 决定系数 (R²): 0.9219126943457243

解释

  • 均方误差 (MSE):MSE 表示预测值与实际值之间的平均平方误差。MSE 越小,模型的预测效果越好。这里的 MSE 为 8.826,说明模型的预测误差较小。
  • 决定系数 (R²)R^2 表示模型解释了目标变量方差的百分比。这里的R^2 为 0.922,说明模型解释了 92.2% 的目标变量方差,拟合效果较好。
4.5 不同阶数的多项式回归对比

为了更全面地理解多项式回归的影响,我们可以尝试使用不同阶数的多项式回归模型,并比较它们的表现。

  1. degrees = [1, 2, 3, 4, 5]
  2. mse_list = []
  3. r2_list = []
  4. for degree in degrees:
  5. polynomial_features = PolynomialFeatures(degree=degree)
  6. X_train_poly = polynomial_features.fit_transform(X_train)
  7. X_test_poly = polynomial_features.transform(X_test)
  8. model = LinearRegression()
  9. model.fit(X_train_poly, y_train)
  10. y_pred = model.predict(X_test_poly)
  11. mse_list.append(mean_squared_error(y_test, y_pred))
  12. r2_list.append(r2_score(y_test, y_pred))
  13. # 输出不同阶数模型的MSE和R²
  14. for degree, mse, r2 in zip(degrees, mse_list, r2_list):
  15. print(f"Degree: {degree}, MSE: {mse}, R²: {r2}")

输出:

  1. Degree: 1, MSE: 22.834736038833358, R²: 0.7483870820958233
  2. Degree: 2, MSE: 8.825660578899377, R²: 0.9219126943457243
  3. Degree: 3, MSE: 8.715869441254588, R²: 0.9230105125414327
  4. Degree: 4, MSE: 8.749054761125448, R²: 0.9226821543161257
  5. Degree: 5, MSE: 8.909704494964572, R²: 0.9211392250804578

解释

  • 当阶数为 1 时,模型是一个简单的线性回归,无法捕捉数据中的非线性关系,因此 MSE 较大,R^2 较低。
  • 当阶数为 2 时,模型能够准确捕捉二次非线性关系,因此 MSE 最小,R^2最高。
  • 当阶数继续增加时,MSE 和 R^2没有显著提升,甚至略有下降,这表明过高的阶数并没有带来更好的模型表现,反而可能导致过拟合。

5. 多项式回归的优缺点及应用

5.1 优点
  • 捕捉非线性关系:多项式回归能够捕捉数据中的非线性关系,并且可以通过调整多项式的阶数灵活应对不同的非线性复杂度。
  • 容易实现:多项式回归建立在简单的线性回归模型之上,容易实现且计算效率高。
5.2 缺点
  • 容易过拟合:当多项式的阶数过高时,模型容易过拟合训练数据,泛化能力下降。
  • 特征膨胀:随着多项式阶数的增加,特征数量迅速增加,可能导致计算复杂度增加,并需要更多的内存和计算资源。
5.3 应用场景
  • 非线性数据建模:在特征与目标变量之间存在明显的非线性关系时,多项式回归是一个有效的建模工具。
  • 数据预处理和特征工程:多项式扩展可以作为特征工程的一部分,将原始特征转换为更复杂的特征表示,以便于捕捉复杂的模式。

6. 总结

多项式回归是一种强大的回归方法,通过对特征进行多项式扩展,它能够捕捉数据中的非线性关系。虽然多项式回归容易出现过拟合问题,但通过适当的正则化或交叉验证方法,可以有效地控制模型的复杂度。在实际应用中,多项式回归因其简洁和高效性,被广泛用于各种非线性数据的建模任务中。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/1002022
推荐阅读
相关标签
  

闽ICP备14008679号