XGBoost算法

XGBoost在机器学习中被广泛应用于多种场景,特别是在结构化数据的处理上表现出色,XGBoost适用于多种监督学习任务,包括分类、回归和排名问题。在数据挖掘和数据科学竞赛中,XGBoost因其出色的性能而被频繁使用。例如,在Kaggle平台上的许多获奖方案中,XGBoost都发挥了重要作用。此外,它在处理缺失值和大规模数据集上也有很好的表现。

XGBoost是一种基于梯度提升决策树(GBDT)的算法,在机器学习领域被广泛使用,特别是在数据挖掘和推荐系统中

基本思想:XGBoost的基本思想是通过添加一系列弱学习器(通常是CART回归树)来逐步减少目标函数的残差(模型预测值与实际值之间的差异),从而提升模型的性能。


XGBoost和AdaBoost区别

XGBoost和AdaBoost在模型的基分类器、目标函数以及正则化策略上存在明显区别。 

  • 基分类器:AdaBoost通常使用简单的决策树作为基分类器,而XGBoost除了支持CART树外,还支持线性分类器。这使得XGBoost在处理某些特定问题时能够提供更灵活的建模选项。
  • 目标函数:AdaBoost主要关注于提升模型的正确率,通过不断调整样本权重来加强对错误分类样本的学习。相比之下,XGBoost对代价函数进行了二阶泰勒展开,同时利用一阶和二阶导数信息进行优化,这有助于更精确地找到最优点。此外,XGBoost允许用户自定义代价函数,只要该函数可导即可,这增加了模型的适用性和灵活性。
  • 正则化策略:XGBoost在其代价函数中加入了正则项,用于控制模型的复杂度并防止过拟合。这种策略是XGBoost特有的,它有助于提高模型的泛化能力。

XGBoost和AdaBoost都属于Boosting框架

  • AdaBoost(Adaptive Boosting):是一种早期的集成学习算法,它通过迭代地构建弱分类器并结合它们的输出来提高整体模型的性能。AdaBoost的特点是它会根据前一轮分类器的表现来调整样本权重,错误分类的样本在下一轮训练中会被赋予更高的权重,以此来强化模型对于难以分类样本的学习。
  • XGBoost(eXtreme Gradient Boosting):是一种实现了梯度提升的机器学习方法,它通过添加新的模型(通常是决策树)来纠正之前模型的错误,从而逐渐提高模型的性能。

XGBoost在技术上比AdaBoost更为先进,提供了更多的定制化选项,并且在很多情况下能够获得更好的性能。 

XGBoost属于参数学习算法,最终我们要找到一个函数来表示XGBoost模型。

构造目标函数 → 目标函数的优化方法 → 用函数来表示一棵树 → 如何构建树模型

XGBoost原理:

  • 构造目标函数        
  • 使用二阶泰勒泰勒级数展开目标函数
  • 用函数来描述树结构
  • 贪心算法建树
  • 缺失值处理

XGBoost API         

首先要安装库   pip install xgboost -i https://pypi.tuna.tsinghua.edu.cn/simple  

booster

  1. gbtree:使用树模型
  2. gblinear:使用线性模型

silent 

  • 设置为 0 打印运行信息
  • 设置为 1不打印运行信息

nthread

  • 并行运行的线程数,输入的参数应该 <= 系统的CPU核心数
  • 若是没有设置算法会检测将其设置为 CPU 的全部核心数

Booster 参数

eta     更新中减少的步长来防止过拟合

gamma     指定了节点分裂所需的最小损失函数下降值

 max_depth   为树的最大深度

subsample    参数控制对于每棵树随机采样的比例

案例

import joblib
import numpy as np
import xgboost as xgb
import pandas as pd
import numpy as np
from collections import Counter
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.model_selection import StratifiedKFold

 from sklearn.metrics import classification_report 的作用是从一个分类任务中生成一个文本报告,展示主要的分类指标。是一个用于评估分类模型性能的函数,它能够为二分类或多分类任务提供一个详细的性能报告。该报告包括以下几个主要指标:

  1. 精确度 (Precision):预测为正类别中实际为正类别的比例。
  2. 召回率 (Recall):实际为正类别中预测为正类别的比例。
  3. F1分数 (F1 Score):精确度和召回率的调和平均数,是对模型精确度和召回率之间平衡的一个度量。
  4. 支持度 (Support):每个类别在数据集中的样本数量。
  5. 准确性 (Accuracy):正确预测的比例。
