C++ 决策树存储

Posted

技术标签:

【中文标题】C++ 决策树存储【英文标题】:C++ decision tree storage 【发布时间】:2013-05-19 18:36:51 【问题描述】:

我有一个决策树。 我给这个决策树提供了一些输入值。 然后决策树返回一个值。

输入值可以是“孩子的数量”、“年龄”等。 然后,决策树可以返回(例如)一个特定的值,该值指示家庭拥有多少辆汽车或类似的东西。

此决策树(如果转换为 if-then 语句)如下所示:

int i=0;

if (ownedHouses==0)

    if (numberOfChildren==4)
    
        if (ageFather==39)
        
            if (incomeFamily==40000)
            
                if (carsAlreadyCrashed==1)
                
                    i=3;
                
                else
                
                    if (carsAlreadyCrashed==2)
                    
                        if (insurancePaysForCrashes==1)
                        
                            i=5;
                        
                      
                      else
                      
                            i=4;
                        
                    
                    else
                    
                        i=11;
                    
                
            
            else
            
                i=2;
            
        
        else
        
            i=9;
        
    
    else
    
        i=22;
    
else

    i=8;

这只是一个例子。实际上,由此产生的 if-then 语句绝对是巨大的。虽然我可以解析数据并从中创建这样的 if-then,但我无法在我的软件中使用这么大的 if-then-loop。

因此,我正在寻找一种不同的方式将决策树集成到我的软件中。

我见过在运行时解析决策树数据(以任何形式提供...)的方法,然后从中创建具有根、节点和叶的类。

就我的目的而言,这还不够快。

还有人有其他想法吗?

感谢您的帮助。

编辑:我已将一些值更改为现实生活中的值,以使含义更加清晰。

【问题讨论】:

if-then-loop 到底是什么?如果您告诉我们更多关于您的输入和输出应该是什么样子的信息,那么提出建议会容易得多(一刀切很少是最好的解决方案)。 @Grizzly 是“If-then-struct”更好的描述吗? @tmighty:不。这是一个声明。 @tmighty:“就我而言,这还不够快。” - 你是怎么得出这个结论的? 当然这只是对数据集的查询 - SQLite? 【参考方案1】:

我所知道的最快的实现是在ALGLIB 中实现的。 决策树存储为双精度数组。

叶节点 - 两个值 -1, data。 非叶节点 - 三个值 input_value_index, threshold, right_branch_offset。

你可以在dforest.dfprocessinternal找到这种方法的实现

【讨论】:

以上是关于C++ 决策树存储的主要内容,如果未能解决你的问题,请参考以下文章

C++ 决策树实现问题:在代码中思考

c++中基于大型决策树的人工智能设计模式

如何在matlab中存储和检索多个决策树

《机器学习实战》第3章 决策树 学习笔记

如何存储决策树

机器学习实战教程:决策树实战篇