《SVM支持向量机》在数学建模中实际运用

目录

一、提问

二、流程图

三、问题答疑

(1)AdaBoost

1.XGBoost和Adaboost很像,他们什么关系?

2.为什么XGboost是Adaboost的升级版,我们仍然保留全部?

(2)SVM支持向量机

提问

四、模型建立

第3步(核心):

最后的裁判是谁?

提问

[1.为什么叫 RidgeCV(交叉验证)?](#1.为什么叫 RidgeCV(交叉验证)?)

[2.裁判模型(Final Estimator)可以用普通线性回归,也可以用Lasso(套索回归),为什么选择岭回归?](#2.裁判模型(Final Estimator)可以用普通线性回归,也可以用Lasso(套索回归),为什么选择岭回归?)

第4步(接棒)

附加


一、提问

本题使用SVM来解决回归问题,但是请首先思考一个问题:

为什么作者非要选那个成绩最差的SVM,而不选两个"查表派"?

因为作者不是要选一个预言家,而是要把这几个人的答案综合起来

  • 如果作者选了两个"查表派"(比如两个随机森林),那这两个人脑子想的一模一样,要错全错,要蒙全蒙,综合起来毫无意义。

  • 现在作者选了一个"查表派"(XGB)和一个"画线派"(SVM)。查表派说:"我查了以前的情况,明天体温38.5度 !" 画线派说:"我看了下降趋势,明天大概37.2度!"

  • 作者一看,查表派虽然平时准,但万一他抄的那个旧日子有偏差呢?画线派虽然平时不准,但他看的那个"下降趋势"肯定是物理规律(发烧总会退)

  • 最后作者决定:以查表派的38.5为基础,稍微往画线派的37.2那边拉一点点(比如报38.0度) 。结果发现,这样中和一下,准确率居然比单纯信查表派还要高!


二、流程图


三、问题答疑

对集成算法的概念进行概述,由此推出XGBoost的概念,如下图所示:

(1)AdaBoost

这里又提出一个概念(AdaBoost):

AdaBoost算法(自适应Boosting(Adaptive Boosting)),简单来说,就是把很多个不是很强大的模型组合起来,形成一个非常强大的模型(XGBoost)。在这个过程中,AdaBoost特别关注那些之前被错误分类的数据点,确保这些点在后续的训练中得到更多的注意,从而提高整体的学习效果。 集成学习算法:AdaBoost原理详解以及基于adaboost的图像二分类代码实现-CSDN博客

1.XGBoost和Adaboost很像,他们什么关系?

  • 关系XGBoost 是 AdaBoost 的"威力加强Pro Max版"。就像手机从"大哥大"升级到了"智能手机"。

  • 核心区别AdaBoost 死磕"做错的题" (加权重),容易钻牛角尖;XGBoost 死磕"差多少分"(拟合残差),还自带刹车片(正则化),又快又稳又准。

它们确实都是机器学习模型,但在这篇论文里,作者把这两个"亲戚"都放进集成模型里当"投票嘉宾",就是为了利用它们不同年代的算法视角,互相弥补预测偏差

2.为什么XGboost是Adaboost的升级版,我们仍然保留全部?

假如你是射击队教练(Stacking集成模型)

  • 选手A(XGBoost) :超级神枪手,10枪能打中9枪10环,但唯一的毛病是 ------遇到刮风天(数据分布稍微变动),他所有的子弹都会集体偏左上角(系统性偏差)。

  • 选手B(AdaBoost) :普通选手,10枪只能打中5枪10环,成绩平平。但他有个特点 ------他从不偏左上角,就算脱靶也是乱飘的(误差模式完全不同)。


2. 教练的"骚操作":不淘汰B,反而留着B

如果你只派选手A(XGB)去比赛,一旦刮风(测试集遇到新结构),A全部偏左上角,你会输得很惨。

现在教练做了一个决定:

"我把A(XGB)和B(AdaBoost)的靶纸都收上来。最后的总成绩,90%看A的环数,10%看B的环数。"

当刮风时,A偏左上角打了8环(实际应该是10环),B虽然不准但恰好偏右下角打了9环。

教练一平均:0.9 × 8 + 0.1 × 9 = 8.1环 。虽然还是不准,但比A自己打的8环要更接近真实的10环

结论 :B(AdaBoost)虽然总成绩差,但它把A的"偏左上角"的毛病给中和掉了一部分。如果换成另一个"神枪手C"(再换一个XGBoost变体),他也会偏左上角,两个偏左上角的人加起来毫无意义。

当XGBoost在罕见结构上预测出一个极端离谱的高能量值时,高层模型(RidgeCV)会偷偷看一眼AdaBoost那个"保守且平庸"的预测值,稍微把XGBoost的极端值往回拉一拉,防止跑偏。


(2)SVM支持向量机

训练代码:

python 复制代码
param_grid = {'C':[0.6, 0.7, 0.8, 0.9, 1], 
'epsilon':[0.3, 0.4, 0.5], 'coef0':[0.1, 0.001, 0.0001]}
  1. C(惩罚系数) :控制模型对"误差"的容忍度。C 越大,模型越不敢犯错(容易钻牛角尖,过拟合);C 越小,模型越躺平(欠拟合)。这里尝试 0.6 到 1.0 之间的 5 个值。

  2. epsilon(不敏感损失带):SVR 独有的参数。它画了一条"误差管道",只要预测值跟真实值的差距落在这个管道内,模型就认为"没错,不扣分"。这里尝试 0.3、0.4、0.5 三种粗细的管道。

  3. coef0(核函数常数项):用来调整核函数(类似曲线形状)的一个偏置常数。这里尝试 0.1、0.001、0.0001。


python 复制代码
SVR_grid = GridSearchCV(SVR, param_grid, cv=5, 
verbose=True, return_train_score=True, 
error_score='neg_root_mean_squared_error', n_jobs=-1)

网格搜索GridSearchCV()

  • SVR:今天要训练的主角(支持向量回归模型)。

  • param_grid:就用上面列的那 45 种配方去试。

  • cv=5(交叉验证) :为了防止"运气好"(过拟合),不直接把所有数据拿去训练。而是把数据平均切成 5 份,轮流拿 4 份训练,1 份验证,循环 5 次取平均分。这就相当于请了 5 个评委分别试吃,最后取平均分,防止某个评委口味独特给高分。

  • verbose=True:在程序运行过程中,把进度打印在屏幕上,让你知道"正在试第 3 种配方......",主要用于实时观察。

  • return_train_score=True:不仅要看验证集分数,也看看训练集分数(方便判断是否过拟合)。

  • error_score='neg_root_mean_squared_error'这里容易误解! 它不是评分标准,而是"容错兜底"。如果某次训练过程中程序报错(比如数据有问题),就用一个很大的负数(负的均方根误差)代替,表示"这次做砸了,得 0 分"。

    • 实际 SVR 的默认评分标准是 R²(决定系数),越大越好。
  • n_jobs=-1 :调用电脑所有的 CPU 核心去并行计算,跑得飞快

cpp 复制代码
SVR_grid.fit(X_train, y_train)

计算机开始暴力地循环 45 次,每一次都用 cv=5(5 折交叉验证)算出平均得分,记录在案


提问

1.既然随机森林和XGBoost在单模型评测中表现远优于SVM,为什么作者不直接剔除SVM,反而要把它"硬塞"进Stacking框架里

答:作者选择SVM,不是为了让它"赢"随机森林,而是为了利用它与树模型**"天生的数学对立性"** ,通过Stacking融合来抵消系统误差。这是物理学中的"相干叠加"在机器学习算法选型上的生动映射。在预测原子能量这种物理问题时,真实情况往往就是平滑连续的。SVM虽然在大范围内精度差,但它对"平滑趋势"的直觉,恰恰是树模型天生不具备的。所以只有它才能提供那种"与众不同的犯错视角"。

选SVM,不是因为它"准",而是因为它"傻"得与众不同。

其他模型都在抠细节(看局部),SVM专门看大趋势(看全局)。把"抠细节的"和"看全局的"混在一起用,正好弥补了彼此的盲区,所以最终预测结果比只用一种模型要稳得多。作者要的就是SVM这个"不同的视角"


四、模型建立

整个流程只有4个步骤 ,所有模型都在第3步同时登场:

第1,2步:物理计算, 数据转化

第3步(核心):

作者把第1步算出的物理值,和第2步转化的数字特征,同时复制了7份 ,分别喂给7个不同的模型。重点来了 :这7个模型同时、并行 地算出7个不同的预测能量值。然后,作者请来了第8个模型(叫 RidgeCV,相当于一个"裁判"),裁判看着这7个答案,说:

"XGBoost平时准,我给你0.6 的投票权;SVM虽然差但观点独特,给你0.1 的投票权;AdaBoost给你0.05的投票权......"

裁判把这7个答案加权求和 ,算出一个最终的、唯一的能量预测值

序号 模型名称(中文) 代码中的变量名 它在团队里的"角色"
1 XGBoost xgbr 主力尖子生(树模型,精度最高)
2 随机森林(RF) rf 稳重学霸(也是树模型,防过拟合)
3 SVR(支持向量回归) SVR 直觉派画线师(看全局平滑趋势)
4 线性SVR(LinearSVR) lsvr 死板直尺(只能看线性关系,极其简单)
5 Lasso回归 las 砍刀手(喜欢把不重要的特征权重砍成0,做特征筛选)
6 弹性网络(ElasticNet) elastic 中和派(介于Lasso和普通线性之间)
7 AdaBoost adb 死磕错题的纠错员(Boosting老前辈)

你可能觉得:"为什么选一堆表现差的?" 其实作者是故意组合了四种完全不同的"思维方式":

  1. 树模型组(1和2) :擅长捕捉非线性特征交叉(像切豆腐块)。

  2. 核模型组(3) :擅长捕捉全局光滑流形(像拉橡皮筋),和树模型完全互补。

  3. 线性模型组(4、5、6) :擅长捕捉大体趋势,虽然简单,但绝不会像复杂模型那样剧烈震荡(起到稳定军心的作用)。

  4. Boosting组(7):虽然单挑弱,但它的"纠错机制"和XGBoost的"拟合残差"机制略有不同,能补充一点点额外的差异性。


最后的裁判是谁?

这7个模型各算出一个预测值后,作者没有简单平均,而是请了第8个模型来做**"总裁判"**:

  • RidgeCV(岭回归交叉验证) (代码第45页最后一行 final_estimator=RidgeCV()

    它的任务就是:给这7个人分配投票权重。表现好的(XGB)权重给高点,表现差的(AdaBoost、LinearSVR)权重给低点,但都会保留一点点话语权。

python 复制代码
print(reg.named_steps['final_estimator_'].coef_)

执行这个语句,就可以看到最终七大模型得到的权重:

python 复制代码
[0.62, 0.15, 0.08, 0.05, 0.04, 0.03, 0.03]

提问

1.为什么叫 RidgeCV(交叉验证)?

普通岭回归需要你手动输入一个"紧箍咒强度"(alpha值),调大了不准,调小了不稳定。

但论文代码里写的是 RidgeCV(),括号里是空的!

  • 这意味着,裁判在求出权重之前,会自己偷偷地把训练集再切分成 5 份,分别试各种不同的"紧箍咒强度",看看哪个强度算出来的权重在验证集上表现最好。

  • 结论 :整个过程完全自动,你不需要调任何参数,它自己就把最合适的权重分配方案算出来了。

它自动求出权重的原理是:不断调整 7 个模型的权重系数,使得(加权总分 - 真实能量值)的平方误差最小。 加"岭"是为了防止权重互相打架(过拟合),加"CV"是为了自动选最好的约束强度。

【RidgeCV函数介绍及可视化分析】-CSDN博客

2.裁判模型(Final Estimator)可以用普通线性回归,也可以用Lasso(套索回归),为什么选择岭回归

答:岭回归(Ridge)就是为了解决"7个专家意见高度重合时,普通算法容易走极端(给巨大正负权重)"的问题。

它通过给权重加平方惩罚,强行按住算法,逼它给出一组平稳、均衡、不冒进的权重值,从而保证换一批新数据(测试集)时,预测结果依然稳定可靠。

打个比方 :普通线性回归是"不惜一切代价考100分(但答案可能靠蒙)",岭回归是"稳妥起见考95分(但每一步都有理有据)"。在预测未知原子结构时,显然"稳妥"远比"冒进"更重要。这就是用岭回归的根本原因。

第4步(接棒)

  • 第三棒(裁判模型) :7个基学习器分别预测,RidgeCV加权求和,算出一个最终能量值 E

  • 第四棒(模拟退火判断) :这个 E 被立刻传给模拟退火算法。模拟退火接力解答。


附加

另外不同之处,4.符号说明里,附加4.2作为评价指标:

相关推荐
营养充电站2 小时前
KMP全栈开发:从Android到AI Agent的技术演进与实践
人工智能·算法·docker·jupyter
技术小黑2 小时前
RNN算法实战系列05 | 天气预测
人工智能·rnn·算法
Ivanqhz5 小时前
php8 use-def链
算法·php
evans在进步5 小时前
LeetCode 189 轮转数组:三次反转原地解决,图解 Java 实现
java·算法·leetcode
歌_顿5 小时前
Drawing_To_Model
算法
龍德明宇5 小时前
AI不会疼-龍德明宇
人工智能·算法·大语言模型llm·负主体性·ai存在论
302wanger6 小时前
程序员写 SOP:把脑子里的流程固化下来
算法
️学习的小王6 小时前
智能文档助手:基于RAG的本地化文档问答系统实战指南
人工智能·python·机器学习
这张生成的图像能检测吗6 小时前
(论文速读)基于 MEMS 振动的无人机智能健康监测:螺旋桨损伤与结构松动检测
人工智能·机器学习·无人机·信号处理·故障诊断·特征提取·缺陷识别
科学实验家6 小时前
完全背包
算法