估计阅读时长: 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训练建模了:

const 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
const ftest = read.csv( "./test.csv", row.names = NULL, check.names = FALSE);
const testLabels = ftest[, "Label"];

ftest[, "Label"] = NULL;

# load model and predict
const 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";

setwd(@dir);

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

str(data);

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

bitmap(file = `${dirname(@script)}/ROC.png`) {
    plot(pred);
}



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

XGBoost: A Scalable Tree Boosting System

谢桂纲
Latest posts by 谢桂纲 (see all)

Attachments

No responses yet

Leave a Reply

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

博客文章
April 2024
S M T W T F S
 123456
78910111213
14151617181920
21222324252627
282930  
  1. 空间Spot结果在下载到的mzkit文件夹中有示例吗?我试了试,不是10X结果中的tissue_positions_list.csv(软件选择此文件,直接error);在默认结果中也没找到类似的文件;