目录
2.为什么XGboost是Adaboost的升级版,我们仍然保留全部?
[1.为什么叫 RidgeCV(交叉验证)?](#1.为什么叫 RidgeCV(交叉验证)?)
[2.裁判模型(Final Estimator)可以用普通线性回归,也可以用Lasso(套索回归),为什么选择岭回归?](#2.裁判模型(Final Estimator)可以用普通线性回归,也可以用Lasso(套索回归),为什么选择岭回归?)
一、提问
本题使用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]}
C(惩罚系数) :控制模型对"误差"的容忍度。C越大,模型越不敢犯错(容易钻牛角尖,过拟合);C越小,模型越躺平(欠拟合)。这里尝试 0.6 到 1.0 之间的 5 个值。
epsilon(不敏感损失带):SVR 独有的参数。它画了一条"误差管道",只要预测值跟真实值的差距落在这个管道内,模型就认为"没错,不扣分"。这里尝试 0.3、0.4、0.5 三种粗细的管道。
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和2) :擅长捕捉非线性 和特征交叉(像切豆腐块)。
核模型组(3) :擅长捕捉全局光滑流形(像拉橡皮筋),和树模型完全互补。
线性模型组(4、5、6) :擅长捕捉大体趋势,虽然简单,但绝不会像复杂模型那样剧烈震荡(起到稳定军心的作用)。
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"是为了自动选最好的约束强度。
2.裁判模型(Final Estimator)可以用普通线性回归,也可以用Lasso(套索回归),为什么选择岭回归?
答:岭回归(Ridge)就是为了解决"7个专家意见高度重合时,普通算法容易走极端(给巨大正负权重)"的问题。
它通过给权重加平方惩罚,强行按住算法,逼它给出一组平稳、均衡、不冒进的权重值,从而保证换一批新数据(测试集)时,预测结果依然稳定可靠。
打个比方 :普通线性回归是"不惜一切代价考100分(但答案可能靠蒙)",岭回归是"稳妥起见考95分(但每一步都有理有据)"。在预测未知原子结构时,显然"稳妥"远比"冒进"更重要。这就是用岭回归的根本原因。
第4步(接棒)
-
第三棒(裁判模型) :7个基学习器分别预测,RidgeCV加权求和,算出一个最终能量值 E。
-
第四棒(模拟退火判断) :这个 E 被立刻传给模拟退火算法。模拟退火接力解答。
附加
另外不同之处,4.符号说明里,附加4.2作为评价指标:


