细说机器学习算法之XGBoost及代码实现

系列文章目录

第一章:Pyhton机器学习算法之KNN

第二章:Pyhton机器学习算法之K—Means

第三章:Pyhton机器学习算法之随机森林

第四章:Pyhton机器学习算法之线性回归

第五章:Pyhton机器学习算法之有监督学习与无监督学习

第六章:Pyhton机器学习算法之朴素贝叶斯

第七章:Pyhton机器学习算法之XGBoost



前言

XGBoost(Extreme Gradient Boosting)是一个高效的、基于梯度提升框架的机器学习算法。它在许多机器学习竞赛中取得了优异的表现,因此广泛应用于分类、回归以及排序等任务中。XGBoost 的核心思想是通过“提升”(boosting)方式将多个简单模型(通常是决策树)结合成一个强大的模型,进而提高预测准确度。以下是对XGBoost的详细介绍:


一、基本概念:

XGBoost,全称为eXtreme Gradient Boosting,是一个可扩展的、分布式的梯度提升决策树(GBDT)机器学习库。它提供并行树提升,并且是用于回归、分类和排序问题的领先机器学习库。

XGBoost作为梯度提升算法(Gradient Boosting Algorithm)的改进版本,本身是一个集成学习方法,旨在通过将多个弱分类器(通常是决策树)逐步组合成一个强分类器来进行预测。XGBoost 通过优化目标函数、改进计算效率和防止过拟合等方式,显著提升了梯度提升方法的表现。

二、基本原理:

XGBoost的原理基于梯度提升算法,它通过迭代地添加预测树,每棵树都尝试纠正前一棵树的错误。XGBoost的核心思想是通过加速树的构建过程,减少计算时间,避免过拟合,并提高模型的准确性。在损失函数的优化中,XGBoost使用了二阶泰勒展开,这使得算法在处理非线性问题时更加精确。同时,为了防止过拟合,XGBoost在目标函数中加入了正则项,以控制模型的复杂度。

以下是 XGBoost 的一些关键特性:

1.目标函数:

XGBoost 通过最小化目标函数来训练模型,目标函数通常包括两部分:损失函数和正则化项。

  • 损失函数:用于衡量模型预测的误差

  • 正则化项:用于控制模型复杂度,避免过拟合

假设训练数据为 {(xi,yi)}(其中xi为特征, yi是目标变量),模型预测为 y^i,XGBoost 的目标函数可以表示为:

                      

其中:l(yi,y^i)是损失函数,通常使用平方误差(MSE)或者对数损失(log loss)

对于回归任务,损失函数为:

对于分类任务,损失函数可以为:

Ω(fk)是正则化项,用于控制模型的复杂度,防止过拟合,即对于每棵树fk ,正则化项通常包括树的叶子节点数和叶子节点的权重:

其中 T 是树的叶子数, γ是控制树复杂度的参数, λ是控制权重大小的参数, wj是第 j个叶子的权重。

2.模型原理:

XGBoost 是基于加法模型的,每一次迭代都会生成一个新的模型(树),并将其与现有模型的预测结果结合。

具体来说,假设当前模型为 fm(x),第 m 次迭代中拟合的树为hm(x) ,最终的预测模型为:

                          

其中,αm是学习率(步长),其控制每棵树的影响力。

3.二阶梯度优化:

XGBoost 的一个关键创新是在训练过程中使用了二阶梯度信息(即Hessian矩阵),而传统的 GBDT 通常只使用一阶梯度。

通过引入二阶梯度,XGBoost 能够进行更精确的优化,加速模型的收敛。

具体来说,XGBoost 的损失函数在每次迭代时采用泰勒展开(二阶近似)来简化优化过程。

设当前模型为 ,Ft-1(x)损失函数  l(yi,F(xi))关于当前预测值的梯度分别为一阶导数 gi和二阶导数 hi,那么在第 t 轮迭代中,XGBoost 的目标是最小化以下二阶近似的损失函数:

                      

通过使用二阶梯度,XGBoost 能够更精确地捕捉损失函数的曲率,提高优化效率。

