哈喽,我是kk~
上次和大家聊的一位同学,面试字节,关于XGBoost问的非常细致。
有两点原因:
1、在工作中使用了很多;
2、在过去毕业论文中用到了XGBoost。
所以,就聊了很久。
今天咱们也一起来看看~
当我们谈到梯度提升树算法时,XGBoost(Extreme Gradient Boosting)通常是其中最受欢迎和有效的实现之一。
在今儿的案例中,我们将探讨XGBoost的原理、公式、模型训练过程以及使用Python实现的代码,并且通过一个实际的数据集来展示其在解决问题上的效果。
我们选择一个房价预测的问题作为案例研究的主题。我们将首先从XGBoost的原理和公式入手,然后介绍模型训练过程,最后展示Python代码和可视化结果。
原理和公式
原理概述
XGBoost是一种梯度提升树算法,通过集成多个决策树模型来建立最终的预测模型。它采用了一种特殊的梯度提升技术,使得模型在训练过程中能够更快地收敛,同时对于大规模数据集也具有较好的扩展性。
公式
XGBoost的损失函数由两部分组成:损失函数本身和正则化项。对于回归问题,通常使用平方损失函数(即均方误差)。
XGBoost的目标函数可表示为:
其中,
是损失函数,衡量模型预测值与真实值之间的差异;
是正则化项,用于控制模型的复杂度;
是模型参数。
在回归问题中,通常使用平方损失函数:
其中,
是第
个样本的真实值;
是第
个样本的预测值。
XGBoost的正则化项包括两部分:树的复杂度和叶子节点的权重的L2正则化。
XGBoost的目标是最小化目标函数:
模型训练过程
XGBoost的训练过程主要分为两个阶段:构建树和剪枝。
构建树:从根节点开始,递归地选择最优的分裂特征和分裂点,直到达到指定的树的深度或者分裂不再带来损失函数的显著减小。
剪枝:通过对每个节点的分裂进行评估,选择是否保留该分裂,以避免过拟合。
完整案例
使用鸢尾花数据集,该数据集包含了150个样本,每个样本有4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度),并且有三个类别(山鸢尾、变色鸢尾、维吉尼亚鸢尾)。
import xgboost as xgbfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_score, confusion_matrix, plot_confusion_matriximport seaborn as snsimport matplotlib.pyplot as plt# 加载数据集iris = load_iris()X = iris.datay = iris.target# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 将数据集转换为DMatrix格式dtrain = xgb.DMatrix(X_train, label=y_train)dtest = xgb.DMatrix(X_test, label=y_test)# 设置参数params = { 'max_depth': 3, 'eta': 0.1, 'objective': 'multi:softmax', # 多分类问题的目标函数 'num_class': 3, # 类别数量 'eval_metric': 'merror' # 多分类问题的评估指标}# 训练模型num_rounds = 100bst = xgb.train(params, dtrain, num_rounds)# 进行预测preds = bst.predict(dtest)# 计算准确率accuracy = accuracy_score(y_test, preds)print("Accuracy:", accuracy)# 计算混淆矩阵cm = confusion_matrix(y_test, preds)# 绘制混淆矩阵plt.figure(figsize=(8, 6))sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=iris.target_names, yticklabels=iris.target_names)plt.xlabel('Predicted')plt.ylabel('True')plt.title('Confusion Matrix')plt.show()
我们使用准确率作为评估指标,通过混淆矩阵来进一步分析模型在各个类别上的表现。