[机器学习]XGBoost(4)——系统设计(含代码实战)

系统设计

核外块运算

在内存不足以容纳全部数据时,算法一次只能处理一部分数据。需要处理一部分之后再读取另一部分,但磁盘读写速度远远小于CPU处理速度

XGBoost的处理:

  • 以分块的形式把数据存储在不同磁盘上的数据块内,称为块拆分。存储在不同磁盘上有利于提高磁盘吞吐率。
  • 单独开启一个线程用来读取数据,数据处理和数据读取并行进行
  • 数据按列进行块压缩,线程在读取时需要先解压

分块并行

构建回归树的过程中,最耗时的是遍历特征时对每个特征值进行排序的操作

XGBoost的处理:

  • 先对每个特征对应的特征值进行排序,然后把结果存在一个特定数据结构Block中,Block按列存储,因此每个特征之间互不影响,相互独立
  • 除了存储特征值,还要存储索引值,索引值索引了每个特征值指向哪些样本
  • 数据以csc格式存储
  • block结构可以并行处理,每次计算最优划分节点时只要对block扫描一遍就可以筛选最优gain
  • 可以将block分成多个,分布式部署在多个机器上

缓存优化

问题:block数据结构导致缓存命中率低

缓存命中率

缓存命中率(Cache Hit Rate)衡量在处理数据时,所需数据可以直接从缓存中获取的比例。缓存命中率越高,意味着程序运行时需要从主存(RAM)或更慢的存储介质(如硬盘)中读取数据的次数越少,从而可以提高程序的执行效率。

缓存命中率可以通过以下公式计算:
缓存命中率 = 缓存命中次数 总访问次数 缓存命中率=\frac{缓存命中次数}{总访问次数} 缓存命中率=总访问次数缓存命中次数

缓存优化

  • 给每一个特征分配一个buffer,存的是样本对应的 g i g_i gi和 h i h_i hi,将非连续的访问变成连续的访问

整体流程

  1. 加载数据(核外块运算):

    • XGBoost使用DMatrix数据结构来存储数据,这种结构优化了数据的存储和访问方式,以便于后续的块运算(block-wise processing)。
    • DMatrix支持核外(disk-based)数据操作,这意味着它可以处理存储在磁盘上的数据,而不仅仅是内存中的数据。
  2. 对每一个特征进行排序(预排序),构建block,分配buffer,进行节点划分:

    • XGBoost会对特征值进行排序,这是为了后续的块运算。排序后,数据会被分成多个块(block),每个块包含连续的特征值范围。
    • 每个块会被分配到内存中的buffer,以便并行处理。
    • 节点划分是指在构建决策树时,XGBoost会根据特征值将数据划分为不同的节点。
  3. 先确定有没有列采样,然后筛选要用的特征:

    • 列采样(column subsampling)是XGBoost的一个特性,它通过随机选择一部分特征来构建每棵树,以增加模型的泛化能力。
    • 筛选特征是在构建每棵树之前进行的,以确定哪些特征将被用于分裂节点。
  4. 看有没有用分位数算法,确定是全局还是局部:

    • 分位数算法(Quantile Sketching)是XGBoost用于处理大规模数据集的一种算法,它可以快速地找到近似的分位数。
    • 全局分位数是指在整个数据集上计算分位数,而局部分位数是指在每个叶子节点上计算分位数。
  5. 如果用了分位数算法,要给定超参数:

    • 使用分位数算法时,需要设置超参数,如max_bin_by_feature,它控制每个特征的最大桶(bin)数量。
  6. 根据采集到的特征值进行叶子的统计:

    • 在构建树的过程中,XGBoost会统计每个叶子节点上的特征值,以确定最佳的分裂点。
    • 这个过程涉及到计算每个可能的分裂点的增益(gain),并选择增益最大的分裂点。

代码实战

python 复制代码
import xgboost as xgb
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

california_housing = fetch_california_housing(as_frame=True)
X, y = california_housing.data, california_housing.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建XGBoost的DMatrix对象,这是XGBoost数据结构
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)


params = {
    'objective': 'reg:squarederror',  # 回归问题
    'max_depth': 6,                  # 树的最大深度
    'eta': 0.3,                      # 学习率
    'subsample': 0.8,                # 训练模型时使用样本的比例
    'colsample_bytree': 0.8,         # 构建树时使用的特征比例
    'eval_metric': 'rmse'            # 评估指标
}

num_boost_round = 100
bst = xgb.train(params, dtrain, num_boost_round=num_boost_round)


preds = bst.predict(dtest)

rmse = mean_squared_error(y_test, preds, squared=False)
print(f'RMSE: {rmse}')
相关推荐
Lorcian8 分钟前
web前端1--基础
前端·python·html5·visual studio code
Allen2000017 分钟前
wow-agent---task2使用llama-index创建Agent
人工智能·llama
BoostingIsm22 分钟前
【环境安装】安装LLaMA-Factory
人工智能·深度学习
CRTao35 分钟前
Python并发编程 07 事件驱动模型、进程切换、进程阻塞、文件描述符、缓存I/O、selectors模块
java·python·缓存
brilliantgby1 小时前
蓝桥杯3525 公因数匹配 | 枚举+数学
python·算法·蓝桥杯
不去幼儿园1 小时前
【博客之星】2024年度个人成长、强化学习算法领域总结
人工智能·python·算法·机器学习·强化学习·个人总结
程序猿阿伟1 小时前
《AI与鸿蒙Next:建筑设计可视化的革新力量》
人工智能·华为·harmonyos
小王子10241 小时前
面向对象分析与设计Python版 GOF设计模式
python·设计模式·gof·面向对象分析与设计
爱学习的uu1 小时前
KAGGLE竞赛实战2-捷信金融违约预测竞赛-part2-用lightgbm建立baseline
python·机器学习·金融
莲动渔舟2 小时前
PyTest自学 - 将多个用例组织在一个类中
python·pytest·测试