【问题标题】:How to produce XGBoost outputs without an XGBoost library?如何在没有 XGBoost 库的情况下生成 XGBoost 输出?
【发布时间】:2020-01-17 08:03:00
【问题描述】:

我有一个用 Python 训练的 XGBoost 二元分类器模型。

我想在不同的脚本环境 (MQL4) 中使用纯数学运算而不使用 XGBoost 库 (.predict) 为新输入数据生成此模型的输出。

任何人都可以帮助计算公式和/或算法吗?

【问题讨论】:

  • 一个勇敢的想法。是的,xgboost 是一个带有“性感”标签的引擎,如今仍然越来越受欢迎。那么,到目前为止您尝试了什么以及您的模型集成在 MQL4 中是如何工作的?您可能已经注意到 MQL4不是脚本环境,而是一种编译语言,其代码执行依赖于动态链接的库。
  • 我有一个使用 MQL4 的 ANN 模型,还不能集成 XGBoost。我对人工神经网络有一些专业知识,但对 XGBoost 不太擅长。我相信这可以使用所有平台都有的四个算术运算和一些额外的数学函数来完成,就像我对 ANN 所做的那样。
  • 模型执行毫无疑问(MQL4 端的aClassXgbGUESS = aTrainedXgbMODEL.predict( aFeatureVEC ); 的一种形式),但是将aTrainedXgbMODEL 从 python xgboost-native 环境转移到 MQL4 代码中存在许多设计方面的问题-执行环境(而不是说需要模型运行它的在线学习扩展)。因此,从分布式架构的角度来看,生产级系统的要求相当高,而不是从 (cit.:)“四个算术运算”或“公式和/或算法”的角度来看。
  • 这是一个严肃的计划吗?换句话说,多少人*月(arch + {原型| rc | prod}-{设计+开发+测试}+发布+文档)工作你的集成阶段有预算?

标签: python c++ xgboost mql4


【解决方案1】:

经过一些逆向工程,我发现了方法;训练模型后,首先将模型转储到文本文件中:

num_round = 3
bst = xgb.train( param, dtrain, num_round, watchlist )    
bst.dump_model('D:/Python/classifyproduct.raw.txt')

然后为每个助推器找到输入特征集的叶概率。将所有这些概率相加,在我们的例子中,输入二元逻辑函数:

1/(1+exp(-sum))

这是针对给定输入特征集训练的 xgboost 模型的输出概率。例如,我的带有 2 个输入(a 和 b)文本文件的示例转储是:

booster[0]:
0:[b<-1] yes=1,no=2,missing=1
1:[a<0] yes=3,no=4,missing=3
    3:[a<-2] yes=7,no=8,missing=7
        7:leaf=0.522581
        8:[b<-3] yes=13,no=14,missing=13
            13:leaf=0.428571
            14:leaf=-0.333333
    4:leaf=-0.54
2:[a<2] yes=5,no=6,missing=5
    5:[a<-8] yes=9,no=10,missing=9
        9:leaf=-0.12
        10:leaf=-0.56129
    6:[b<2] yes=11,no=12,missing=11
        11:leaf=-0.495652
        12:[a<4] yes=15,no=16,missing=15
            15:[b<7] yes=17,no=18,missing=17
                17:leaf=-0.333333
                18:leaf=0.333333
            16:leaf=0.456
booster[1]:
0:[b<-1] yes=1,no=2,missing=1
1:[a<0] yes=3,no=4,missing=3
    3:[b<-3] yes=7,no=8,missing=7
        7:leaf=0.418665
        8:[a<-3] yes=13,no=14,missing=13
            13:leaf=0.334676
            14:leaf=-0.282568
    4:leaf=-0.424174
 2:[a<2] yes=5,no=6,missing=5
    5:[b<0] yes=9,no=10,missing=9
        9:leaf=-0.048659
        10:leaf=-0.445149
    6:[b<2] yes=11,no=12,missing=11
        11:leaf=-0.394495
        12:[a<5] yes=15,no=16,missing=15
            15:[b<7] yes=17,no=18,missing=17
                17:leaf=-0.330064
                18:leaf=0.333063
            16:leaf=0.392826
booster[2]:
0:[b<-1] yes=1,no=2,missing=1
1:[a<0] yes=3,no=4,missing=3
    3:[b<-3] yes=7,no=8,missing=7
        7:leaf=0.356906
        8:[a<-3] yes=13,no=14,missing=13
            13:leaf=0.289085
            14:leaf=-0.245992
    4:leaf=-0.363819
 2:[a<4] yes=5,no=6,missing=5
    5:[a<2] yes=9,no=10,missing=9
        9:[b<0] yes=15,no=16,missing=15
            15:leaf=-0.0403689
            16:leaf=-0.381402
        10:[b<7] yes=17,no=18,missing=17
            17:leaf=-0.307704
            18:leaf=0.239974
    6:[b<2] yes=11,no=12,missing=11
        11:leaf=-0.308265
        12:leaf=0.302142

我有 2 个特征作为输入。假设我们有 [4, 9] 作为输入。我们可以将助推器概率计算为:

booster0 : 0.456
booster1 : 0.333063
booster2 : 0.302142
sum = 1.091205
1/(1+exp(-sum)) = 0.748608563

就是这样。

【讨论】:

  • 例如clf.estimators_[idx][0].tree_ 是一棵可以遍历的树。
  • bst.get_dump(dump_format='json') 这就是我要找的。希望有人觉得这很有用。
【解决方案2】:

我知道这是一个旧线程,但如果有人看到这里,有一个名为 m2cgen(模型到代码生成)的模块可以从模型生成纯本机代码,包括 xgboost(使用 gbtree 助推器)。

https://github.com/BayesWitnesses/m2cgen

【讨论】:

猜你喜欢
  • 2015-11-22
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 2017-01-25
相关资源
最近更新 更多