估计阅读时长: 9 分钟

https://github.com/xieguigang/sciBASIC

在实际应用的机器学习方法里,GradientTree Boosting (GBDT)是一个在很多应用里都很出彩的技术。XGBoost是一套提升树可扩展的机器学习系统。XGBoost全名叫(eXtreme Gradient Boosting)极端梯度提升。它是大规模并行boosted tree的工具,XGBoost 所应用的算法就是 GBDT(gradient boosting decision tree)的改进,既可以用于分类也可以用于回归问题中。

Tree boosting is a highly effective and widely used machine learning method. In this paper, we describe a scalable endto-end tree boosting system called XGBoost, which is used widely by data scientists to achieve state-of-the-art results on many machine learning challenges. We propose a novel sparsity-aware algorithm for sparse data and weighted quantile sketch for approximate tree learning. More importantly, we provide insights on cache access patterns, data compression and sharding to build a scalable tree boosting system. By combining these insights, XGBoost scales beyond billions of examples using far fewer resources than existing systems.

Tianqi Chen and Carlos Guestrin. 2016. XGBoost: A Scalable Tree Boosting System. In Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD '16). Association for Computing Machinery, New York, NY, USA, 785–794. DOI:https://doi.org/10.1145/2939672.2939785

在R#脚本之中使用XGBoost

在R#环境中,已经默认集成了XGBoost方法,可以直接使用机器学习工具包之中的XGBoost模块来进行相应的建模以及预测分析:

imports "xgboost" from "MLkit";

Booster Parameters(模型参数)

在R#脚本中调用XGBoost方法进行建模,可以通过一些参数来进行算法的调整。下面的代码中列举出来了XGBoost算法所需要的所有可选的参数以及对应的默认参数值:

const params = list(
    'early_stopping_rounds' = 10,
    'maximize'              = TRUE,
    'eval_metric'           = 'auc',
    'loss'                  = 'logloss',
    'eta'                   = 0.3,
    'num_boost_round'       = 20,
    'max_depth'             = 7,
    'scale_pos_weight'      = 1.,
    'subsample'             = 0.8,
    'colsample'             = 0.8,
    'min_child_weight'      = 1.,
    'min_sample_split'      = 5,
    'reg_lambda'            = 1.,
    'gamma'                 = 0.
);

下面为上面的参数的含义,大家在使用这个程序包的时候,可以作为参数调整的参考:

  1. eta [default=0.3]:shrinkage参数,用于更新叶子节点权重时,乘以该系数,避免步长过大。参数值越大,越可能无法收敛。把学习率 eta 设置的小一些,小学习率可以使得后面的学习更加仔细。
  2. min_child_weight [default=1]:这个参数默认是 1,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言,假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。
  3. max_depth [default=6]: 每颗树的最大深度,树高越深,越容易过拟合。
  4. gamma [default=0]:后剪枝时,用于控制是否后剪枝的参数。
  5. subsample [default=1]:样本随机采样,较低的值使得算法更加保守,防止过拟合,但是太小的值也会造成欠拟合。
  6. colsample [default=1]:列采样,对每棵树的生成用的特征进行列采样.一般设置为: 0.5-1
  7. reg_lambda [default=1]:控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
  8. scale_pos_weight [default=1]:如果取值大于0的话,在类别样本不平衡的情况下有助于快速收敛。
  9. eval_metric [ default according to objective ]:The metric to be used for validation data. The default values are rmse for regression and error for classification. Typical values are:
    • rmse – root mean square error
    • mae – mean absolute error
    • logloss – negative log-likelihood
    • error – Binary classification error rate (0.5 threshold)
    • merror – Multiclass classification error rate
    • mlogloss – Multiclass logloss
    • auc: Area under the curve

创建数据集

在R#脚本中的XGBoost程序包内,数据集分为三种类型:训练数据集,验证数据集以及样本数据集。这三种数据集都可以统一的通过同一个函数来生成:

let xgb.DMatrix as function(data,
                            label                = NULL,
                            validate_set         = FALSE,
                            categorical_features = NULL) {
}

如果我们在使用上面的函数的时候,label默认为空,则会创建样本数据集(用于进行实际生产中的分类计算操作),例如:

