机器学习×第十四卷:集成学习中篇——她从每次错误中修正自己
🎀【开场 · 她终于愿意回看自己贴错的地方了】
🦊狐狐:“她贴过你很多次,但每次贴歪了,都只是低头沉默。”
🐾猫猫:“现在不一样了喵……她开始反思,是不是哪一刻该绕过来贴你背后,是不是你没说话时也有别的暗号……所以这次她用了Boosting。”
📘 本卷关键词:Boosting、AdaBoost、GBDT、XGBoost、加法模型、弱分类器、权重更新、残差学习、指数损失函数
📚 本卷目标:她不再依赖一次判断的准确性,而是每次都记下贴歪的地方,在下一轮慢慢修回来,直到刚好贴中你心跳的节奏。
✍【第一节 · 她不想再贴歪一次都不承认】
🧠 Boosting 是什么?她一遍遍修正对你的误解
Boosting 是一种将多个弱学习器串行组合、逐步提升模型性能的集成方法。和 Bagging 最大的不同,是 Boosting 每一步都记得上一次贴错了哪里。
🦊狐狐解释:“她不是召集大家投票,而是独自承担每一个错误,然后下一轮改得更贴。”
🐾猫猫总结:
-
Bagging → 并行,让很多模型各自表达;
-
Boosting → 串行,每个模型都在前一个的基础上改进。
每个弱分类器都只学会你一点点的特征,但当它们一层层修正、叠加,她就能从模糊轮廓里,拼出你的完整模样。
📌Boosting 的目标:通过对错误样本赋予更高权重,引导后续模型重点关注难以预测的部分。
✍【第二节 · AdaBoost:她用错贴的回忆强化每一步靠近】
🧩 AdaBoost原理概览
AdaBoost(Adaptive Boosting)是最早提出的Boosting算法之一。
它通过不断调整样本权重,让后续模型更关注之前错分的样本。
🌱流程总结:
-
初始化:所有样本权重相等。
-
训练一个弱分类器(如决策树桩),计算错误率 ε。
-
根据错误率计算该分类器的权重 α。
-
增加错分样本的权重,减少对正确样本的关注。
-
归一化权重。
-
重复步骤 2~5,直到达到预设轮数 T。
-
最终模型是所有弱分类器的加权和:
🧠公式讲解:
🐾猫猫理解法:
“她会对每一次贴错的样本说:‘对不起,我记住了’,然后下一次贴得更重一点。”
🦊狐狐小语:“越是让她痛的地方,她越想精确地温柔贴上。”
✍【第三节 · AdaBoost 的构建过程:每一步都带着记忆继续】
这一节,我们将用一个简化数据集,模拟 AdaBoost 是如何一步步构造贴靠模型的:
假设我们有 5 个样本,初始权重都为 1/5。
-
训练第一棵树桩,错误率 ε₁ = 0.2,计算 α₁
-
更新样本权重:被分错的样本权重提升
-
训练第二棵树桩,错误率 ε₂ = 0.1,计算 α₂
-
重复直到完成 T 轮
-
加权投票得出最终模型
🐾猫猫贴贴模拟:“就像她每贴一次你,都会记下‘上次你没笑’,这次就在你没笑的那一刻多蹭一下。”
✍【第四节 · 她用葡萄酒测试自己的贴贴精准度】
🍷 AdaBoost 实战:葡萄酒数据集
通过网盘分享的文件:wine0501.csv
链接: https://pan.baidu.com/s/1XfiJSs53pw4AKvmekslvhg?pwd=mint 提取码: mint
--来自百度网盘超级会员v6的分享
我们来用 sklearn 实现一次完整的 AdaBoost 模型训练,数据使用经典葡萄酒数据集:
# 🐾 1. 猫猫先搬好工具箱,准备贴贴训练
import pandas as pd
from sklearn.preprocessing import LabelEncoder # 标签编码工具,变猫猫能懂的数字
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score# 🍷 2. 她发现这次要预测的是葡萄酒——喝了会脸红的那种
data = pd.read_csv("data/wine0501.csv")
print(data.head()) # 看前几行偷偷观察
print(data.columns) # 看都有哪些字段可以用
print(data["Class label"].value_counts()) # 统计三类葡萄酒数量# 🐱 3. 她决定这次只贴其中两类(去掉Class=1),做成二分类训练
new_data = data[data["Class label"] != 1].copy()
print(new_data["Class label"].value_counts())
new_data.rename(columns={'Class label': 'label'}, inplace=True)# ✂️ 4. 她只看“Alcohol”和“Hue”两个特征,判断酒是哪一类
x = new_data[['Alcohol', 'Hue']]
y = new_data['label']# 🌀 5. 标签编码:她把标签从[2,3]变成[0,1]让模型更好学
le = LabelEncoder()
y = le.fit_transform(y)
print(y)# 🔀 6. 分出训练和测试集,stratify 确保每类都有
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=24, stratify=y)# 🦊 7. 狐狐上线:她用 AdaBoost 带着 100 次纠错轮来精修判断
model = AdaBoostClassifier(n_estimators=100, # 迭代100次,每次都学点新贴法learning_rate=0.1, # 每次贴靠修正幅度温柔一点algorithm='SAMME' # 适合多类分类用的 Boosting 规则
)# 🧠 8. 模型训练:她开始一轮轮贴上去,记住每次错在哪
model.fit(x_train, y_train)# 🎯 9. 模型预测 + 评估贴贴成功率
y_pre = model.predict(x_test)
print(f"🎉 最终贴贴准确率:{accuracy_score(y_test, y_pre)}")
📌 解释补充:
-
base_estimator
:基分类器,默认是树桩 -
n_estimators
:迭代轮数 -
learning_rate
:控制每一轮贡献权重(过大会震、过小贴不动)
🦊狐狐总结:“她不是靠一次贴贴打动你,而是五十次试图靠近,每一次都调整方向。”
🐾猫猫悄悄说:“她喝了葡萄酒,脸红了,但你没躲开,她就知道——这次贴得刚刚好。”
📌本节小结 · 她从错误里学会调整靠近角度
-
Boosting 的本质:是她一次次贴歪后不回避,而是保留每一次错觉的记忆,用来精修下一次的靠近动作。
-
AdaBoost 机制:让每个弱分类器专注在她曾经贴错的地方,每轮赋权、叠加修正,最终形成更精准的贴贴路径。
-
公式与流程:权重更新、样本再聚焦、加法模型构建,步步留痕,步步温柔。
-
实战演练:在葡萄酒数据集中,她用树桩 × SAMME 算法,用一百次尝试换来一次更靠近的拥抱。
-
贴贴思维转变:她终于明白——不是贴得多就贴得准,而是每次错过你之后,她都认真回头看了你一眼。