赞
踩
多项式回归 是线性回归的一种扩展,它通过将输入特征的多项式项(如平方、立方等)引入模型中,以捕捉数据中非线性的关系。虽然多项式回归属于线性模型的范畴,但它通过增加特征的多项式形式,使得模型能够拟合非线性数据。
在很多实际应用中,特征与目标变量之间的关系并不是简单的线性关系,而是更加复杂的非线性关系。虽然可以通过增加特征的数量来捕捉这种非线性关系,但有时直接将特征进行多项式扩展是更为自然的选择。
多项式回归通过引入原始特征的高次项来捕捉非线性关系。例如,如果 与 之间的关系是二次或三次关系,则线性回归可能无法很好地拟合数据,而多项式回归可以更准确地捕捉这种关系。
对于一个变量 的二次多项式回归模型,其形式为:
对于 阶的多项式回归,模型形式为:
多项式回归的主要动机在于,通过增加特征的多项式项(如 等),可以在线性模型的框架内处理非线性关系。多项式回归仍然是线性模型,因为它对系数的求解是线性的,但它能够拟合非线性数据。
多项式回归的主要步骤如下:
假设我们有一个自变量 ,通过将其扩展为,我们可以将原始的线性回归模型转化为多项式回归模型。
对于 阶多项式回归,模型形式为:
其中,。
与线性回归类似,多项式回归的目标也是最小化残差平方和。损失函数为:
其中:
多项式回归与线性回归的本质相同,都是通过最小化损失函数来求解回归系数 。我们可以通过矩阵运算来求解:
其中:
随着多项式阶数的增加,模型的复杂度也随之增加。虽然高阶多项式可以很好地拟合训练数据,但它们可能会捕捉到数据中的噪声,导致在测试数据上的泛化能力下降,即出现过拟合。
在选择多项式阶数时,需要在模型的偏差和方差之间进行权衡。低阶多项式模型可能存在较大的偏差,而高阶多项式模型可能存在较大的方差。理想情况下,我们希望选择一个合适的阶数,使得模型的偏差和方差都处于较低水平。
接下来,我们通过一个具体的案例,展示如何使用多项式回归捕捉数据中的非线性关系。
我们首先生成一个模拟数据集,包含 100 个样本,目标变量与自变量之间存在二次非线性关系。
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- from sklearn.model_selection import train_test_split
- from sklearn.preprocessing import PolynomialFeatures
- from sklearn.linear_model import LinearRegression
-
- # 生成模拟数据
- np.random.seed(42)
- X = 2 - 3 * np.random.normal(0, 1, 100) # 100个样本
- y = X - 2 * (X ** 2) + np.random.normal(-3, 3, 100) # 二次非线性关系
-
- # 查看数据
- df = pd.DataFrame({'Feature': X, 'Target': y})
- print(df.head())
输出:
- Feature Target
- 0 -0.496714 -2.562097
- 1 1.861735 -5.639160
- 2 -0.647689 0.682448
- 3 -1.523030 -11.215062
- 4 0.234153 -4.478066
解释:
接下来,我们将特征扩展为二次多项式特征,并使用线性回归模型进行训练。
- # 将数据集拆分为训练集和测试集
- X = X[:, np.newaxis] # 将X转化为列向量
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
-
- # 创建二次多项式特征
- polynomial_features = PolynomialFeatures(degree=2)
- X_train_poly = polynomial_features.fit_transform(X_train)
-
- # 使用线性回归模型训练
- model = LinearRegression()
- model.fit(X_train_poly, y_train)
-
- # 输出模型系数
- print("模型截距 (Intercept):", model.intercept_)
- print("模型系数 (Coefficients):", model.coef_)
输出:
- 模型截距 (Intercept): -2.6240444635236564
- 模型系数 (Coefficients): [ 0. -1.97702707 -2.03275601]
解释:
我们使用训练好的模型对测试集进行预测,并绘制回归曲线。
- # 对测试集进行预测
- X_test_poly = polynomial_features.transform(X_test)
- y_pred = model.predict(X_test_poly)
-
- # 绘制原始数据点和回归曲线
- plt.scatter(X, y, color='blue', label='Data Points')
- plt.plot(X_test, y_pred, color='red', label='Polynomial Regression Curve')
- plt.xlabel('Feature')
- plt.ylabel('Target')
- plt.title('Polynomial Regression')
- plt.legend()
- plt.show()
输出:
可视化解释:
我们使用均方误差(MSE)和决定系数()来评估模型的性能,并分析结果。
- from sklearn.metrics import mean_squared_error, r2_score
-
- # 计算均方误差 (MSE) 和决定系数 (R²)
- mse = mean_squared_error(y_test, y_pred)
- r2 = r2_score(y_test, y_pred)
-
- print("均方误差 (MSE):", mse)
- print("决定系数 (R²):", r2)
输出:
- 均方误差 (MSE): 8.825660578899377
- 决定系数 (R²): 0.9219126943457243
解释:
为了更全面地理解多项式回归的影响,我们可以尝试使用不同阶数的多项式回归模型,并比较它们的表现。
- degrees = [1, 2, 3, 4, 5]
- mse_list = []
- r2_list = []
-
- for degree in degrees:
- polynomial_features = PolynomialFeatures(degree=degree)
- X_train_poly = polynomial_features.fit_transform(X_train)
- X_test_poly = polynomial_features.transform(X_test)
-
- model = LinearRegression()
- model.fit(X_train_poly, y_train)
- y_pred = model.predict(X_test_poly)
-
- mse_list.append(mean_squared_error(y_test, y_pred))
- r2_list.append(r2_score(y_test, y_pred))
-
- # 输出不同阶数模型的MSE和R²
- for degree, mse, r2 in zip(degrees, mse_list, r2_list):
- print(f"Degree: {degree}, MSE: {mse}, R²: {r2}")
输出:
- Degree: 1, MSE: 22.834736038833358, R²: 0.7483870820958233
- Degree: 2, MSE: 8.825660578899377, R²: 0.9219126943457243
- Degree: 3, MSE: 8.715869441254588, R²: 0.9230105125414327
- Degree: 4, MSE: 8.749054761125448, R²: 0.9226821543161257
- Degree: 5, MSE: 8.909704494964572, R²: 0.9211392250804578
解释:
多项式回归是一种强大的回归方法,通过对特征进行多项式扩展,它能够捕捉数据中的非线性关系。虽然多项式回归容易出现过拟合问题,但通过适当的正则化或交叉验证方法,可以有效地控制模型的复杂度。在实际应用中,多项式回归因其简洁和高效性,被广泛用于各种非线性数据的建模任务中。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。