小菜鸟对周志华大神gcForest的理解

作者:王相军,腾讯助理工程师,毕业于哈尔滨工业大学,腾讯CDG征信中心员工,乐于分享,希望大家一起学习,共同进步!

导语

花了一下午时间学习了周志华教授的新paper——《Deep Forest: Towards An Alternative to Deep Neural Networks》,论文主要介绍了一种新的集成机器学习方法——gcForest,其核心思想是:利用级联森林(决策树集成)方法去学习生成模型,一定程度上可以弥补DNN的部分劣势!(强烈说明:作为一个小菜鸟,里面有很多都是自己的个人理解,不对的地方希望看到的大神多多指教,感激不尽!!! )

一、DNN和gcForest的优缺点

DNN

1)DNN需要大的样本集,在小样本数据集上表现不可观;

2)DNN本身就是复杂的模型,所以训练过程很复杂,需要大量的复杂计算;

3)参数太多,需要花费大量的调参时间。(坊间流行一句话:DNN的训练更像是艺术,而不是科学或者工程);

4)DNN在大数据集上的效果确实很好。

gcForest

1)gcForest在大数据集上的表现和DNN分庭抗礼,在小数据集上也表现很好;

2)参数少,调参简单,在很多领域的不同数据集上,使用默认设置,结果都很好;

3)训练过程简单、理论体系更易懂;

4)执行效率高,gcForest在一台PC上的效率相当于DNN在GPU机器上的效率;

5)并行度高,作为Forest,有着天然的高并行性。

二、gcForest的方法论

gcForest的核心主要包括两大块:级联森林(Cascade Forest)和多粒度扫描(Multi-Grained Scanning)。

1、级联森林(Cascade Forest)

级联森林的构成:级联森林的每一层都是由好多个森林(既有随机森林,又有完全随机森林)组成,而每一个森林又是由好多个决策树(Decision Tree)组成,所以这种组合是集成的集成!其中每一层的随机森林和完全随机森林保证了模型的多样性!具体的级联森林结构如下图1所示。

图1 级联森林结构图

图1中的级联森林每一层包括两个完全随机森林(黑色)和两个随机森林(蓝色)。每个完全随机森林包含1000个完全随机的决策树,每个决策树的每个节点都是随机选择一个特征做分裂,直至每一个叶节点包含的实例属于同一个类,或者实例数目不多于10个;每个随机森林也是1000个决策树,每个决策树的生成是随机选择sqrt(d)个特征(d输入的总特征),每次选择gini值最高的做分裂。

级联森林的迭代终止条件:迭代到效果不能提升就停止!!!

级联森林中每个森林是如何决策的呢?

每个森林中都包括好多棵决策树,每个决策树都会决策出一个类向量结果(以3类为例,下面也是),然后综合所有的决策树结果,再取均值,生成每个森林的最终决策结果——一个3维类向量!每个森林的决策过程如下图2所示。

图2 每个森林的决策过程(决策树中的叶子颜色代表不同的类)

这样,每个森林都会决策出一个3维类向量,回到图1中,级联森林中的4个森林就都可以决策出一个3维类向量,然后对4个*3维类向量取均值,最后取最大值对应的类别,作为最后的预测结果!

2、多粒度扫描(Multi-Grained Scanning)

多粒度扫描是为了增强级联森林,为了对特征做更多的处理的一种技术手段。具体扫描过程如下图3所示。

图3 多粒度扫描过程

图3是分别对序列数据和图像数据的原始输入特征做Multi-Grained Scanning处理的过程。

对于序列数据,假设我们的输入特征是400维,扫描窗口大小是100维,这样就得到301个100维的特征向量,每个100维的特征向量对应一个3分类的类向量,即得到:301个*3维类向量!最终每棵森林会得到903维的衍生特征变量!

于图像数据的处理和序列数据一样,图像数据的扫描方式当然是从左到右、从上到下,而序列数据只是从上到下。

当然,可以用各种尺寸不等的扫描窗口去扫描,这样就会得到更多的、更丰富的特征关系!

三、整体实现

整个实现过程附上一张大图4。

图4 gcForest算法的实现流程图

四、结果分析

1、在大数据集上,分别和DNN类、LR、RF、SVM等算法做了对比。

1)图像分类(数据集:MNIST):略低于DNN,基本持平(99.05%与98.96%);

2)人脸识别(数据集:ORL):人脸图像数量不同时,gcForest都最好;

3)音乐分类(数据集:GTZAN):gcForest最好(65.67%);

4)手部运动识别(数据集:sEMG):gcForest最好(55.93%);

5)情感分类(数据集:IMDB):gcForest最好(89.32%)。

2、在几个小数据集上表现和很好。

五、总结

作为小菜鸟新人,自己写这篇文章的初衷只是简单的学习分享,把自己看到的觉得还不错的东西记录下来,以供交流学习;自己对DNN的了解也有限,所以,这篇文章也没有任何要抨击DNN的意思,自己也没有这个实力(这是重点,哈哈哈)!

最后,如果本文有写的不对的地方,请看到的大神不吝赐教!谢谢。。

相关推荐

DI-X深度学习平台

人人都可以做深度学习应用:入门篇(上)

人人都可以做深度学习应用:入门篇(下)

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏alexqdjay

HashMap 多线程下死循环分析及JDK8修复

1.2K4
来自专栏后端之路

LinkedList源码解读

List中除了ArrayList我们最常用的就是LinkedList了。 LInkedList与ArrayList的最大区别在于元素的插入效率和随机访问效率 ...

21110
来自专栏ml

朴素贝叶斯分类器(离散型)算法实现(一)

1. 贝叶斯定理:        (1)   P(A^B) = P(A|B)P(B) = P(B|A)P(A)   由(1)得    P(A|B) = P(B|...

3627
来自专栏xingoo, 一个梦想做发明家的程序员

AOE关键路径

这个算法来求关键路径,其实就是利用拓扑排序,首先求出,每个节点最晚开始时间,再倒退求每个最早开始的时间。 从而算出活动最早开始的时间和最晚开始的时间,如果这两个...

2647
来自专栏Phoenix的Android之旅

Java 集合 Vector

List有三种实现,ArrayList, LinkedList, Vector, 它们的区别在于, ArrayList是非线程安全的, Vector则是线程安全...

692
来自专栏项勇

笔记68 | 切换fragmengt的replace和add方法笔记

1524
来自专栏拭心的安卓进阶之路

Java 集合深入理解(6):AbstractList

今天心情比天蓝,来学学 AbstractList 吧! ? 什么是 AbstractList ? AbstractList 继承自 AbstractCollec...

20910
来自专栏聊聊技术

原 初学图论-Kahn拓扑排序算法(Kah

3018
来自专栏Hongten

ArrayList VS Vector(ArrayList和Vector的区别)_面试的时候经常出现

2352
来自专栏MelonTeam专栏

ArrayList源码完全分析

导语: 这里分析的ArrayList是使用的JDK1.8里面的类,AndroidSDK里面的ArrayList基本和这个一样。 分析的方式是逐个API进行解析 ...

4749

扫码关注云+社区