4.树的构建和增益:

XGBoost 在构建树时,通过优化分裂点的增益来选择最优的分裂。树的分裂增益定义为:

其中:

  • GL 和  GR分别是左子树和右子树的梯度和。

  • HL 和  HR分别是左子树和右子树的 Hessian 和。

  • G 和 H 是当前节点的梯度和 Hessian。

通过计算增益,XGBoost 可以在每个节点选择最优的分裂特征,最大化模型的分辨能力。

三、避免过拟合:

XGBoost作为由多个弱分类器(决策树)所组成的强分类器,依旧需要剪枝来优化,通常采用后剪枝。传统的 GBDT 通常通过深度控制来避免树过深,但 XGBoost 通过构建完整的树后,才进行剪枝操作,去除一些无效的分支,从而减少模型复杂度,提高泛化能力。

四、特点与优势:

  1. 高效性:XGBoost能够利用多核处理器进行并行计算,加速模型训练过程。同时,它使用了剪枝技术来减小树的规模,降低模型的复杂度,提高泛化能力。
  2. 准确性:由于XGBoost在损失函数的优化中使用了二阶泰勒展开,并加入了正则化项,因此它能够取得更高的预测准确性。
  3. 灵活性:XGBoost支持多种类型的损失函数,可以用于回归、分类、排序等多种问题。同时,它还支持特征维度的并行处理,提高了算法的训练效率。
  4. 鲁棒性:XGBoost对缺失值有较好的处理能力,能够自动学习最优的分裂点来处理缺失数据。此外,它还能够通过调整参数来控制模型的复杂度,以防止过拟合。

五、代码实战:

#导入所需的库
from sklearn.datasets import load_iris
from xgboost.sklearn import XGBClassifier
from xgboost import plot_importance
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np
# 加载鸢尾花数据集
iris = load_iris()
x, y = iris.data, iris.target
# 数据集分割
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=12345)
# 创建XGBoost模型
clf = XGBClassifier(booster='gbtree', #给定模型求解方式 可选参数gbtree、gblinear、dart
                    objective='multi:softmax',  #设置 XGBoost 使用softmax目标函数做多分类,需要设置参数num_class(类别个数)('objective': 'binary:logistic', 二分类问题)('objective': 'reg:squarederror',  回归任务(均方误差))
                    num_class=3,
                    gamma=0.1,   #指定节点分裂所需的最小损失函数下降值
                    max_depth=6,  #最大树深
                    reg_lambda=2, # 权重的L2正则化项。(和Ridge regression类似)。这个参数是用来控制XGBoost的正则化部分的。这个参数在减少过拟合上很有帮助。
                    subsample=0.7, #对于每棵树,随机采样的比例。减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。
                    colsample_bytree=0.7, #控制每棵随机采样的列数的占比(每一列是一个特征)
                    min_child_weight=3, #用于控制子节点中样本的最小权重和
                    eta=0.1,  #每一步迭代的步长
                    seed=1000,
                    nthread=4,  #使用的线程数
                    eval_metric=['mlogloss','merror'], #设置 XGBoost 使用softmax目标函数做多分类,需要设置参数num_class(类别个数)
                    #   n_estimators=10 #弱分类器的数量
                    #   learning_rate=0.3 #学习率
                    #   reg_alpha=0  #L1正则化权重项,增加此值将使模型更加保守
                   )




clf=clf.fit(x_train,y_train)


# 输出准确率
y_pred = clf.predict(x_test)
accuracy = accuracy_score(y_test, y_pred)
print('accuracy:%.2f%%'%(accuracy*100))
 

绘制损失曲线:

# 创建训练和测试数据集评估
evals = [(x_train, y_train), (x_test, y_test)]
# 训练模型并记录每一轮的评估指标
history=clf.fit(x_train, y_train,eval_set=evals,verbose=True)


# 获取训练过程中的 loss 和 accuracy 曲线
eval_result = clf.evals_result()
train_merror = eval_result['validation_0']['merror']
test_merror = eval_result['validation_1']['merror']
train_mlogloss = eval_result['validation_0']['mlogloss']
test_mlogloss = eval_result['validation_1']['mlogloss']


