基于xgboost的分类预测

一、xgboost的介绍

xgboost以及后续的lightGBM等在我的认知中算是目前数据挖掘中最常用的预测算法,在各种数据挖掘比赛中获得了Top的名次。如果想从事数据挖掘相关的岗位,该算法是一定要好好掌握的。

xgboost其实可以认为是GBDT算法的工程实现,GBDT的全名是Gradient Boosting Decision Tree,就是梯度提升树。该算法的逻辑是:首先训练一颗树,然后计算出每个样本的误差(也叫梯度),通过去拟合误差训练下一颗树,一直拟合直到训练结果符合要求。下图是GBDT算法的步骤图。

xgboost虽然大家都说是GBDT的工程实现,但是在很多地方都是做了不少优化的:

1、目标函数的二阶泰勒展开

xgboost与GBDT都是每一步都只优化当前模型,然后将所有模型加起来:

F_m(x_i)=F_{m-1}(x_i)+f_m(x_i)

目标函数为:

Obj=\sum_{i=1}^n L[F_m(x_i),y_i]+\sum_{j=1}^m {\Omega} (f_j)

其中𝐿为损失函数,  $F_m(x_i)$  是所有树的累加结果。  ${\Omega} (f_j)$  是每棵树的正则项(xgb引入了正则项,因此目标函数加上了结构化风险)。


与GBDT的一阶不同,xgboost采用了二阶展开,这其实就是优化算法的改进,同时拟合一阶误差和二阶误差有利于提升精度。
二阶展开:


$f(x_0+\Delta x)\approx f(x_0)+f'(x_0)\Delta x+\frac{f''(x_0)}{2}\Delta(\Delta x)^2$

其中可以将  $F_{m-1}(x_i)$  的结果视为 $x_0$$f_m(x_i)$  视为  $\Delta x$, $L(\widehat y_i,y_i)$ 为 $\widehat y_i$ 的函数。我们将 $F_m$   展开,重新得到我们的目标函数:

Obj=\sum_{i=1}^N[L[F_{m-1}(x_i),y_i]+\frac{\partial L}{\partial F_{m-1}(x_i )}f_m(x_i)]+\frac{1}{2}\frac{\partial^2 L}{\partial^2 F_{m-1}(x_i )}f^2_m(x_i)]+\sum_{j=1}^m {\Omega} (f_j)

在每次更新的时候,前𝑚−1个模型已经是确定了的,因此上面的式子中只有  $f_m(x_i)$  是未知的(其实也就是我们即将生成的𝑚棵树)。我们将常数部分稍微处理以下:

$Obj=\sum_{i=1}^N[g_if_m(x_i)+\frac{1}{2}h_if_m^2(x_i)]+\Omega (f_m)$

其中:


g_i=\frac{\partial L}{\partial F_m-1(x_i)},h_i=\frac{\partial^2 L}{\partial^2 F_m-1(x_i)}

也就是每个样本的前𝑚−1棵树与最终结果之间的一阶导数和二阶导数。在第𝑚−1树已经确定了的情况下,是很容易计算出来的。


### XGBoost 在集成学习中的原理 XGBoost 是一种基于梯度提升(Gradient Boosting)框架的高效集成学习算法。它的核心思想是通过组合多个弱学习器(通常为决策树),逐步优化目标函数,从而构建出一个强学习器[^1]。XGBoost 的独特之处在于其对传统梯度提升方法进行了多项改进: - **正则化项**:相比于普通的 GBDT,XGBoost 显式地加入了一个正则化项,用于控制模型复杂度并防止过拟合。这有助于提高模型的泛化能力[^4]。 - **二阶泰勒展开**:XGBoost 对损失函数进行二阶泰勒展开,在每一步迭代中不仅利用了一阶导数信息,还充分利用了二阶导数的信息,从而使优化过程更加精确和快速[^4]。 - **灵活的基学习器选择**:虽然传统的 GBDT 只能使用 CART 作为基分类器,但 XGBoost 支持多种类型的基学习器,例如线性分类器,这使其适用于更广泛的场景[^4]。 --- ### XGBoost 的应用 #### 应用领域 XGBoost 已经成为许多数据挖掘竞赛和工业界项目的首选工具之一,尤其是在以下领域表现出色: - **分类任务**:如信用评分、垃圾邮件检测等; - **回归任务**:如房价预测、销量预测等; - **排名任务**:如搜索引擎结果排序、推荐系统中的物品排序等[^3]。 #### 参数调优 为了充分发挥 XGBoost 的潜力,合理设置超参数至关重要。以下是几个关键参数及其作用: - `n_estimators`:表示弱学习器的数量,即 boosting 迭代次数。增加此值可能会改善模型性能,但也可能导致过拟合。 - `learning_rate`:也叫步长或收缩率,用来缩小每棵树的影响程度,从而增强模型稳定性[^1]。 - `max_depth`:限定单棵决策树的最大深度,较大的值可能带来更高的训练精度,却容易引发过拟合问题[^1]。 - `subsample` 和 `colsample_bytree`:分别对应于样本采样比例与列采样的比例,类似于随机森林的做法,可有效降低过拟合风险。 --- ### 示例代码 下面是一个简单的 Python 实现示例,展示如何使用 XGBoost 来完成一项二元分类任务: ```python import xgboost as xgb from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 创建模拟数据集 X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=7) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7) # 将数据转换为 DMatrix 格式 dtrain = xgb.DMatrix(X_train, label=y_train) dtest = xgb.DMatrix(X_test, label=y_test) # 设置参数 params = { 'objective': 'binary:logistic', # 定义损失函数 'eval_metric': 'error', 'eta': 0.1, # 学习速率 'max_depth': 6 # 决策树最大深度 } # 训练模型 bst = xgb.train(params=params, dtrain=dtrain, num_boost_round=100) # 测试模型 preds = bst.predict(dtest) predictions = [round(value) for value in preds] # 输出准确率 accuracy = accuracy_score(y_test, predictions) print(f'Accuracy: {accuracy * 100:.2f}%') ``` --- ### 总结 XGBoost 结合了高效的计算能力和强大的理论基础,已成为当前最流行的集成学习算法之一。无论是学术研究还是实际工程项目,它都能提供卓越的性能表现。然而,值得注意的是,尽管 XGBoost 提供了许多内置功能来简化建模流程,但仍需谨慎调整各项参数以适应特定业务需求[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值