ML:多项式回归的基本原理与实现
在机器学习中回归任务关注的是“预测一个连续数值”。当输入特征与目标变量之间的关系近似线性时线性回归往往可以取得不错效果但在很多实际问题中这种关系并不总是一条直线而更可能呈现弯曲、拐点或增长速度变化等非线性特征。例如学习时间与成绩的关系可能在初期提升明显、后期趋于平缓温度与能耗的关系也可能并不是简单的直线变化。此时如果仍强行使用最普通的线性回归就可能出现拟合不足的问题。多项式回归Polynomial Regression正是在这种背景下提出的一种常见方法。它并不是抛弃线性回归而是先把原始特征扩展为多项式特征再使用线性回归进行拟合。因此它既保留了线性模型易于训练的优点又提高了对非线性关系的表达能力。一、多项式回归的基本思想多项式回归的核心思想是如果原始特征与目标变量之间不是简单的线性关系那么可以通过构造更高次的特征项把原本难以用直线表示的关系转换成一个可以由线性模型处理的问题。先看最简单的一元情形。假设只有一个输入特征 x线性回归使用的是这只能表示一条直线。而多项式回归则会进一步引入 x²、x³ 等更高次项使模型可以写成这样模型就不再只能表示直线而可以表示弯曲的函数形态。从直观上看多项式回归做了两件事• 先把原始输入特征扩展为更丰富的多项式特征• 再在这些扩展后的特征上使用线性回归进行拟合因此多项式回归虽然能拟合非线性关系但它在参数形式上依然是线性的。也就是说它仍然属于“对参数线性”的模型。图 1 多项式回归的基本思路二、多项式回归的数学表达1、一元多项式回归当只有一个输入特征时二次多项式回归可以写成三次多项式回归可以写成更一般地d 次多项式回归可写成其中• x 表示输入特征• ŷ 表示模型预测值• w₁, w₂, …, w_d 表示各阶特征项对应的系数• b 表示截距• d 表示多项式的最高次数这个表达式说明模型不再只考虑 x 对结果的线性影响还考虑更高阶项所携带的弯曲趋势信息。一般来说需要先观察数据的形状再去决定选用什么形式的多项式函数来处理问题。比如从数据的散点图观察如果有一个“弯”就可以考虑用二次多项式有两个“弯”可以考虑用三次多项式有三个“弯”则考虑用四次多项式以此类推。2、多特征情形下的多项式扩展当输入不止一个特征时多项式扩展会更复杂。假设原始输入为两个特征 x₁ 和 x₂若构造二次多项式特征则不仅会包含还会包含特征之间的交互项因此二次多项式模型可写成这说明多项式回归不仅能够表示“单个特征的弯曲效应”还能够表示“特征之间共同作用”的交互影响。3、“非线性”与“线性”的关系多项式回归很容易让人误以为它已经完全脱离了线性模型。实际上更准确的理解是它对原始输入的关系可以是非线性的但它对参数仍然是线性的。例如这里虽然出现了 x²看上去不再是直线模型但参数 w₂、w₁、b 仍然是以线性组合的方式进入模型的。这正是多项式回归最重要的思想之一通过特征变换把原始空间中的非线性关系转化为扩展特征空间中的线性回归问题。三、多项式回归如何学习参数模型形式确定之后真正的问题就变成了怎样找到最合适的参数1、预测误差对于一个样本模型给出预测值 ŷ真实值记为 y。两者之间的差异称为误差或残差如果有很多样本就需要一种方式综合所有样本上的误差。2、残差平方和多项式回归在参数学习上与普通线性回归的基本思想是一致的仍然常以最小化残差平方和为目标其中• yᵢ 是第 i 个样本的真实值• ŷᵢ 是第 i 个样本的预测值• n 是样本数这说明多项式回归与线性回归的区别主要不在于“优化目标变了”而在于“输入特征变了”。3、均方误差在实践中常用均方误差Mean Squared ErrorMSE来表示平均误差水平它与 RSS 的优化方向一致但更便于比较不同样本规模下的误差水平。4、本质仍然是最小二乘拟合如果把多项式扩展后的特征重新记作新的输入变量那么多项式回归本质上仍然是在做线性回归。也就是说原始问题看起来是非线性的经过特征扩展后学习过程依然可以使用最小二乘法。这也是为什么在 Scikit-learn 中多项式回归通常由 PolynomialFeatures 和 LinearRegression 这两个对象组合完成。四、多项式特征扩展的含义1、为什么要扩展特征普通线性回归只能学习“特征的线性加权组合”。如果真实关系具有弯曲趋势那么仅靠原始特征可能无法表达这种变化。此时增加多项式项的意义就在于• 让模型具有更强的表达能力• 让原本无法表示的曲线关系变得可拟合例如在一元情况下即一个特征可能扩展为三个特征。在二元情况下即两个特征可能扩展为五个特征。这种扩展并不是随意增加复杂度而是在尝试把问题表示得更接近真实规律。2、次数越高模型越灵活多项式次数越高模型能表示的曲线形态通常越复杂。例如• 一次多项式对应直线• 二次多项式可以表示抛物线• 三次多项式可以表示带拐点的曲线• 更高次的多项式则可以表示更复杂的弯曲形状这意味着多项式次数的提高会增强模型拟合能力但同时也会提高过拟合风险。3、特征数会迅速增加多项式回归虽然强大但也有一个非常现实的问题特征扩展后维度可能迅速膨胀。例如原始特征不多时二次或三次扩展还比较容易控制但当原始特征数较多时多项式项和交互项会显著增加模型复杂度也会迅速提高。因此多项式回归并不是“次数越高越好”而是需要在表达能力与泛化能力之间进行权衡。延伸阅读《AI 术语通俗词典扩展多项式特征》五、模型参数的解释多项式回归依然保留了一定的可解释性但这种解释比普通线性回归更需要谨慎。1、系数的含义在多项式回归中每个系数对应的是某一个多项式特征项的影响。例如这里• w₁ 表示一次项的影响• w₂ 表示二次项的影响如果 w₂ 不为零就说明目标变量与输入之间不仅存在线性趋势还存在曲率变化。2、交互项的含义在多特征情形下交互项系数反映的是“某个特征的影响会不会随着另一个特征变化而变化”。例如若该项系数较显著则说明 x₁ 与 x₂ 对目标值并不是彼此独立地起作用而可能存在联合影响。3、解释性会随复杂度下降虽然多项式回归仍然能查看系数但随着特征项和交互项不断增加参数解释会变得越来越困难。这也是为什么多项式回归常常介于“简单可解释模型”和“复杂非线性模型”之间它比普通线性回归更灵活但解释性通常会有所下降。六、Python 实现一元多项式回归示例下面用一个简单示例说明多项式回归的基本实现方式。这里仍然使用一元输入并构造一个近似二次关系的数据再通过 PolynomialFeatures 和 LinearRegression 完成拟合。PolynomialFeatures 根据输入特征的数量和指定的 degree 参数来生成特征。import numpy as npimport matplotlib.pyplot as plt from sklearn.preprocessing import PolynomialFeaturesfrom sklearn.linear_model import LinearRegressionfrom sklearn.pipeline import make_pipelinefrom sklearn.model_selection import train_test_split # 根据操作系统选择中文字体二选一取消注释对应行plt.rcParams[font.sans-serif] [Microsoft YaHei] # Windows# plt.rcParams[font.sans-serif] [PingFang SC] # macOSplt.rcParams[axes.unicode_minus] False # 解决负号显示为方块的问题 # 1. 构造一元非线性数据 rng np.random.RandomState(42) # 创建随机数生成器固定种子42保证结果可复现X np.linspace(-3, 3, 120).reshape(-1, 1) # 生成120个在[-3,3]上均匀分布的点并reshape为列向量# 生成二次函数数据y 0.8*x^2 1.5*x 2 噪声# rng.normal(0, 1.5, size120) 生成120个均值为0、标准差为1.5的正态分布噪声y 0.8 * X[:, 0]**2 1.5 * X[:, 0] 2 rng.normal(0, 1.5, size120) # 2. 划分训练集和测试集 # train_test_split: 将数据集随机划分为训练集和测试集# 参数说明:# X, y - 特征矩阵和目标向量# test_size0.2 - 测试集所占比例20% 的数据用于测试80% 用于训练# random_state42 - 随机种子保证每次划分方式一致# 返回值:# X_train, X_test - 训练集特征、测试集特征# y_train, y_test - 训练集目标、测试集目标X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42) # 3. 构造二次多项式回归模型 # make_pipeline: 创建一个管道将多个数据处理步骤串联起来# 作用: 先对数据进行多项式特征转换再进行线性回归# 等价于: Pipeline([(polynomialfeatures, PolynomialFeatures(...)), (linearregression, LinearRegression())])## PolynomialFeatures(degree2, include_biasFalse) - 多项式特征生成器# 参数说明:# degree2 - 多项式的最高次数这里生成 x, x^2 两个特征# include_biasFalse - 是否包含偏置列1列。False表示不添加常数项相当于截距由后续的LinearRegression负责# True会添加一列全1配合LinearRegression(fit_interceptFalse)使用# 其他常用参数:# interaction_onlyFalse - 是否只生成交互项不生成平方项等# orderC - 输出数组的存储顺序C风格或F风格## LinearRegression() - 线性回归模型在多项式特征上做线性回归实际实现了多项式回归# 参数说明:# fit_interceptTrue - 是否计算截距默认True管道中通常保留True因为PolynomialFeatures设置了include_biasFalse# copy_XTrue - 是否复制特征矩阵# n_jobsNone - 并行计算使用的CPU核心数model make_pipeline( PolynomialFeatures(degree2, include_biasFalse), LinearRegression()) # 4. 训练模型 # fit: 训练管道模型。内部自动对 PolynomialFeatures 调用 fit_transform()先学习特征维度再转换数据# 处理流程:# 1. 管道自动将X_train传递给PolynomialFeatures生成多项式特征x, x^2# 2. 然后将生成的特征传递给LinearRegression进行训练# 参数:# X_train - 原始特征一维转换为二维形状 [n_samples, 1]# y_train - 目标值形状 [n_samples]model.fit(X_train, y_train) # 5. 预测 # predict: 使用训练好的管道进行预测# 处理流程:# 1. 自动将X_test通过PolynomialFeatures转换生成x, x^2# 2. 再用训练好的LinearRegression进行预测# 参数:# X_test - 测试集特征形状 [n_samples, 1]# 返回值: 预测的目标值数组y_pred model.predict(X_test) # 6. 为绘图准备平滑曲线 # 生成300个更密集的点用于绘制平滑的回归曲线X_plot np.linspace(-3, 3, 300).reshape(-1, 1) # 在[-3,3]上生成300个点y_plot model.predict(X_plot) # 预测这些点的值得到平滑曲线 # 7. 可视化 plt.figure(figsize(8, 5)) # 创建画布大小为宽8英寸、高5英寸plt.scatter(X_train, y_train, label训练样本) # 绘制训练集散点图plt.scatter(X_test, y_test, label测试样本) # 绘制测试集散点图plt.plot(X_plot, y_plot, linewidth2, label多项式回归曲线) # 绘制回归曲线plt.xlabel(特征值) # x轴标签plt.ylabel(目标值) # y轴标签plt.title(一元多项式回归示例) # 图表标题plt.legend() # 显示图例plt.show() # 显示图像输出示意图这段代码展示了多项式回归的基本工作流1、构造或加载数据2、划分训练集与测试集3、用 PolynomialFeatures 扩展特征4、用 LinearRegression 拟合模型5、做预测并可视化结果与普通线性回归相比最重要的变化就是多了一步特征扩展。七、Python 实现多特征多项式回归示例下面再给出一个多特征示例帮助理解交互项和高阶项的引入方式。import numpy as npfrom sklearn.preprocessing import PolynomialFeaturesfrom sklearn.linear_model import LinearRegressionfrom sklearn.pipeline import make_pipelinefrom sklearn.model_selection import train_test_split # 1. 构造二维输入数据rng np.random.RandomState(42) # 固定随机种子保证可复现X rng.uniform(-2, 2, size(200, 2)) # 生成200个样本每个样本有2个特征取值范围[-2, 2]x1 X[:, 0] # 第一个特征x2 X[:, 1] # 第二个特征 # 2. 构造带交互项的目标# y 3*x1² 2*x1*x2 - 1.5*x2² 4*x1 噪声均值为0标准差1.0y 3 * x1**2 2 * x1 * x2 - 1.5 * x2**2 4 * x1 rng.normal(0, 1.0, size200) # 3. 划分训练集(80%)与测试集(20%)X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42) # 4. 构造模型二次多项式生成 x1, x2, x1², x1x2, x2² 线性回归model make_pipeline( PolynomialFeatures(degree2, include_biasFalse), # 生成所有2次及以下的特征组合不含常数项 LinearRegression() # 拟合多项式系数) # 5. 训练模型内部自动对 PolynomialFeatures 调用 fit_transformmodel.fit(X_train, y_train) # 6. 查看测试集上的部分预测结果y_pred model.predict(X_test) # 对测试集预测 # 打印前5个样本的真实值与预测值对比for i in range(5): print(f真实值: {y_test[i]:.2f} 预测值: {y_pred[i]:.2f})这个示例表明在多特征情形下多项式回归不仅能学习平方项也能学习交互项从而更好地描述多个变量共同作用的关系。八、多项式回归适用场景与主要局限1、适用场景多项式回归较适合以下情况• 目标是连续数值• 原始特征与目标之间存在明显的非线性趋势• 希望在保持模型相对简单的同时提高拟合能力• 希望通过特征工程扩展线性模型的表达能力在很多任务中多项式回归可以看作普通线性回归的自然扩展也是从简单线性模型走向更复杂非线性建模的重要过渡。2、主要局限多项式回归虽然比普通线性回归更灵活但也存在明显局限。• 容易过拟合次数过高时模型可能过度贴合训练数据• 特征维度膨胀原始特征较多时多项式项数量会迅速增加• 对异常值仍较敏感如果后端仍使用普通最小二乘那么平方误差的敏感性仍然存在• 解释性下降高阶项与交互项增多后参数意义会变得更难直观理解图 2 多项式次数与模型复杂度的关系 小结多项式回归通过特征扩展把原始空间中的非线性关系转化为扩展特征空间中的线性回归问题。它是线性回归的重要延伸也是理解特征工程、模型复杂度与过拟合风险的重要入口。“点赞有美意赞赏是鼓励”
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2551952.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!