XGBoost作为一个非常牛逼的算法模型,大家一定要非常清楚其原理。
XGBoost 特别擅长解决结构化数据问题,比如表格数据。它的全称是「eXtreme Gradient Boosting」,意思是「极限梯度提升」。听起来有点复杂,其实用通俗的语言解释,它就是一种让模型一步步变得更聪明的算法。
下面我们一步步来看看它的思路~
1. 什么是「梯度提升」?
想象我们要训练一个模型来预测房价。我们一开始用一个很简单的模型,它可能只会做一些粗略的预测,误差会很大。然后我们让第二个模型来专门学习第一个模型的错误,想办法减少这个误差。接着,第三个模型再学习前两个模型的误差……每一步都「纠正」前面的错误,让模型不断「提升」。这种逐步提高模型的方式就叫「梯度提升」。
2. XGBoost 是一种「强化」版的梯度提升
XGBoost 是梯度提升的一个升级版,在很多细节上做了优化,让它训练更快、效果更好。比如,它会使用一种叫做「并行计算」的技术,让计算机同时进行多个计算,大大加速了训练速度。还有一些优化的数学技巧,可以让它在不损失准确性的前提下更快地找到答案。
举个easy案例:预测房价
假设我们在某个城市的房产数据上训练 XGBoost 模型来预测房价。数据包括房子的面积、房间数、建造年份等特征。具体步骤如下:
-
初始化模型:XGBoost 一开始会用一个非常简单的预测方式,比如预测每个房子价格的平均值。这种预测通常误差很大。
-
计算误差:接着,模型会检查哪里预测得不准,比如有些房子的价格预测得偏高,有些偏低。
-
学习误差:然后,XGBoost 会生成一个「决策树」,专门用来预测这些误差。决策树就像一张分支图,它会根据数据特征一步步地把房子分类,比如先按照面积大小分,再按照房间数量分,直到找到价格的规律。这个新的决策树就会「修正」第一个模型的误差。
-
重复多次:再接着,XGBoost 会不断创建更多的树,每棵树都是为了修正之前树的误差。每次生成新的树,模型的预测都会更准确一点。最终,把所有树的预测加起来就会得到一个很不错的结果。
XGBoost 的一些特点
-
速度快:它计算效率很高,尤其适合大数据。
-
准确性高:XGBoost 在比赛和实际应用中常常表现优异,因为它在训练过程中逐步减少误差。
-
可以防止过拟合:XGBoost 有一些机制可以防止模型过度拟合,比如设置最大深度、学习率等参数。
总的来说,XGBoost 就像一个由很多「小树」组成的团队,这些小树各自负责一部分任务,彼此互相纠正错误,最终得出一个更加准确的预测。对于大部分表格数据问题,比如预测价格、用户行为等,XGBoost 都是一个表现很好的选择。
下面,我们通过详细的原理解释和案例,让大家更加深入的理解XGBoost。
公式推导
1. 树模型和损失函数
XGBoost 的目标是利用决策树集合来预测一个目标变量。假设我们有一个数据集 ,其中 是特征, 是目标值。模型的预测值可以表示为各棵树的加权和:
其中, 表示第 棵树的结构。每棵树 会将数据分到不同的叶子节点,每个叶子节点有一个得分值。
我们的目标是找到一组树,使得预测值与真实值的误差最小。因此,我们定义一个损失函数来度量误差,通常可以用均方误差或其他误差函数。对于均方误差的情形,损失函数可以写作:
2. 二阶泰勒展开
XGBoost 通过迭代地优化损失函数来训练每棵树。在每一轮中,我们新增一个树 ,希望能最小化损失。使用泰勒展开,损失函数可以近似写作:
其中 是一阶导数, 是二阶导数。通过最小化这个近似的损失函数,我们能更高效地找到最优解。
3. 叶子节点的得分
对于每个叶子节点,我们可以计算一个最优权重,以此来降低误差。假设叶子节点集合为 ,则第 个叶子节点的最优权重为:
其中, 是正则化参数,用于控制模型的复杂度,防止过拟合。
完整案例
-
生成虚拟数据:包含房屋面积、房间数量、建造年份等特征。
-
使用 XGBoost 模型训练:预测房价。
-
数据可视化:绘制数据分布、模型训练过程的损失变化、特征重要性、预测效果等图表。
代码实现
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error from xgboost import XGBRegressor, plot_importance import xgboost as xgb # 生成虚拟数据集 np.random.seed(42) n_samples = 5000 area = np.random.normal(1500, 500, n_samples) # 房屋面积 rooms = np.random.randint(2, 7, n_samples) # 房间数量 age = np.random.randint(1, 30, n_samples) # 建造年份 location_score = np.random.uniform(1, 10, n_samples) # 位置评分 # 假设真实的房价与这些特征的线性关系,再加入噪声 price = 5000 + 0.3 * area + 10000 * rooms - 150 * age + 5000 * location_score + np.random.normal(0, 10000, n_samples) # 创建 DataFrame data = pd.DataFrame({ 'Area': area, 'Rooms': rooms, 'Age': age, 'Location_Score': location_score, 'Price': price }) # 数据分为训练集和测试集 X = data[['Area', 'Rooms', 'Age', 'Location_Score']] y = data['Price'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 定义和训练 XGBoost 回归模型,添加 eval_set 参数 eval_set = [(X_train, y_train), (X_test, y_test)] model = XGBRegressor(objective='reg:squarederror', max_depth=4, learning_rate=0.1, n_estimators=100, random_state=42) model.fit(X_train, y_train, eval_set=eval_set, eval_metric="rmse", verbose=False) # 预测结果 y_pred = model.predict(X_test) rmse = np.sqrt(mean_squared_error(y_test, y_pred)) # Data Distribution plt.figure(figsize=(10, 6)) sns.scatterplot(x='Area', y='Price', hue='Rooms', size='Location_Score', sizes=(20, 200), data=data, palette="viridis") plt.title("Relationship between Area and Price (by Room Count and Location Score)") plt.xlabel("Area (Square Feet)") plt.ylabel("Price") plt.legend(title="Room Count & Location Score", loc="upper left", bbox_to_anchor=(1, 1)) plt.show() # Loss Change during Training results = model.evals_result() epochs = len(results['validation_0']['rmse']) x_axis = range(0, epochs) plt.figure(figsize=(10, 6)) plt.plot(x_axis, results['validation_0']['rmse'], label='Train') plt.plot(x_axis, results['validation_1']['rmse'], label='Test') plt.title("RMSE during XGBoost Training") plt.xlabel("Epoch") plt.ylabel("RMSE") plt.legend() plt.show() # Feature Importance plt.figure(figsize=(10, 6)) plot_importance(model, importance_type='weight', title='Feature Importance (Based on Frequency of Use)') plt.show() # Actual vs Predicted Values plt.figure(figsize=(10, 6)) plt.scatter(y_test, y_pred, c='red', marker='o', edgecolor='k', alpha=0.6) plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2) plt.title("Actual vs Predicted Prices") plt.xlabel("Actual Price") plt.ylabel("Predicted Price") plt.show() # Output RMSE print(f"Test RMSE: {rmse:.2f}")
图表1:房屋面积和价格的关系:这是特征的基本分布图。横轴表示面积,纵轴表示价格,颜色代表房间数量,大小代表位置评分。我们可以从中看到一些特征间的相关性,比如面积越大、房间越多,价格也越高。
图表2:训练过程中的损失变化(RMSE):这个图展示了模型在训练过程中 RMSE 的变化趋势。通过观察曲线的下降速度,我们可以评估模型收敛的情况。如果曲线平稳,说明模型训练得较好;如果曲线过早停止下降,可能需要调整参数。
图表3:特征重要性:这是 XGBoost 自动计算的特征重要性。每个特征的重要性由其在模型中出现的频率决定。重要性高的特征对预测结果影响更大。我们可以看到哪些特征对房价预测的贡献最大,比如「面积」和「房间数量」。
图表4:真实值 vs 预测值:该图展示了测试集的真实房价和模型预测的房价的关系。理想情况下,所有点应落在对角线附近。点越靠近对角线,说明模型的预测越准确。散布较远的点说明模型误差较大。
整个过程,咱们展示了 XGBoost 如何预测房价,并且用多个图表展示了数据和模型训练的细节。这些图表有助于大家很好的理解数据特征、训练过程和模型的表现。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。