Hi,我是Johngo~
这段时间很多人在聊一些基础类的算法模型。
今天咱们来分享一个比较热门的算法,XGBoost!!
今天的内容非常详细!如需要获取本文PDF的同学,记得文末去取~
XGBoost,全称为 eXtreme Gradient Boosting,是一种优化的分布式梯度提升库,设计用于高效、灵活和可移植的机器学习模型。
XGBoost的核心思想是基于梯度提升决策树(GBDT)的提升算法,通过逐步构建一系列弱学习器(通常是决策树),并将其组合成一个强学习器,从而提高预测性能。
2014年,陈天奇(Tianqi Chen)提出并开发。
主要目的是解决当时机器学习中存在的效率和性能问题。
XGBoost通过多种技术改进,实现了在速度和性能上的显著提升,包括:
XGBoost的详细介绍和技术实现最早发表在2016年的一篇题为“XGBoost: A Scalable Tree Boosting System”的论文中。论文作者包括陈天奇(Tianqi Chen)和卡洛斯·格斯特林(Carlos Guestrin)。
论文引用
该论文发表在KDD 2016(Knowledge Discovery and Data Mining)的会议上,是机器学习和数据挖掘领域非常重要的一次会议。
论文的完整引用:
Chen, T., & Guestrin, C. (2016). XGBoost: A Scalable Tree Boosting System. Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD '16), 785–794. DOI: https://dl.acm.org/doi/10.1145/2939672.2939785
这篇论文详细描述了XGBoost的算法设计、技术实现以及在多种实际数据集上的应用效果。
XGBoost 数学原理
XGBoost 通过集成多个弱学习器(通常是决策树)来构建一个强大的预测模型。
梯度提升基本思想
梯度提升是一种集成学习方法,通过迭代地训练多个弱学习器,并将它们的预测结果进行加权求和来构建一个强学习器。每一轮的训练目的是减小前一轮预测的残差。
假设我们有一个训练数据集
,其中
是输入特征,
是目标值。我们的目标是学习一个模型
,使得预测值
尽可能接近真实值
。
在梯度提升框架下,第
轮的模型
是在前
轮模型的基础上加上一个新的弱学习器
:
为了优化模型,我们最小化损失函数
,例如平方误差:
XGBoost 目标函数
XGBoost扩展了基本的梯度提升算法,其优化目标由以下两部分组成:
,用于控制模型的复杂度
目标函数形式如下:
其中,正则化项
通常定义为:
这里,
是树的叶子节点数,
是叶子节点的权重,
和
是正则化参数。
二阶泰勒展开
为了有效地优化目标函数,XGBoost使用二阶泰勒展开近似损失函数。假设在第 轮中,我们的预测值为 \hat{y}i^{(t)} = F{t-1}(x_i) + h_t(x_i) 。目标函数可以写成:
使用泰勒展开,可以将损失函数展开为:
其中:
目标函数变为:
对于每一棵树,叶子节点的预测值为常数
,树的结构为
,表示样本
所属的叶子节点。
因此,模型可以表示为:
将其代入目标函数,并对每个叶子节点求和:
通过求导,可以得到每个叶子节点的最佳权重:
将最佳权重代入目标函数,得到优化后的目标函数:
树的构建
加入模型。
:
。
和
。
整体可以看到,XGBoost通过一系列技术改进,如正则化项、二阶导数的使用、并行计算等,实现了在计算效率和预测性能上的显著提升。这些特点使得XGBoost在许多机器学习竞赛和实际应用中表现出色。
XGBoost 适用问题
XGBoost适用于许多类型的机器学习问题,尤其在分类和回归任务中表现优异。
XGBoost 优缺点
优点:
缺点:
下面,咱们使用加利福尼亚房价数据集(California Housing Dataset)来演示XGBoost进行回归分析的完整流程。
整个流程,包括数据加载、预处理、模型训练、预测、可视化和算法优化~
安装必要的库
pip install xgboost scikit-learn matplotlib seaborn pandas
导入后面需要库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import mean_squared_error, r2_score
import xgboost as xgb
加载和准备数据
# 加载加利福尼亚房价数据集
california = fetch_california_housing()
X = pd.DataFrame(california.data, columns=california.feature_names)
y = pd.Series(california.target, name='MedHouseVal')
# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print(X_train.shape, X_test.shape)
模型训练
# 创建 DMatrix 数据结构
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
# 设置参数
params = {
'objective': 'reg:squarederror',
'max_depth': 4,
'eta': 0.1,
'subsample': 0.8,
'colsample_bytree': 0.8,
'seed': 42
}
# 训练模型
model = xgb.train(params, dtrain, num_boost_round=100)
# 预测
y_pred = model.predict(dtest)
性能评估
# 评估模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse}')
print(f'R^2 Score: {r2}')
可视化展现
# 可视化真实值和预测值
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.7)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linestyle='--')
plt.xlabel('Actual MedHouseVal')
plt.ylabel('Predicted MedHouseVal')
plt.title('Actual vs Predicted MedHouseVal')
plt.show()
# 特征重要性
xgb.plot_importance(model)
plt.title('Feature Importance')
plt.show()
模型优化
# 使用 GridSearchCV 进行参数调优
param_grid = {
'max_depth': [3, 4, 5],
'eta': [0.01, 0.1, 0.2],
'subsample': [0.6, 0.8, 1.0],
'colsample_bytree': [0.6, 0.8, 1.0]
}
grid_search = GridSearchCV(estimator=xgb.XGBRegressor(objective='reg:squarederror', seed=42),
param_grid=param_grid,
scoring='neg_mean_squared_error',
cv=3,
verbose=1)
grid_search.fit(X_train, y_train)
print(f'Best parameters found: {grid_search.best_params_}')
# 使用最佳参数训练模型
best_params = grid_search.best_params_
model_optimized = xgb.train(best_params, dtrain, num_boost_round=100)
# 预测
y_pred_optimized = model_optimized.predict(dtest)
# 评估优化后的模型性能
mse_optimized = mean_squared_error(y_test, y_pred_optimized)
r2_optimized = r2_score(y_test, y_pred_optimized)
print(f'Optimized Mean Squared Error: {mse_optimized}')
print(f'Optimized R^2 Score: {r2_optimized}')
整个的代码展示了一个使用加利福尼亚房价数据集进行XGBoost回归分析的完整流程。
通过GridSearchCV进行超参数调优,可以进一步提升模型的性能。可视化部分包括实际值和预测值的散点图,以及特征重要性图,可以帮助大家更好地理解模型的表现和特征的重要性。