def func1():

    
    data = pd.read_csv('wine.csv')
    x = data.iloc[:, :-1]
    y = data.iloc[:, -1] - 3

    
    x_train, x_valid, y_train, y_valid = train_test_split(x, y, test_size=0.2, stratify=y, random_state=22)

    # 存储数据
    pd.concat([x_train, y_train], axis=1).to_csv('wine-train.csv')
    pd.concat([x_valid, y_valid], axis=1).to_csv('wine-valid.csv')
def func2():

    # 加载训练数据
    train_data = pd.read_csv('wine-train.csv')
    valid_data = pd.read_csv('wine-valid.csv')

    
    x_train = train_data.iloc[:, :-1]
    y_train = train_data.iloc[:, -1]

    
    x_valid = valid_data.iloc[:, :-1]
    y_valid = valid_data.iloc[:, -1]

    # XGBoost模型训练
    estimator = xgb.XGBClassifier(n_estimators=100,
                                  objective='multi:softmax',
                                  eval_metric='merror',
                                  eta=0.1,
                                  use_label_encoder=False,
                                  random_state=22)
    estimator.fit(x_train, y_train)

    # 3. 模型评估
    y_pred = estimator.predict(x_valid)
    print(classification_report(y_true=y_valid, y_pred=y_pred))

    # 4. 模型保存
    joblib.dump(estimator, 'model/xgboost.pth')

 

  • n_estimators: 这是XGBoost模型中树的数量,即迭代次数,设置为100。
  • objective:优化目标函数的选择。'multi:softmax'表示多分类问题,使用softmax作为输出层的激活函数。
  • eval_metric: 评估指标的选择。'merror'表示多分类问题的误差率。
  • eta: 这是学习率,用于控制每次迭代时模型权重更新的步长,设置为0.1。
  • use_label_encoder: 是一个布尔值,指示是否使用标签编码器。如果为False,则不使用标签编码器。
  • random_state: 这是随机数生成器的种子值,用于确保每次运行代码时得到相同的结果。

我们也可以使用交叉验证,网格搜索的方式搜寻最佳参数:

x_train = train_data.iloc[:, :-1]
y_train = train_data.iloc[:, -1]

x_valid = valid_data.iloc[:, :-1]
y_valid = valid_data.iloc[:, -1]

spliter = StratifiedKFold(n_splits=5)

param_grid = {'max_depth': np.arange(3, 5, 1),
              'n_estimators': np.arange(50, 150, 50),
              'eta': np.arange(0.1, 1, 0.3)}
estimator = xgb.XGBClassifier(n_estimators=100,
                              objective='multi:softmax',
                              eval_metric='merror',
                              eta=0.1,
                              use_label_encoder=False,
                              random_state=22)
cv = GridSearchCV(estimator,param_grid,cv=spliter)
y_pred = cv.predict(x_valid)
print(classification_report(y_true=y_valid, y_pred=y_pred))   # 美观

 总而言之XGBoost(eXtreme Gradient Boosting)是一种先进的机器学习算法,具有以下特点和优势:

  1. 高效性能:XGBoost在许多机器学习竞赛和实际应用中表现出卓越的性能,尤其在结构化数据上的表现尤为突出。

  2. 灵活性:它支持多种自定义优化目标和评估指标,使模型能够适应不同的问题场景。

  3. 正则化:XGBoost在目标函数中加入了正则化项,这有助于控制模型的复杂度,降低过拟合风险。

  4. 并行处理:XGBoost内部设计了并行处理机制,能够充分利用硬件资源,提高计算效率。

  5. 缺失值处理:XGBoost能够自动学习出处理缺失值的策略,这使得它在处理实际问题中的不完整数据时更加方便。

  6. 内置交叉验证:XGBoost提供了内置的交叉验证功能,可以方便地进行超参数调优和模型选择。

  7. 模型可解释性:通过特征重要性等指标,XGBoost可以为模型的预测结果提供一定程度的解释性。

  8. 多语言支持:XGBoost提供了多种编程语言的接口,包括Python、R、Java等,方便用户在不同的环境中使用。

你可能感兴趣的:(机器学习算法,算法,人工智能,机器学习)