讨论 XGBoost,太激烈了。。

文摘   2024-10-08 18:39   北京  

哈喽,我是kk~

今儿看到大家在讨论XGBoost的内容,顺便也给大家总结一番~

XGBoost(eXtreme Gradient Boosting)是当前非常流行的一种机器学习算法,主要用于结构化数据的分类、回归等任务。它的核心思想是基于梯度提升决策树(Gradient Boosted Decision Trees, GBDT)的改进,提升了模型的性能和训练速度。

下面,我们从细节到案例,详细和大家聊聊~

1. XGBoost 基本概念

Boosting的核心思想

Boosting是一种集成学习方法,它通过组合多个弱学习器来提升整体的预测能力。具体来说,Boosting的训练过程是一个逐步构建模型的过程,每一个新的弱学习器都会尽量纠正之前模型的错误。

梯度提升的思想

梯度提升是Boosting方法的具体实现之一,它通过每次拟合前一轮误差的负梯度,逐步逼近目标函数。在梯度提升的框架下,每棵新树都是对前一棵树的误差进行拟合。

XGBoost的特点

  • 提出了正则化项,用于控制模型的复杂度,防止过拟合。
  • 支持并行计算,优化了树的构建效率。
  • 支持稀疏数据和缺失值处理。
  • 通过学习率、子采样等技术增加了灵活性。

2. XGBoost的损失函数

XGBoost的目标是最小化带正则化的目标函数。对于一组输入数据 ,模型的输出可以表示为 ,其中  是模型中的第  棵树的预测值,K是总的树数。

XGBoost的目标函数可以写成:

其中:

  •  是损失函数,衡量真实值  与预测值  之间的差异,比如平方误差 
  •  是正则化项,用于控制树的复杂度。 表示树的叶子数, 表示叶子的权重,   是超参数。

正则化项的作用是防止模型过于复杂而导致过拟合。

3. 二阶泰勒展开与优化

在梯度提升的框架下,第  轮的预测值为 ,那么这一轮我们需要拟合的模型是:

为了使得损失函数最小化,我们将目标函数展开到二阶,即使用泰勒展开近似目标函数:

其中:

  •  是一阶导数(即梯度)。
  •  是二阶导数(即Hessian矩阵的对角线元素)。

通过这个二阶泰勒展开公式,XGBoost将每一轮优化问题转化为了对弱学习器的拟合,即使得新树的预测能够尽可能匹配梯度。

4. XGBoost中的树构建过程

每一棵树的构建是为了最小化上述的目标函数。假设我们要构建一棵树,树的每个叶子节点都有一个权重 ,那么第  个叶子的输出为 ,对应的目标函数可以写为:

对于每一个节点的权重 ,我们可以通过最小化上式来得到最优解:

其中, 是落入叶子  的样本的索引集合。我们发现,节点权重  是通过负梯度(误差)的总和除以Hessian和正则化项决定的。

最终,最优的损失函数值为:

这意味着,在构建树的过程中,我们希望通过分裂节点使得损失函数减少最多,即寻找每一个分裂点时,目标是最大化损失减少量。

5. 分裂点的选择

对于每一个分裂点,XGBoost使用上面推导的损失函数最优值来衡量每个分裂的好坏。具体地,对于某一特征的某个分裂点 ,XGBoost会计算分裂前后的增益(即损失的减少量):

其中:

  •    分别是分裂后左子节点和右子节点中的样本索引集合。
  •  是正则化项,用于控制过拟合。

通过遍历每个特征的每个可能的分裂点,XGBoost选择能最大化增益的分裂点。

6. 正则化与防止过拟合

XGBoost通过以下几个方面来防止过拟合:

  1. 正则化项:在损失函数中加入叶子节点数  和叶子节点权重平方的正则化项   ,使得模型不会过于复杂。
  2. 子采样:XGBoost支持对训练样本和特征进行子采样,从而减少模型的方差,提升模型的泛化能力。
  3. 学习率(shrinkage):每棵树的权重会乘以一个学习率 ,通过逐步调整模型,减少过拟合的风险。

总的来说,XGBoost基于GBDT进行了多方面的优化,主要体现在以下几个方面:

  • 使用二阶导数进行优化,提升了模型的收敛速度。
  • 引入正则化项,有效防止过拟合。
  • 支持并行计算和稀疏数据处理,提升了训练速度。

完整案例

下面是一个关于「XGBoost」的完整实际案例的详细实现~

我们将使用一个虚拟数据集,数据集中有1000个样本,10个特征和一个二元分类目标变量。这个案例展示如何通过XGBoost来预测目标变量,并生成多个数据分析图形。