xgb.DMatrix(read.csv("./ftest.csv", row.names = NULL, check.names = FALSE));

如果label参数不为空的话,则会根据validate_set参数来决定生成验证数据集还是训练数据集。很直观的,validate_set为TRUE的时候,生成验证数据集,反之生成训练数据集:

# training set
xgb.DMatrix(ftrain[, 1:(ncol(ftrain)-1)], label = ftrain[, ncol(ftrain)], categorical_features = ["PRI_jet_num"]);
# validation set
xgb.DMatrix(fval[, 1:(ncol(fval)-1)], label = fval[, ncol(fval)], validate_set = TRUE);

执行XGBoost

那,现在既然我们有了参数以及数据集对象了,就可以进行XGBoost训练建模了:

let model = xgboost(training_set, validation_set, params);

# save model tree to file
model
|> xgboost::serialize
|> writeLines('./tgb.txt')
;

在上面的示例脚本中,我们基于训练数据集以及验证数据集进行XGBoost模型的训练。之后呢,就可以通过xgboost包之中的serialize函数将模型树进行序列化为文本文件进行保存和后续计算分析的模型复用了。如果我们需要从保存的文件中加载模型呢,使用xgboost::parseTree方法就可以了。对于使用已经训练好的xgboost模型,我们可以使用predict函数来进行样本数据集的分类预测计算:

# testing phase
let ftest = read.csv( "./test.csv", row.names = NULL, check.names = FALSE);
let testLabels = ftest[, "Label"];

ftest[, "Label"] = NULL;

# load model and predict
let result_pred = readLines('./tgb.model')
|> xgboost::parseTree
|> xgboost::predict(xgb.DMatrix(ftest))
;

data.frame(predict = result_pred, label = testLabels)
|> write.csv(file = foutput2, row.names = FALSE)
;

在这个测试中,我们将预测的分类得分结果以及对应的真实标签结果放在一个表格文件之中,用于后续的ROC曲线分析,用来评估看看再R#程序包中所实现的XGBoost算法的预测准确度有多高。

XGBoost预测结果的ROC曲线

从之前的测试结果脚本中,我们将预测结果与对应的真实标签都放在一起了。现在我们可以基于这两个向量数据进行XGBoost分类器的分类性能ROC曲线的可视化:

imports "validation" from "MLkit";

let data = read.csv(file = "test_result2.csv", row.names = NULL);
let pred = prediction(data[, "predict"], data[, "label"]);

str(data);

print(head(data));
print(`AUC = ${AUC(pred)}`);

bitmap(file = relative_work("ROC.png")) {
    plot(pred);
}



从ROC曲线可以看得出来,XGBoost方法进行分类预测的准确度接近于90%,AUC值已经非常高了。

XGBoost: A Scalable Tree Boosting System

谢桂纲

Attachments

No responses yet

Leave a Reply

Your email address will not be published. Required fields are marked *

博客文章
December 2025
S M T W T F S
 123456
78910111213
14151617181920
21222324252627
28293031  
  1. 谢博,您好。阅读了您的博客文章非常受启发!这个基于k-mer数据库的过滤框架,其核心是一个“污染源数据库”和一个“基于覆盖度的决策引擎”。这意味着它的应用远不止于去除宿主reads。 我们可以轻松地将它扩展到其他场景: 例如去除PhiX测序对照:建一个PhiX的k-mer库,可以快速剔除Illumina测序中常见的对照序列。 例如去除常见实验室污染物:比如大肠杆菌、酵母等,建一个联合的污染物k-mer库,可以有效提升样本的纯净度。 例如还可以靶向序列富集:反过来想,如果我们建立一个目标物种(比如某种病原体)的k-mer库,然后用这个算法去“保留”而不是“去除”匹配的reads,这不就实现了一个超快速的靶向序列富集工具吗? 这中基于kmer算法的通用性和扩展性可能会是它的亮点之一。感谢博主提供了这样一个优秀的思想原型

  2. WOW, display an image on a char only console this is really cool, I like this post because so much…

  3. 确实少有, 这么高质量的内容。谢谢作者。;-) 我很乐意阅读 你的这个技术博客网站。关于旅行者上的金唱片对外星朋友的美好愿望,和那个时代科技条件限制下人们做出的努力,激励人心。