用深度神经网络(DNN)的思路来组织随机森林(RF),极大地提高了随机森林的准确率
pip install deep-forest
用法详见测试代码
deepforest.CascadeForestClassifier:对Deep Forest的实现;
deepforest.DecisionTreeClassifier:Deep Forest的树的实现;
分类的类别需从0开始标记,即label={0,1,2…}
对**深度神经网络(DNN)**成功的原因分析:
DNN的缺陷:
从DNN:
从DNN中观察到,在DNN每层的传播中,**数据特征(feature)**越来越集中,越来越抽象。
DNN的成功和模型复杂度关系不大,否则为什么无限扩大模型参数量并不能提升模型效果?;
DNN的层次性和决策树的层次性不一样:
从集成学习(Ensemble Learning)
要做好集成学习,每个学习单元(learner)要做到准确(accurate) 多样(diverse);
实践中常常会通过技巧提高模型的多样性:
数据采样(data sample manipulation):
从原始数据集中采样出不同的子训练集来训练不同的学习单元(learner);
例如:
Bagging中的bootstrap sampling;
AdaBoost中的sequential importance sampling;
输入特征采样(input feature manipulation):
从原始的数据特征中采样出不同的子特征(feature)生成子空间(subspace),训练不同的学习单元(learner);
学习参数区别(learning parameter manipulation):
不同的**学习单元(learner)**采用不同的参数训练;
输出表征区别(output representation manipulation):
对不同的学习单元使用不同的表征(representation);
层次森林结构(Cascade Forest Structure)
每一层从其前面的层获取数据,再将数据传递到下一层;
每一层都是随机森林的集成;
每个森林中的树个数作为超参数;
图中:
黑色森林是随机森林(random forest);
每个森林包括500棵随机树,树的每个节点从随机选择的 d \sqrt{d} d(d是特征个数)个候选特征中按照gini系数选择一个特征来切分;
蓝色森林是完全随机树森林(completely-random tree forest);
每个森林包括500棵完全随机树,树的每个节点会从所有的特征中选择一个特征切分出来,树生长直到完全是叶子;
假设数据分为三类,每个随机森林将输出三维向量,然后将所有向量连接(concatenate)作为输出;
为了减小过拟合(overfitting)风险,每个随机森林的输出都使用K折交叉验证(k-fold cross validation):
卷积特征提取(Multi-Grained Scanning)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ed6IuvGo-1612276362115)(./.md/p3.png)]
用一个一维或者二维的窗口扫描原数据,将窗口数据提取出来作为新特征;
将新特征送入训练,再将结果连接起来,作为最终的输出结果;
有可能某些新特征与结果丝毫没有关系(例如:需要识别一张图片的汽车,但提取出来的小片段不包含任何相关内容),这时,可以把新特征看成一种output representation manipulation,可以提高模型的多样性;
当新特征太多时,可以对其进行采样;
anipulation**,可以提高模型的多样性;