欢迎光临
我们一直在努力

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

目录

一、提问

二、流程图

三、问题答疑

(1)AdaBoost

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

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

(2)SVM支持向量机

提问

四、模型建立

第3步(核心):

最后的裁判是谁?

提问

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

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支持向量机

训练代码:

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]}

  • C(惩罚系数):控制模型对“误差”的容忍度。C 越大,模型越不敢犯错(容易钻牛角尖,过拟合);C 越小,模型越躺平(欠拟合)。这里尝试 0.6 到 1.0 之间的 5 个值。

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

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


  • 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 核心去并行计算,跑得飞快。

    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和2):擅长捕捉非线性和特征交叉(像切豆腐块)。

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

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

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


  • 最后的裁判是谁?

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

    • RidgeCV(岭回归交叉验证)(代码第45页最后一行 final_estimator=RidgeCV()) 它的任务就是:给这7个人分配投票权重。表现好的(XGB)权重给高点,表现差的(AdaBoost、LinearSVR)权重给低点,但都会保留一点点话语权。

    print(reg.named_steps['final_estimator_'].coef_)

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

    [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作为评价指标:

    赞(0)
    未经允许不得转载:171主机测评 » 《SVM支持向量机》在数学建模中实际运用
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址