plt.figure(figsize=(12,6))
# 绘制损失曲线
plt.subplot(1, 2, 1)
plt.plot(range(len(train_mlogloss)), train_mlogloss, label='Train mlogloss', color='#F7A8B8')
plt.plot(range(len(test_mlogloss)), test_mlogloss, label='Test mlogloss', color='#A1E6A1')
plt.xlabel('Iterations')
plt.ylabel('Log Loss')
plt.title('Log Loss vs Iterations')
plt.legend()

效果如下:

绘制准确率曲线:

# 绘制准确率曲线
plt.subplot(1, 2, 2)
plt.plot(range(len(train_merror)), 1 - np.array(train_merror), label='Train Accuracy', color='#87CEFA')
plt.plot(range(len(test_merror)), 1 - np.array(test_merror), label='Test Accuracy', color='#E1B0D7')
plt.xlabel('Iterations')
plt.ylabel('Accuracy')
plt.title('Accuracy vs Iterations')
plt.legend()
plt.tight_layout()
plt.show()

效果如下:

# 可视化分类结果
def visualize_classification(X_train, y_train, X_test, y_test, y_pred, iris):
    plt.figure(figsize=(12, 6))
    colors = ['#F7A8B8','#FFFACD','#A1E6A1']
    # 子图 1: 训练集分类结果
    plt.subplot(1,2,1)
    for i,color in zip(range(3),colors):
        plt.scatter(X_train[y_train==i,0], X_train[y_train ==i,1],color=color,edgecolors='k',label=iris.target_names[i])
    plt.title('Training Set Classification')
    plt.xlabel(iris.feature_names[0])
    plt.ylabel(iris.feature_names[1])
    plt.legend()
    # 子图 2: 测试集分类结果
    plt.subplot(1,2,2)
    for i,color in zip(range(3),colors):
        plt.scatter(X_test[y_test ==i,0], X_test[y_test ==i,1],color=color,edgecolors='k',label=iris.target_names[i])
    plt.title('Test Set Classification')
    plt.xlabel(iris.feature_names[0])
    plt.ylabel(iris.feature_names[1])
    plt.legend()
    plt.tight_layout()
# 调用可视化函数
visualize_classification(x_train,y_train,x_test,y_test,y_pred,iris)

效果如下:

六、模型调优:

  1. 数据预处理:在使用XGBoost之前,需要对原始数据进行清洗和预处理,包括处理缺失值、处理异常值、特征选择、数据标准化等操作。
  2. 划分训练集和测试集:为了评估模型的性能,需要将数据集划分为训练集和测试集。通常,80%的数据用于训练,20%的数据用于测试。
  3. 参数调优:XGBoost模型中有许多参数可以调整,如学习率、树的数量、树的深度等。通过交叉验证和网格搜索等技术,可以找到最优的参数组合。
  4. 训练模型:使用训练集进行模型训练。XGBoost模型会根据损失函数的定义逐步优化分类器,生成多个决策树模型。
  5. 模型评估:使用测试集对训练好的模型进行评估。常见的评估指标包括准确率、精确率、召回率、F1值等。

七、应用领域:

XGBoost在多个领域都有广泛的应用,包括但不限于:

  1. 金融风控:如信用卡欺诈检测、信贷审批等。
  2. 推荐系统:如商品推荐、新闻推荐等。
  3. 生物医学:如基因表达数据分析、疾病诊断中构建精确的模型等。
  4. 中医药领域:常被用于复发预测研究,如针对缺血性脑卒中患者中医药治疗的复发构建XGBoost模型进行预测。

总结

综上所述,XGBoost是一个功能强大、灵活性高的机器学习算法,它通过梯度提升的方法构建了一系列的决策树,每棵树都在尝试减少前一棵树的残差。XGBoost的正则化项和二阶泰勒展开是其核心技术,使得它在各种数据集上都能取得很好的性能。同时,它对缺失值的有效处理和并行化支持也使得它在处理大规模数据时更加高效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值