集成学习(ensemble learning)之RandomForest

来源:互联网 发布:js dom appendchild 编辑:程序博客网 时间:2024/05/22 15:27

Bagging算法原理
Bagging基于自助采样法(bootstrap sampling)。给定包含N个样本的训练数据集D,自助采样法是这样进行的:先从D中随机取出一个样本放入采样集Ds中,再把该样本放回D中(有放回的重复独立采样)。经过N次随机采样操作,得到包含N个样本的采样集Ds。
值得一提的是:自助采样过程还给Bagging带来了另一个优点:由于每个基学习器只使用了初始训练集中约63.2%的样本,剩下约36.8%的样本可用作验证集来对泛化性能进行“包外估计”,即仅考虑那些未使用x训练的基学习器在x上的预测。

Bagging首先采用M轮自助采样法,获得M个包含N个训练样本的采样集。然后,基于这些采样集训练出一个基学习器。最后将这M个基学习器进行组合,组合策略为:

  • 分类任务采取简单投票法,即每个基学习器一票
  • 回归任务使用简单平均法,即每个基学习器的预测值取平均值。

随机森林(Random Forest,RF)
RF是一种以决策树为基学习器的Bagging算法,但RF在决策树的训练过程中引入了随机属性选择。

  • 传统决策树在选择划分属性时,每次选择一个最优属性
  • 在RF中构建决策树,选择节点的划分属性时:
    1)首先从该节点的属性集合中随机选择一个包含k个属性的子集
    2)然后再从这个子集中选择一个最优属性用于划分
    如果k=n(其中n为当前节点的属性的数量),则RF中决策树的构建与传统决策树相同。如果k=1,则随机选择一个属性用于划分。

虽然,随机森林对Bagging值做了小改动,但是与Bagging中基学习器的“多样性”仅通过对样本扰动(通过对初始训练集采样)而来不同,随机森林中基学习器的多样性不仅来自样本扰动,还来自属性扰动,这就使最终集成的泛化性能可通过个体学习器之间差异度的增加而进一步提升。

多样性增强
集成学习中,个体学习器多样性越大越好。通常,为了增大个体学习器的多样性,在学习过程中引入随机性。常见的方法有:对数据样本进行扰动、对输入属性进行扰动、对算法参数进行扰动三种。
数据样本扰动:给定初始数据集,可以使用采样法从中产生出不同的数据子集。然后再利用不同的数据子集训练出不同的个体学习器。这种方法简单高效,使用广泛。

  • 数据样本扰动对“不稳定基学习器”很有效。“不稳定基学习器”是这样的一类学习器:训练样本稍加变化就会导致学习器有显著的变动,如决策树、神经网络等。
  • 数据样本扰动对“稳定基学习器”无效。“稳定基学习器”是这样的一类学习器:学习器对数据样本的扰动敏感,如线性学习器、支持向量机、朴素贝叶斯、k近邻学习器等。

输入属性扰动:训练样本通常由一组属性来描述,可以基于这些属性的不同组合产生不同的数据子集,然后再利用这些数据子集训练出不同的个体学习器。

  • 若数据包含了大量冗余属性,则输入属性扰动的效果较好。此时不仅训练出了多样性大的个体,还会因为属性数量的减少而大幅节省时间开销。同时由于冗余属性多,即便减少了一些属性,训练的个体学习器也不会很差。
  • 若数据只包含了少量属性,则不适宜采用输入属性扰动法。

算法参数扰动: 通常可以通过随机设置不同的参数,从而产生差别较大的个体学习器。

scikit-learn基于随机森林算法提供了两个模型:
RandomForestClassifier用于分类问题
RandomForestRegressor用于回归问题

RandomForestClassifier随机森林分类器
ensemble.RandomForestClassifier()

参数

  • n_estimators:一个整数,指定了随机森林中决策树的数量
  • criterion:一个字符串,指定了每棵决策树的criterion参数
  • max_features:一个整数或浮点数或字符串或None,指定了每棵决策树的max_features参数
  • max_depth:一个整数或None,指定了每棵决策树的max_depth参数
  • min_samples_split:一个整数,指定了每棵决策树的min_samples_split参数
  • min_samples_leaf:一个整数,指定了每棵决策树的min_samples_leaf参数
  • min_weight_fraction_leaf:一个浮点数,指定了每棵决策树的min_weight_fraction_leaf参数
  • max_leaf_nodes
  • boostrap:为布尔值。如果为True,则使用采样法bootstrap sampling来产生决策树的训练数据集
  • oob_score:布尔值,如果为True,则使用包外样本来计算泛化误差
  • n_jobs:一个整数,指定并行性。如果为-1,则表示将训练和预测任务派发到所有CPU上
  • random_state
  • verbose:一个整数。如果为0,则不输出日志信息;如果为1,则每隔一段时间打印一次日志信息;如果大于1,则打印日志信息更频繁
  • warm_start:布尔值,若为True,则继续使用上一次训练的结果;否则重新开始训练
  • class_weight:一个字典或字典列表,或字符串’balanced’,或字符串‘balanced_subsample’,或None.
    1)若为字典,则字典给出了每个分类的权重,如{class_label:weight}
    2)若为字符串’balanced’,则每个分类的权重与该分类在样本集中出现的频率成反比
    3)若为字符串’balanced_subsample’,则样本集为采样法bootstrap sampling产生的决策树的训练数据集,每个分类的权重与该分类在采用生成的样本集中出现的频率成反比
    4)若为None:则每个分类的权重都为1

属性

  • estimators:决策树的实例的数组,它存放的是所有训练过的决策树
  • classes_:一个数组,形状为[n_classes],为类别标签
  • n_classes_:一个整数,为类别数量
  • n_features_:一个整数,在训练中使用的特征向量
  • n_outputs_:一个整数,在训练时输出的数量
  • feature_importances_:一个数组,形状为[n_features]
  • ood_score_:一个浮点数,训练数据使用包外估计时的得分

方法

  • fit()
  • predict(X)
  • predict_log_proba(X)
  • predict_proba(X)
  • score()