精华内容
下载资源
问答
  • Unity3D树木模型

    2018-06-30 18:01:10
    Maple Trees Package Unity3D树木模型.。Unity3D树木模型.
  • 3D绿色树木模型

    2020-01-14 18:28:17
    3D绿色树木模型适用于绿色植物模型设计
  • unity3d树木模型

    2017-10-10 15:12:04
    unity3d树木模型,带有几种常见的树木模型,可以满足一般的使用
  • 树木模型--unity包

    2018-01-26 10:20:26
    树木模型--unity包;树木模型--unity包;树木模型--unity包;五个
  • 树木模型软件

    2012-09-15 16:02:31
    是当下较流行的树木模型制作软件!适合做精细模型,模型仿真度较高!
  • 方法该方法在提取树木模型骨架结构的基础上,通过交互方式对3维树木模型的骨架进行个性化编辑以生成3维树木模型的全新骨架结构,并采用枝干和树冠模型的简化方法实现轻量化3维树木模型的构建。结果该方法不仅能快速...
  • Maple Trees Package Unity3D树木模型,可操作自行更改;Maple Trees Package Unity3D树木模型,可操作自行更改;
  • unity3d Broadleave trees 阔叶林树木模型资源包unity3d Broadleave trees 阔叶林树木模型资源包
  • 基于局部视图的三维树木模型递进检索方法
  • 生成器 该程序允许您创建逼真的树木模型
  • 【图形学】基于点云生成树木模型

    千次阅读 热门讨论 2019-03-03 20:50:00
    最近看了师兄发来的论文后,我发现基于点云生成树木模型也并没有想象中那么难。 参考论文:Knowledge and Heuristic Based Modeling of Laser-Scanned Trees.Hui Xu,Nathan Gossett,Baoquan Chen. 参考博客:...

    很久之前就想尝试有关于点云方面的知识,但是一直耽搁到现在,一方面感觉很难不知道如何下手。最近看了师兄发来的论文后,我发现基于点云生成树木模型也并没有想象中那么难。

    参考论文Knowledge and Heuristic Based Modeling of Laser-Scanned TreesHui Xu,Nathan Gossett, Baoquan Chen.

    参考博客https://blog.csdn.net/Mahabharata_/article/details/79511894

    因为现在三维扫描设备发展非常迅速,利用这些设备我们可以很轻易的获取到各种物体的点云数据,而从点云重新恢复出物体的三维模型可以让三维模型更符合现实以至于让人难以区分的程度,所以这是非常有意义的一项工作。本文主要讲的是从点云恢复出树木模型

    先放出我的程序结果技术路线

     

     (a) 分离树叶点云和枝干点云 (b) 获取枝干点云     
    (c) 每个点到根的最短路径  (d) 生成聚类并生成 bin
     (e) 根据 bin 获得树骨架 (f) 根据骨架绘制树   
     (g) 骨架优化 (h) 最终效果

    效果是不是还可以呢,其实复现出这种效果并不难。别着急,往下看。

    一、知识点储备

    担心自己能否实现这样的代码?只要会用c++和opengl就够了!

    程序里主要用到的数据结构和算法是:kd-Tree迪杰斯特拉算法

    kd-Tree的话我是自己实现了一遍,当然你也可以直接使用别人封装好的kdTree,我是建议自己实现一下,也不是很难,半天应该就能写出来了,至于迪杰斯特拉算法,这个从一开始就学过N次的求最短路径的算法就不多说了。

    如果准备好了,那我们就开始了~

    二、具体实现流程

     

    1. 输入点云数据

    若有Kinect可自行采取点云数据,如若没有也可以在网上下载一个树木模型用作测试。

    2. 分离枝干点云和树叶点云

    我们可以把模型中的竖直方向最低点当做根节点。我们设定一个半径r,如果从根节点开始,不断的把临近的点(到根节点距离小于r的点)加入到枝干点云集合中,最终剩下的点便是树叶点云。这样做是因为,对于树木来说其枝干点云的密度显然是比树叶点云的密度大的,所以选取一个合适的r便可以将二者区分出来。

    我们采用kd-Tree进行搜索,可以看出,我们从下面看出,在10万的数据量上,我们寻找到所有的枝干点仅仅花费了0.17s!!!

    感兴趣的同学可以试一下用循环来搜索数据,和用kd-tree进行搜索对比,可以更直观的感受到kd-tree的强大

    下面放出分离点云的伪代码:

     

        bool mask[m_vertex.size()];//标记点云中某点是否找过,m_vertex存放全部点云数据
        memset(mask,0,m_vertex.size()*sizeof(bool));
        mask[m_rootIndex] = true;//标记根节点已找过
        //m_branchPts用于保存枝干点云
        m_branchPts.push_back(m_vertex[m_rootIndex]);  //把最低点当成枝干点云的第一个点
    
        
        kdTree.init(box,m_vertex);//对KdTree进行初始化,box为模型的包围盒
      
        //寻找枝干点
       
        for(int i =0; i< m_branchPts.size();i++)
        {
            Vector<int> neighbors = kdTree.search(radius,m_branchPts[i]);
            //        int step = m_branchPts.size();
            for( int j =0; j< neighbors.size();j++)
            {
                if(mask[neighbors[j]]==false)  //如果没找过该点,则加入到枝干点云中
                {
                    mask[neighbors[j]]=true;
                    m_branchPts.push_back(m_vertex[neighbors[j]]);
                }
            }
        }

    完成这一步之后我们就可以的到下面这张图的效果了,可以绘制一下,满满的幸福感。右图即为我们得到的枝干点云

        

    3. 得到每一个点到根节点的最短路径

    要使用迪杰斯特拉算法的到最短路径,我们需要先得到连通图。连通图其实就是顶点和边,知道顶点和边很容易就构建出连通图,然后根据连通图我们就能得到每一个结点到根节点的最短路径。至于为什么做这一步,请往下看(3和4步均是为第5步服务的)。伪代码如下:

        KdTree kdBranch;   //构建枝干点云的kd-tree
        kdBranch.init(box,m_branchPts);
     
    
        for( int i =0; i< m_branchPts.size(); i++)
        {
            maskBranch[i] = true;
    
         Vector<int> neighbors = kdTree.search(radius,m_branchPts[i]);
      
            for( int j =0; j< neighbors.size();j++)
            {
                if(mask[neighbors[j]]==false)  
                {
                     m_lines.push_back(Line(i,neighbors[j]));//保存所有相邻的线
                }
            }
    
        }
    
    
        Graph G(m_branchPts,m_lines);  //生成连通图
    
        //dijkstra方法寻找最短路径
        Dijkstra findPath;
        findPath.ShortestPath(G,0);//0表示到根节点
     
       Vector<Path> m_paths = findPath.getShortestPath(G,0);  //把每一个结点到根节点的最短路径保存到m_paths中

    写到这,基本上一大部分的工作已经完成了,如果现在绘制出来就会的到下面这个效果

    下面是程序耗时,大家可以参照一下。枝干点的总数目为:49166

    4. 生成聚类并生成 bin

    首先明确一下binsbin的概念,下图是截取自论文中的一幅图,在下面左图中我们可以把框起来的绿色点集或者青色点集称为一个聚类或者是bins,在下面右图中我们可以把圈框出的绿色或是红色点集称为一个bin

    原文中对下图的描述是:The lengths of the shortest paths are quantized and the points are clustered into bins. 即量化最短路径的长度聚类生成bins。就是说我们根据每个点到根节点的最短距离划分成不同区域,把到根节点距离相似的点放在一个bins中,然后我们再把一个bins分成若干个小bin

                                                       

    我的实现细节:首先我们可以很简单的获取到距离根节点最远的距离记为maxdist,然后我们定义一个数字numOfBinsLevel,就是说把这个树分为多少个bins。至于如何把bins分为若干个bin,那么只要对每一个bins进行搜索,默认从第一个点开始搜索一直把bins中临近的点加入到一个bin中,如此迭代一直到bins中的点被搜索完为止。如上面右图中的红色点集就是分出的一个bin,其所在的bins最终会分成两个bin。

    伪代码如下:

    Vector<Vector<Vec3> > getBins(float maxdist, int numOfBinsLevel, Vector<Vec3> &branchPts, Vector<Path> &paths)
    {
        Vector<Vector<Vec3> > bins;  //存储点
        float len = maxdist/numOfBinsLevel;
        bins.resize(numOfBinsLevel);
        for( int i = 0; i< paths.size(); i++)
        {
            bool find = false;
            for( int j =0;j <numOfBinsLevel; j++){
    
                if(paths[i].dist <len*(j+1)&& paths[i].dist>=len*j) //找到范围区间的点
                {
                    m_colors.push_back(color[j%color.size()]);
                    bins[j].push_back( branchPts[paths[i].path.first()] );
                    find = true;
                    break;
    
                }
            }
     
        }
        return bins;
    }

    当所有准备就绪后,我们可以将这些点按照bin绘制出来,每一个bin分配同一种颜色,便可得到下面这种效果

    5.  获得树的骨架

    先说明树骨架采用的数据结构:

    struct Branch
    {
    public:
        QList<QVector3D> nodes;  //一个枝干的点
        QList<Branch*> offspring; //连接的子枝干
        Branch* father;   //父枝干
        float branchWidth; //枝干宽度
        QList<QPair<QVector3D,int> > leafs;  //保存叶子的位置和密度
        QList<QPair<QVector3D,QVector3D> > linkNode; //连接叶子的枝干点和他的朝向
    
    } ;

    如果能获得树的骨架那么这个树木建模方法也就算基本完成了。我们把每一个bin的中心点(点的坐标和取平均)当做树骨架的一个节点(看到这里就明白为什么进行第3和第4步了吧),但是连接所有的节点组成树的骨架也是一个小难点,这里可以采用方法:连通图的深度优先搜索+KdTree的最邻近查询的策略。也可以自己设计连接算法,我这里使用的是我自己想的一个连接方法。

    我这里的做法是在分离bins的同时连接树骨架,有些复杂,但是实现起来并不难,但是为了纪念我苦苦思索的成果,我还是写一下流程。

    算法流程是:1. 从bins分离bin的过程中定义一个 levelbins,其存储了每一个距离范围水平的所有bin

                          2 .若levelbins中仅有一个bin,那么就算出该bin的中心点center,然后把该点连到到距离现有骨架中点最近的点                                 m。 即连在m所在的枝干

                         3. 若levelbins中有多个bin,那么我们需要对每一个bin进行分析,分别把bin对应的中心点连到到距离现有骨架中点                           最近的点。

    实现效果如下(emm这个例子的话看起来确实有些乱,最好放大看图片):

    6. 绘制及优化骨架

    这个就需要知道树木模型在计算机是如何表示的,请点击这里

    绘制出的初步结果如下,结果么,看起来是还不错,但是总感觉有些过于僵硬:

    造成过于僵硬的原因是由于在大多数情况下尖锐的过渡就不像树的真实外观,因此应该对它们进行平滑处理。

    下图角AOB和角AOC便过大,我们对骨架进行Hermite曲线优化:

     

    Hermite曲线是一个很简单的差值,这里不做赘述。

    曲线优化结果为下图,是不是看起来更自然更平滑了呢

    7.  树叶

    我们如何把树叶加上呢,是不是发现我们忽略了一些我们的数据,那就是树叶点云。这里我们可以采取简单一些的方法,

    (1)我们获得同一种树的不同数目的树叶,如下图:

    (2)我们对每一个骨架中的点在树叶点云中进行范围搜索(搜索半径可自行标定,记为R),然后搜索的出来的树叶点的数目便记为在该骨架点中树叶的密度,密度越大则可放置越多数目的树叶。

    (3)树叶的朝向计算:

    对于每个树叶位置L,我们四边形(树叶在计算机中的表示)连接到其最近的可行骨架节点S,我们把S的上一个骨架点到S的方向记为向量d。我们的到树叶的法向量为: 这里要好好想想哦。

    8. 最终效果

    三、总结

    写到这就已经结束了,其实整篇下来并没有特别难的步骤,这里面稍微要费点脑子的可能就是如何组织自己的数据结构了。

    我当时写这个程序大概写了一周左右,完整的实现出这样的一个程序对我来说也是一种很大的提升,而且做完这个我也非常有成就感,这就是写程序的乐趣所在吧hhh,希望本博客对大家有所帮助。

    文笔不好,写的不好的地方请多担待。

    展开全文
  • shu01.fbx,树叶模型

    2020-12-09 21:43:15
    shu01.fbx,树木模型,树叶模型。使用方法详见【Unity Shader】树叶晃动效果实现。
  • 监督学习包括线性模型、决策树模型、贝叶斯模型、支持向量机
  • 树模型实战

    2018-10-08 16:48:54
    使用sklearn实战机器学习的树模型包括决策、随机深林等
  • 树模型示例 Qt MV树模型示例,基于文件系统树模型。 测试
  • 银杏树模型

    2015-01-13 21:11:54
    3dmax格式文件树模型。非常实用代理文件
  • 树模型2013

    2013-05-06 16:12:42
    树模型2013
  • 一、树模型与线性模型的融合模型 二、Python sklearn实现GBDT+LR融合模型 一、树模型与线性模型的融合模型 树模型GBDT原理:https://blog.csdn.net/woniu201411/article/details/83114226 线性模型LR原理:...

    目录

    一、树模型与线性模型的融合模型

    二、Python sklearn实现GBDT+LR融合模型


    一、树模型与线性模型的融合模型

    树模型GBDT原理:https://blog.csdn.net/woniu201411/article/details/83114226

    线性模型LR原理:https://blog.csdn.net/woniu201411/article/details/81335863

    海量的离散特征+线性模型LR,因其较高的精度和较少的运算开销在业界广为使用。 线性模型LR无法捕捉到非线性特征对标签的影响,因而提升线性模型精度的有效方法是构造有效的交叉特征。比较成熟的构造交叉特征的方法包含:

    1. 结合业务,构造有效的交叉特征,这种方法对线性模型的精度提升是显著的,但要花费巨大的人力和时间,特别当特征达到上百维时,难以构造有效的交叉特征;
    2. 根据信息增益,分箱划分连续特征,将一个连续特征划分为多个类别特征,为线性模型增加了非线性表达,提高了模型的精度和健壮性。但这种方法构造的非线性特征包含的信息是很有限的;
    3. 离散特征通过笛卡尔积,获取所有的组合特征,但笛卡尔积获取的组合特征呈爆炸式增长,并且很多组合特征是无效的,为线性模型增加了很多噪音。

    2014年faceBook提出了树模型GBDT与线性模型LR的融合模型(Practical Lessons from Predicting Clicks on Ads at Facebook),利用GBDT构造有效的交叉特征,从根节点到叶子节点的路径,代表部分特征组合的一个规则,提升树将连续特征转化为离散特征,可以明显提升线性模型的非线性表达能力,提高线性模型精度

    以下图所示,GBDT构造两棵树,第一棵树有三个叶子节点,第二颗树有两个叶子节点,若训练样本落入第一棵树的第二个叶子节点,第二颗树的第一个叶子节点,GBDT构造的交叉离散特征输出为[0,1,0,1,0],其中前三个元素对应第一棵树的叶子节点,后两个元素对应第二颗树的叶子节点,输出的交叉离散特征作为LR的输入。

    关于GBDT与LR融合模型的思考:

    1、树模型采用集成决策树,而非单颗决策树

    一棵树的表达能力很弱,不足以表达多个有区分性的特征组合,多棵树的表达能力更强一些。GBDT每棵树都在学习前面棵树尚存的不足,迭代多少次就会生成多少颗树。按paper的GBDT+LR融合方式,多棵树正好满足LR每条训练样本可以通过GBDT映射成多个特征的需求。

    2建树采用GBDT而非RF

    RF也是多棵树,但从效果上有实践证明不如GBDT。且GBDT前面的树,特征分裂主要体现对多数样本有区分度的特征;后面的树,主要体现的是经过前N颗树,残差仍然较大的少数样本。优先选用在整体上有区分度的特征,再选用针对少数样本有区分度的特征,思路更加合理,这应该也是用GBDT的原因。

    二、Python sklearn实现GBDT+LR融合模型

    引用包引入:

    import numpy as np
    from sklearn.datasets import make_classification
    from sklearn.linear_model import LogisticRegression
    from sklearn.ensemble import (RandomTreesEmbedding,RandomForestClassifier,GradientBoostingClassifier)
    from sklearn.preprocessing import OneHotEncoder
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import roc_curve,roc_auc_score,accuracy_score,auc

    数据集划分(树模型和线性模型的训练分别用不同数据集,防止过拟合):

    tmp = np.loadtxt("E:\\ensembleModelData.csv",dtype=np.str,delimiter=',')
    data = tmp[1:,2:-1].astype(np.float)
    label = tmp[1:,-1].astype(np.int)
    #data,label = make_classification(n_samples=80000,n_features=30)
    X_train,X_test,Y_train,Y_test = train_test_split(data,label,test_size=0.2)
    X_train_tree,X_train_lr,Y_train_tree,Y_train_lr = train_test_split(X_train,Y_train,test_size=0.5)

    利用网格搜索,获取最优参数:

    for n_estimator in [80,100,150,200,250]:
        for depth in [1,2,3,5]:
            for maxiter in [300,400,500]: 
                GBDT = GradientBoostingClassifier(learning_rate=0.1,n_estimators=n_estimator,max_depth=depth)
                OHE = OneHotEncoder()
                LRGBDT = LogisticRegression(max_iter=maxiter)
    
                GBDT.fit(X_train_tree,Y_train_tree)
                OHE.fit(GBDT.apply(X_train_tree)[:,:,0])
                LRGBDT.fit(OHE.transform(GBDT.apply(X_train_lr)[:,:,0]),Y_train_lr)
                Y_pred_gbdt_lr = LRGBDT.predict_proba(OHE.transform(GBDT.apply(X_test)[:,:,0]))[:,1]
                auc_gbdt_lr = roc_auc_score(Y_test,Y_pred_gbdt_lr)
                print(n_estimator,depth,maxiter,auc_gbdt_lr)

    最终结果为:100,5, 500, 0.9440185179246727

     

    参考资料:

    Practical Lesson from Predicting Clicks on Ads at Facebook

    https://blog.csdn.net/u010352603/article/details/80681100

    https://blog.csdn.net/asdfghjkl1993/article/details/78606268

    https://blog.csdn.net/TwT520Ly/article/details/79769705

    https://scikit-learn.org/stable/auto_examples/ensemble/plot_feature_transformation.html#sphx-glr-download-auto-examples-ensemble-plot-feature-transformation-py

     

    展开全文
  • 决策树模型

    千次阅读 2018-07-02 10:30:38
    决策树模型是一种基本的分类与回归方法。学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型,预测时,对新的数据,利用决策树模型进行分类。决策学习通常包括3个步骤:特征选择、决策的生成,决策...

    • 决策树模型是一种基本的分类与回归方法。
    • 学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型,
    • 预测时,对新的数据,利用决策树模型进行分类。
    • 决策树学习通常包括3个步骤:特征选择、决策树的生成,决策树的剪枝。
    • 常见的决策树模型有ID3(信息增益)、C4.5(信息增益比)、CART算法等。
    展开全文
  • 小叶子树木3D模型

    2021-07-15 02:32:58
    小叶子树木3D模型适用于树木模型设计。
  • 数据预处理之后的决策分类预测,经过了数据去噪和异常值处理。
  • 树模型总结

    千次阅读 2019-08-24 11:39:53
    树模型总结 1.树模型基础介绍。 什么是树模型? 一种基于特征空间划分的具有形分支结构的模型树模型的特点? 方差大、对量纲没有要求、由多条规则组成、能够处理数值型和类别型数据、有较高的解释性。...

    树模型总结

    1.树模型基础介绍。

    1. 什么是树模型? 一种基于特征空间划分的具有树形分支结构的模型。

    2. 树模型的特点? 方差大、对量纲没有要求、由多条规则组成、能够处理数值型和类别型数据、有较高的解释性。

    3. 树模型的优点? 1)需要准备的数据量不大。 2)算法时间的复杂度是用于训练决策树的数据点的对数。 3)能够处理数值型和类别型数据。 4)相对对神经网络,解释性比较强。

    4. 树模型的缺点? 有的规则不具备可解释性、抗干扰能力弱、最优决策划分是NP难问题、对数据不均衡类别倾向数据多的类别。

    2.决策树介绍。

    一切树模型的都是基于特征空间划分的条件概率分布,都具有方差大的特性,对量纲无要求,所以我们先介绍几种条件概率公式:

    条件概率

    定义:设A,B是两个事件,且P(A)>0,称

    为在事件A发生的条件下事件B发生的概率。

     

    全概率

    定理 设随机试验E的样本空间为S,A为E的事件, , ,……, 为样本空间S的一个划分,且P(A)>0,P()>0 (i = 1,2,3,……),则有全概率公式:

    贝叶斯

    定理 设随机试验E的样本空间为S,A为E的事件, , ,……, 为样本空间S的一个划分,且P(A)>0,P()>0 (i = 1,2,3,……),则有贝叶斯公式:

    什么是决策树?决策树是如何工作的?

    决策树是一种监督学习算法(具有预定义的目标变量),它主要用于分类问题,输入和输出变量可以是离散值或连续值。在决策树中,我们根据输入变量中最具有区分性的变量,把数据集或样本分割为两个或两个以上的子集合。

    决策树的类型

    1、分类树:目标为离散变量决策树,具有离散型目标变量的决策树。例如在上述学生分类问题中,目标变量是学生是否玩板球,即“是”或“否”。

    2、回归树:连续变量决策树,具有连续型目标变量的决策树

    树如何决定在哪里分裂?

    分列策略对树的准确率影响很大,回归树和分类树具有不同的决策标准。 常见的几种分裂算法: 1.基尼系数是指,如果我们从样本集中随机选择两个样本点,如果该样本集是纯的,那么这两个样本点属于相同的类的概率是1。适合于“是/否”这种二元分裂。 2.卡方,是找到子节点和父节点之间差别的统计意义。我们通过目标变量的观测值和期望值的标准化差异平方和来衡量。卡方 = ((实际值 - 期望值) / 期望值)^(1/2)。适合于“是/否”这种二元分裂。 3.信息增益, ,为信息出现的概率,易受量纲的影响,C4.5中采用信息增益比。根据信息熵进行分裂的步骤:1)计算父节点的信息熵。2)计算根据每个节点进行分裂的信息熵,计算所有子节点可能分裂的加权平均。

    树模型的关键参数是什么?决策树中如何避免过拟合?

    1)剪枝。

    2)特征尽量避免使用连续型变量,

    3)减小树的深度。

    4)节点分裂的最小样本数,太高的值会导致欠拟合,因此需要使用CV(交叉验证)进行调参。

    5) 叶节点中的最小样本数 .

    6)叶节点的最大数目。

    7)考虑分裂的最大特征个数。

    树模型比线性模型更好么?决策树的优缺点?

    不一定,线性回归可以解决回归问题,逻辑回归可以解决分类问题,为什么还要使用树模型呢:

    1、如果因变量和自变量的关系能用线性模型很好地近似表达,线性回归会优于树模型。

    2、如果因变量和自变量的关系是高度非线性和非常复杂关系,树模型会优于经典回归方法。

    3、如果你需要构建一个易于解释的模型,决策树模型总会比线性模型更好。决策树模型甚至比线性回归模型更容易解释。

    优点

    1、易于理解:决策树的输出是非常容易理解的,即使是对于没有数据分析背景的人。它不需要任何统计知识去阅读和解释。它的图形标识非常直观,用户可以很容易地和他们的假设联系在一起。

    2、在数据探索中非常有用:决策树是发现最相关的两个或多个变量关系的最快速的方式之一。在决策树的帮助下,我们可以创建新的具有更强预测能力的变量/特征,可以参考这篇文章(提升回归模型的技巧)。它还可以用于数据探索阶段。例如,我们正在研究一个具有数百个变量信息的问题,决策树可以帮助我们确定最重要的哪些变量。

    3、需要更少的数据清洗:相对于其他建模技术,决策树需要较少的数据清洗。它不会收到离群点和缺失值的特别大的影响。

    4、数据类型不受约束:决策树可以处理数值型和离散型数据变量。

    5、非参数方法:决策树是一个非参数方法。这意味着它不对数据的空间分布和分类结构做任何假设。

    缺点

    1、过拟合:过拟合是决策树最难处理的困难之一,这个问题通过设置模型参数和剪枝(下面讨论)来解决。

    2、不适合于连续型变量:当处理连续数值型变量时,当决策树把连续变量划分成一系列离散值的时候会导致信息丢失

    3.集成学习Bagging之RF介绍。

    基于树模型的集成方法有哪些?

    集成学习(Ensemble Methods)使用一组预测相同目标的模型通过投票、加权平均、梯度提升等组合方法,多多个弱学习模型进行组合。

    偏差和方差的问题?

    几乎所有的模型都有偏差和方差问题,偏差表示预测值与目标值之间偏离程度,方差表示是指同一个数据集在模型预测结果的差异程度。(通常是样本目标异常导致的)

    通常,当你增加模型复杂度,你会看到由于模型的偏差降低,预测错误率会降低。当你持续提升模型复杂度,会导致模型过拟合,你的模型会产生高偏差。

    常用的集成方法

    Bagging、Boosting和Stacking

    Bagging的工作原理

    1)有放回抽样多个数据集建模形成多个分类器。 2)对多个分类器结果进行投票处理。 典型代表RF随机森林。

    Boosting的工作原理?

    1)初始化每个训练样本相同的权重。

    2)每次训练更新一次权重,对分类错误的样本重采样时加大权重。

    典型代表:AdaBoost、GBDT。

    stacking的工作原理?

    对多个学习器的预测结果作为新模型的输入重新训练。

    Random Forest

    RF的工作原理?

    1)随机放回抽样训练样本。(列采样,行采样) 2)随机选择特征。 3)构建决策树。 4)分类:投票。回归:平方误差最小化。

    RF有两个随机采样过程

    有放回的随机采样-bootstrap采样: 行采样:采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本 列采样: 从M个feature中,选择m个(m << M)

    RF的特点?

    放回抽样,特征和样本随机采样,无剪枝,投票,可以减小方差,CART若学习器。

    RF的优缺点

    优点

    1)可以处理高维数据 2)减小了单模型的方差和偏差。 3)可以计算特征的重要程度。

    劣势

    1)对于回归问题RF的精准度不够。 2)抗噪声干扰能力弱,无法自动处理异常样本。 3)模型越深越容易过拟合。

    4.集成学习Boosting之GBDT、XGBOOST、LightGBM等介绍。

    GBDT的算法特点?

    1)与传统Boosting(Adaboost)不同,每次计算不是减小残差而是消除残差。

    2)每次重新建模都是往残差减小的方向进行建模,在Gradient Boost时利用loss function负梯度方向的残差拟合新的CART回归树。这里损失函数和logistics一样采用logloss= ,这里Gradient Boost与Gradient Descent 不同,GD是针对可微分的函数,使解往梯度负方向迭代,对下一次迭代做一阶泰勒展开: ,set,,一直迭代直到,函数收敛,停止迭代,r为学习率。泰勒展开就是一种对于f(x)在x=处n阶可导。利用多项式对函数进行逼近。

    3) 弱学习器只能是CART回归树。

    4)GBDT做分类时,每一次迭代需要有k棵树,k是类别数目,每棵树对一个类别进行预测。每个叶子节点也只是输出一个值,可把这颗树看作一个函数f,f将输入样本的特征映射为该值。(注意,该值并不是类别的概率,概率还需要一个logistic转化,logistic regression是:特征x先转化成实值z,然后z经过logistic regression转化成概率p(x),这里叶子节点的值相当于z)。

    参考:https://blog.csdn.net/xsqlx/article/details/51330627

    GBDT与RF比较?

    1)都是由多棵树组成。

    2)GBDT用于分类,每个CART数的结果是概率。

    3)RF结果是投票,GBDT结果是加权求和。

    4)RF偏重与减小方差,提高稳定性。GBDT偏重与提高偏差,提高精准率。

    5)GBDT对异常值敏感,RF不敏感。

    6)RF对采样的训练集不加以区分,GBDT按照偏差进行权重处理。

     

    XGBoost的特点?

    论文: https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf Slide : https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf 总结:http://blog.csdn.net/sb19931201/article/details/52557382

    原论文:https://arxiv.org/pdf/1603.02754v1.pdf

    1)XGBoost是陈天奇读博的时候针对GBDT改进的一个可扩展的端到端树增强系统xgboost,工程源码非常具有研读的价值。

    2)稀疏数据感知,对拥有大量缺失值的数据做one-hot编码,单独分裂节点进行处理。

    3)采用加权分位数法来搜索近似最优分裂节点,提供特征排序和数据压缩功能,都属内存操作,因此内存消耗较大。

    4)C++并行分布式计算框架。

    5)弱分类器支持线性分类器:逻辑回归和线性回归;也支持树分类器:gbdt。

    6)对t次迭代后的误差函数进行二次泰勒展开使得loss function在下一个点损失最小,以此作为分裂条件,这里与CART取均方误差最小为分裂不同。

    7)损失函数中加入了正则化。

    8)xgboost分裂和GBDT一样采用了贪心算法。

     

    XGBoost与GBDT比较?

    1)GBDT只能以CART作为基分类器,xgboost还支持线性分类器,此时xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。 可以通过booster [default=gbtree]设置参数:gbtree: tree-based、models/gblinear: linear models

    2)GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。 —对损失函数做了改进(泰勒展开,一阶信息g和二阶信息h)

    3)论文中2.1 Regularized Learning Objective,xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性 —正则化包括了两个部分,都是为了防止过拟合,剪枝是都有的,叶子结点输出L2平滑是新增的。

    4)shrinkage and column subsampling —还是为了防止过拟合,论文2.3节有介绍。

    (1)shrinkage缩减类似于学习速率,在每一步tree boosting之后增加了一个参数n(权重),通过这种方式来减小每棵树的影响力,给后面的树提供空间去优化模型。

    (2)column subsampling列(特征)抽样,说是从随机森林那边学习来的,防止过拟合的效果比传统的行抽样还好(行抽样功能也有),并且有利于后面提到的并行化处理算法。

    5)split finding algorithms(划分点查找算法):— (1)exact greedy algorithm—贪心算法获取最优切分点 ,通过每次尝试分裂一个叶节点,计算分裂前后的增益,选择增益最大的。 (2)approximate algorithm— 近似算法,提出了候选分割点概念,先通过直方图算法获得候选分割点的分布情况,然后根据候选分割点将连续的特征信息映射到不同的buckets中,并统计汇总信息。详细见论文3.3节 (3)Weighted Quantile Sketch—分布式加权直方图算法,论文3.4节 这里的算法(2)、(3)是为了解决数据无法一次载入内存或者在分布式情况下算法(1)效率低的问题,以下引用的还是wepon大神的总结:

    可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。

    6.对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。 —稀疏感知算法,论文3.4节,Algorithm 3: Sparsity-aware Split Finding

    7.Built-in Cross-Validation(内置交叉验证)

    XGBoost allows user to run a cross-validation at each iteration of the boosting process and thus it is easy to get the exact optimum number of boosting iterations in a single run. This is unlike GBM where we have to run a grid-search and only a limited values can be tested.

    8.continue on Existing Model(接着已有模型学习)

    User can start training an XGBoost model from its last iteration of previous run. This can be of significant advantage in certain specific applications. GBM implementation of sklearn also has this feature so they are even on this point.

    9.High Flexibility(高灵活性)

    XGBoost allow users to define custom optimization objectives and evaluation criteria. This adds a whole new dimension to the model and there is no limit to what we can do.

    10.并行化处理 —系统设计模块,块结构设计等

    xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

    此外xgboost还设计了高速缓存压缩感知算法,这是系统设计模块的效率提升。 当梯度统计不适合于处理器高速缓存和高速缓存丢失时,会大大减慢切分点查找算法的速度。 (1)针对 exact greedy algorithm采用缓存感知预取算法 (2)针对 approximate algorithms选择合适的块大小

    Light GBM与XGBoost比较?

    1)微软出的一个比xgboost更加高效的一个分布式Boosting树模型。

    2)histogram算法,基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点;优点在于决策树生长策略上。

    3)XGBoost采用的是带深度限制的level-wise生长策略,Level-wise过一次数据可以能够同时分裂同一层的叶子,容易进行多线程优化,不容易过拟合;但不加区分的对待同一层的叶子,带来了很多没必要的开销(因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂)·

    4)LightGBM采用leaf-wise生长策略,每次从当前所有叶子中找到分裂增益最大(一般也是数据量最大)的一个叶子,然后分裂,如此循环;但会生长出比较深的决策树,产生过拟合(因此LightGBM 在leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合)。

    5)比xgboost更快的训练速度和更高的效率:LightGBM使用基于直方图的算法。例如,它将连续的特征值分桶(buckets)装进离散的箱子(bins),这是的训练过程中变得更快。

    6)更低的内存占用:使用离散的箱子(bins)保存并替换连续值导致更少的内存占用。

    7)更高的准确率(相比于其他任何提升算法) :它通过leaf-wise分裂方法产生比level-wise分裂方法更复杂的树,这就是实现更高准确率的主要因素。然而,它有时候或导致过拟合,但是我们可以通过设置 max-depth 参数来防止过拟合的发生。

    8)大数据处理能力:相比于XGBoost,由于它在训练时间上的缩减,它同样能够具有处理大数据的能力。支持进程粒度的并行学习 。

    对比项XGBoostLightGBM
    正则化L1/L2L1/L2
    列采样yesyes
    Exact Gradientyesyes
    近似算法yesno
    稀疏数据yesyes
    分布式并行yesyes
    缓存yesno
    out of coreyesno
    加权数据yesyes
    树增长方式level-wiseleaf-wise
    基于算法pre-sortedhistgram
    最大树深度控制
    dropoutnoyes
    Baggingyesyes
    用途回归、分类、rank回归、分类、lambdrank
    GPU支持noyes
    网络通信point-to-pointcollective-communication
    CategoricalFeatures无优化优化
    Continued train with input GBDT modelnoyes
    Continued train with inputnoyes
    Early Stopping(both training and prediction)noyes

    LightGBM的重要参数

    task:默认值=train,可选项=train,prediction;指定我们希望执行的任务,该任务有两种类型:训练和预测;

    application:默认值=regression,type=enum,options=options

    regression:执行回归任务;

    binary:二分类;

    multiclass:多分类;

    lambdarank:lambrank应用;

    data:type=string;training data,LightGBM将从这些数据中进行训练;

    num_iterations:默认值为100,类型为int。表示提升迭代次数,也就是提升树的棵树;

    num_leaves:每个树上的叶子数,默认值为31,类型为int;

    device:默认值=cpu;可选项:cpu,gpu。也就是我们使用什么类型的设备去训练我们的模型。选择GPU会使得训练过程更快;

    min_data_in_leaf:每个叶子上的最少数据;

    feature_fraction:默认值为1;指定每次迭代所需要的特征部分;

    bagging_fraction:默认值为1;指定每次迭代所需要的数据部分,并且它通常是被用来提升训练速度和避免过拟合的。

    min_gain_to_split:默认值为1;执行分裂的最小的信息增益;

    max_bin:最大的桶的数量,用来装数值的;

    min_data_in_bin:每个桶内最少的数据量;

    num_threads:默认值为OpenMP_default,类型为int。指定LightGBM算法运行时线程的数量;

    label:类型为string;指定标签列;

    categorical_feature:类型为string;指定我们想要进行模型训练所使用的特征类别;

    num_class:默认值为1,类型为int;仅仅需要在多分类的场合。

     

    5.深度森林GCF介绍。

    深度森林(Deep Forest)是周志华教授和冯霁博士在2017年2月28日发表的论文《Deep Forest: Towards An Alternative to Deep Neural Networks》中提出来的一种新的可以与深度神经网络相媲美的基于树的模型,其结构如图所示。

    文中提出的多粒度级联森林(Multi-Grained Cascade Forest)是一种决策树集成方法,性能较之深度神经网络有很强的竞争力。相比深度神经网络,gcForest有如下若干有点:

    1. 容易训练,计算开销小 2.天然适用于并行的部署,效率高 3. 超参数少,模型对超参数调节不敏感,并且一套超参数可使用到不同数据集 4.可以适应于不同大小的数据集,模型复杂度可自适应伸缩 5. 每个级联的生成使用了交叉验证,避免过拟合 6. 在理论分析方面也比深度神经网络更加容易。

    Paperhttps://arxiv.org/abs/1702.08835v2 Githubhttps://github.com/kingfengji/gcForest Websitehttp://lamda.nju.edu.cn/code_gcForest.ashx

    南京大学机器学习与数据挖掘研究所提供了基于Python 2.7

    多粒度级联森林算法解读

    多粒度级联森林的结构主要分为多粒度扫描、级联森林两个部分。

     

    从上面的图可以看出,假设原始数据是400维的,然后分别用大小为100,200,300的窗口进行滑动,分别得到301 * 100,201 *100, 101 * 100的数据,也就是得到了301,201,101个实例为100维,200维,300维的子样本数据,这些数据其实都是一个样本里面的特征,不是有301个样本,不过这里为了好理解就将这301个当成了子样本,这一步有点k折交叉采样的意思,然后分别将这批数据送到级联随机森林里面,这里的随机森林是成对出现的,一个是普通随机森林一个是完全随机森林,为了增加集成学习的多样性。完全随机森林和普通随机森林的不同点在于,完全随机森林中的每棵树通过随机选择一个特征在树的每个节点进行分割实现生成,树一直生长,直到每个叶节点只包含相同类的实例或不超过10个实例。类似地,普通每个随机森林也包含1000棵树,通过随机选择数量的特征作为候选(d是输入特征的数量),然后选择具有最佳 gini 值的特征作为分割。每个森林中的树的数值是一个超参数。假设一个随机森林的分类之后的类别个数是3个,一个样本经过一个随机森林后就得到了一个3维的概率分布,之前我们分别得到了301,201,101个样本,那么这3批样本进入一个随机森林以后得到的概率就有903,603,303个了,图中每一批次用了2个随机森林,那么最后得到的概率的个数就有了903 X 2, 603 X 2, 303 X 2.然后将这些概率拼接称一个,就变成了一个3618dim的数据了,到这里,多粒度扫描的步骤完成了,多粒度扫描的过程就相当于特征的提取,下面是级联森林的过程了。可以看作一个smote过程。

    将得到的3618维的数据x送到随机森林里面,每个随机森林又得到了一个3维的数据,图中level 1用了4个随机森林,其中上面两个黑色的是完全随机森林,下面的两个是普通随机森林,这样就得到了4个3维的密度数据,再将原先的x,拼接起来就变成了3618 + 12 = 3630维的数据了,将这个数据作为下一层的输入,之后又得到4个3维的数据,再和原始的x拼接,得到3630维的术数据,作为下一层的输入,这样传递到最后一层,就不用将原来的数据再拼接起来了,因为它是最后一层了,不需要再拼接起来作为下一层的输入了,最后输出4个3维的数据,将这4个3维的数据取平均,得到一个3维的数据,然后在这个3维的数据里面取最大的,作为预测。整个多粒度级联森林的层数是自适应调节的,在级联森林的构造阶段,只要构造当前层时,经过交叉验证的验证准确率相比于前一层没有提升,那么级联森林的构造就此停止,整个结构也就完成了。

     

    • 注: 多粒度扫描实际上是一个类似卷积滑窗极限特征提取和过采样的过程, 经过特征之间的不断卷积和过采样,该过程极耗内存,一味追求精准度。

     

     

    总结

    树模型是生成规则的利器,但是由于数据量不足和样本的噪声和错误,可能会造成提取出来的规则错误。

    展开全文
  • 树模型(五):GBDT

    万次阅读 多人点赞 2016-04-19 11:19:16
    提升树模型可以表示为决策的加法模型: 其中,表示决策;为决策的参数;M为的个数2.学习过程回归问题提升使用以下前向分布算法:在前向分布算法的第m步,给定当前模型,需求解得到,即第m棵的参数当
  • GBDT决策树模型开发代码,详细的说明见https://blog.csdn.net/iqdutao/article/details/107698851
  • 所谓的回归树模型其实就是用模型来解决回归问题,树模型当中最经典的自然还是决策树模型,它也是几乎所有树模型的基础。虽然基本结构都是使用决策,但是根据预测方法的不同也可以分为两种。第一种,上的叶子...
  • Google SketchUp 2d树模型

    2012-11-15 18:04:16
    自己搜集的2d树模型,比较常用。内有多个树模型,比较常用的冬景等等
  • 我选用了一个经典数据集来展示如何构建一个决策树模型,这个数据集是——Iris 鸢尾花数据集。里面有我进行数据预处理,分析,优化参数,训练模型以及最终分析决策的代码。
  • 三叉树模型的矩阵算法,金翠翠,冯勤超, 叉方法是期权定价中一种重要的数值方法,目前对三叉树模型的研究只存在以组合数的形式给出的结果,计算比较烦琐。本文以欧式�

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 352,930
精华内容 141,172
关键字:

树模型