上一节说过随机森林(Random Forest,RF)算法是一种重要的基于Bagging 的集成学习算法,它可以用来做分类、回归等问题。下面就分类问题展开学习。
一、随机森林算法模型
RF 在以决策树为基学习器构建 Bagging 集成的基础上,进一步在决策树的训练过程中引入随机属性选择,具体的就是传统决策树在选择划分属性时是在当前节点的属性集合(假设有 d 个属性)中选择一个最优的属性;而在 RF 中,对基决策树的每个节点,先从该节点的属性集合中随机选择一个包含 k 个属性的集合,然后再从这个子集中选择一个最优属性用于划分。若 k=d,则基决策树的构建和传统决策树相同,若 k=1,则是随机选择一个属性进行划分,一般推荐
RF 其实质是对决策树算法的一种改进,将多个决策树合并在一起,每棵树的建立依赖于一个独立抽取的样本,森林中每棵树具有相同的分布,分类误差取决于每一棵树的分类能力和他们之间的相关性。
随机森林简单、容易实现、计算开销小,被誉为“代表集成学习技术水平的方法“。在 Bagging 算法中基学习器的多样性仅通过样本扰动而不同,但是在 RF 算法中不仅通过样本扰动还通过自属性扰动,最终会使得集成的泛化能力通过个体学习器之间差异度的增加而进一步提升。在引入属性扰动,随机森林中个体学习器的性能往往降低,但是随着个体学习器数目的增加,随机森林往往通常会收敛到更低的泛化误差。Bagging 使用的是确定性决策树,在选择划分属性时要对结点的所有属性进行考察,而随机森林使用的随机型决策树则只考察一个属性子集。
RF的主要缺点有:
- 在某些噪音比较大的样本集上,RF模型容易陷入过拟合;
- 取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。
RF的主要优点有:
- 训练可以高度并行化,对于大数据时代的大样本训练速度有优势;
- 由于可以随机选择决策树节点划分特征,这样在样本特征维度很高的时候,仍然能高效的训练模型;
- 由于采用了随机采样,训练出的模型的方差小,泛化能力强;
- 相对于Boosting系列的Adaboost和GBDT, RF实现比较简单;
- 对部分特征缺失不敏感。
二、算法流程
- 假设训练样本的个数为 m,则对每一棵决策树的输入样本的个数都为 m,这 m 个样本是通过从训练集中有放回地随机抽取得到;
- 假设训练样本特征的个数为 n,对每一棵决策树的样本特征是从 n 个特征中随机挑选 k 个,然后从这 k 个输入特征中选择一个最优的进行分裂;
- 每棵树都这样分裂,直到该结点的所有训练样例都属于同一类,决策树分裂过程不需要剪枝。
三、Python 实现随机森林训练
首先构建 CART 分类树,predict 函数利用构建好的 CART 树模型对样本进行预测,pickle 模块用于保存和导入训练好的随机森林RF 模型, 要计算 Gini 指数, 需要用到 pow 函数。保存到 tree.py 中:
from math import pow
class node:
'''树的节点的类
'''
def __init__(self, fea=-1, value=None, results=None, right=None, left=None):