由前文讨论可知,我们在实现 RF 算法之前,需要先在决策树模型的生成过程中加一个参数、使得我们能够对特征选取加入随机性。这个过程相当平凡,下给出代码片段以进行粗略的说明。首先在CvDBase
的fit
方法中加入一个参数feature_bound
:
|
|
然后在同一个方法里面、把这个参数传给CvDNode
的fit
方法:
|
|
在CvDNode
的fit
方法中,原始代码中有一个对可选特征空间的遍历:
|
|
根据参数feature_bound
对它加入随机性:
|
|
然后要在同一个方法里面、把feature_bound
传给_gen_children
方法,而在_gen_children
中、再把feature_bound
传给子节点的fit
方法即可
以上所有实现细节可参见这里中的 Tree.py 和 Node.py
有了这些准备,我们就可以来看看 RF 的算法陈述了(以分类问题为例):
- 输入:训练数据集(包含 N 个数据)、决策树模型、迭代次数 M
- 过程:
- 对:
- 通过 Bootstrap 生成包含 N 个数据的数据集
- 利用和输入的决策树模型进行训练,注意不用对训练好的决策树模型进行剪枝。同时需要注意的是,在训练决策树的过程中、每一步的生成都要对特征的选取加入随机性
- 对个体决策树进行简单组合。不妨用符号表示类别在 M 个决策树模型的决策中出现的频率,那么:
- 对:
- 输出:最终分类器
从算法即可看出随机森林算法的实现(在实现好决策树模型后)是相当平凡的,需要额外做的工作只有定义一个能够计算上述算法第 2.2 步中的函数而已:
|
|
需要指出的是,most_appearance
函数用到了 Numpy 中的unique
方法、它和标准库collections
中的Counter
具有差不多的用法。举个小栗子:
|
|
这两行代码会返回:
|
|
换句话说,unique
方法能够提取出一个 Numpy 数组中出现过的元素并对它们计数、同时输出的 Numpy 数组是经过排序的
以上就完成了一个简易可行的随机森林模型的实现,我们可以把对随机森林模型的评估与对 AdaBoost 的评估放在一起进行以便于对比、这里就先按下不表