步骤

  1. 生成虚拟数据集
  2. XGBoost模型训练
  3. 模型评估与分析
  4. 数据可视化:复杂且鲜艳的图形

1. 生成虚拟数据集

首先,我们使用make_classification函数生成一个虚拟的二元分类数据集。每个样本有10个特征,其中2个是重要特征,8个是冗余特征。

2. 模型训练

使用XGBoost对数据进行训练,进行超参数调整和模型评估。

3. 模型评估与分析

通过混淆矩阵、AUC-ROC曲线等评价模型的分类性能。

4. 数据可视化

生成复杂的图形,如特征重要性可视化、混淆矩阵和AUC-ROC曲线。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score, confusion_matrix, roc_auc_score, roc_curve
import xgboost as xgb
from xgboost import plot_importance
from matplotlib.colors import ListedColormap

# 1. 生成虚拟数据集
X, y = make_classification(n_samples=1000, n_features=10, n_informative=2, n_redundant=8, n_classes=2, random_state=42)

# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 2. XGBoost 模型训练
xgb_model = xgb.XGBClassifier(objective="binary:logistic", eval_metric="logloss", use_label_encoder=False)

# 定义超参数网格进行搜索
param_grid = {
    'max_depth': [345],
    'learning_rate': [0.010.10.2],
    'n_estimators': [100200300],
    'subsample': [0.81.0],
    'colsample_bytree': [0.81.0],
    'gamma': [00.10.2],
    'reg_alpha': [00.10.5],
    'reg_lambda': [11.5]
}

# 网格搜索寻找最佳超参数组合
grid_search = GridSearchCV(estimator=xgb_model, param_grid=param_grid, cv=3, scoring='accuracy', verbose=1)
grid_search.fit(X_train, y_train)

# 打印最佳参数
print(f"Best Parameters: {grid_search.best_params_}")

# 使用最佳参数训练XGBoost模型
best_xgb_model = grid_search.best_estimator_

# 模型预测
y_pred = best_xgb_model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

# 计算AUC-ROC
y_pred_proba = best_xgb_model.predict_proba(X_test)[:, 1]
roc_auc = roc_auc_score(y_test, y_pred_proba)
print(f"AUC-ROC: {roc_auc}")

# 3. 模型评估与分析

# 混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
print(f"Confusion Matrix:\n{conf_matrix}")

# 4. 数据可视化

# 设置图像风格
sns.set(style="whitegrid")

# (1) 绘制混淆矩阵的热力图
plt.figure(figsize=(86))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='coolwarm', cbar=False, annot_kws={"size"16})
plt.title('Confusion Matrix', fontsize=18)
plt.xlabel('Predicted', fontsize=14)
plt.ylabel('Actual', fontsize=14)
plt.show()

# (2) 绘制AUC-ROC曲线
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
plt.figure(figsize=(86))
plt.plot(fpr, tpr, color='orange', label=f'AUC = {roc_auc:.2f}', lw=2)
plt.plot([01], [01], color='navy', linestyle='--')
plt.fill_between(fpr, tpr, alpha=0.3, color='orange')
plt.xlim([0.01.0])
plt.ylim([0.01.05])
plt.xlabel('False Positive Rate', fontsize=14)
plt.ylabel('True Positive Rate', fontsize=14)
plt.title('Receiver Operating Characteristic (ROC) Curve', fontsize=18)
plt.legend(loc="lower right", fontsize=12)
plt.grid(True)
plt.show()

# (3) 特征重要性可视化
plt.figure(figsize=(108))
plot_importance(best_xgb_model, max_num_features=10, height=0.8, importance_type='weight', show_values=False, grid=False)
plt.title('Top 10 Feature Importance', fontsize=18)
plt.show()

混淆矩阵:展示模型的分类结果,图中显示了模型预测的正负类数目。

AUC-ROC曲线:用于显示分类器的性能,曲线下面积(AUC)是重要指标。

特征重要性:展示了模型中最重要的特征,帮助我们了解哪些特征对模型影响最大。

混淆矩阵的热力图

混淆矩阵用颜色表示分类结果的数量,颜色越深表示数量越大。模型的混淆矩阵反映了它对不同类别的预测效果。以下是代码生成的示例:

Predicted Negative: 137
Predicted Positive: 163
Actual Negative: 136
Actual Positive: 138

AUC-ROC曲线

AUC-ROC曲线的斜率反映了模型对正类的识别能力,面积越大表示模型的分类效果越好。通过此图,我们可以观察到模型的性能,AUC值为0.9以上时,模型表现优秀。

特征重要性

特征重要性图形用条形图表示每个特征在模型中的重要程度,帮助我们识别对模型影响最大的特征。


kk机器学习算法
机器学习基础、计算机视觉…
 最新文章