《统计学习方法》之随机森林Random Forest

1. Bagging和Boosting

在集成学习方法中,Bagging和Boosting是具有代表性的两大方法,Boosting方法是基于前向加法模型,基本分类器之间存在强依赖关系,每一步学习的分类器都依赖于前面分类器的预测结果,因此必须串行生成。而Bagging则是强调基本分类器之间不存在强依赖关系(不代表没有依赖关系),可以同时生成的并行化学习方法。

Bagging是放回采样的过程,对于给定M个样本的数据集,对于每一个基本分类器t,随机抽样m

Bagging学习思想大体可以总结如下(图片来源周志华《机器学习》)

bagging.png

2.随机森林

  • 基本学习器的生成方式
    Bagging思想中最具有代表性的就是随机森林Random Forest。在Bagging放回样本采样(行采样)的基础上,每个基本分类器RF随机选择n个特征(列采样)。考虑鸢尾花iris数据集:


    幻灯片1.jpg

鸢尾花iris数据集共有M=150个样本,和N=4个特征。Bagging首先进行"行采样",如下图所示:

幻灯片2.jpg

RF在Bagging的基础上,引入了列采样,只选取部分特征进行基础分类器的学习,注意每个基本决策树所选择的数据列都不相同。

幻灯片3.jpg

最终对于基本分类器t,RF进行“行采样+列采样”
幻灯片4.jpg

幻灯片5.jpg

幻灯片6.jpg

  • 结合策略
    RF对于分类问题, 采用简单的投票表决,如果出现相同票数则随机选择一个结果。对于回归问题,则采用T个基本分类器的平均值。

3.代码实现

Random Forest可以用作回归问题或者分类问题,若是回归问题,则基本学习器采用CART回归树CARTRegressor,对应为RandomForestRegressor;分类问题,基本学习器采用CART分类树CARTClassifier,对应为RandomForestClassifier。

以RandomForestClassifier为例:

  • 训练时 对于每一个基本分类树CARTClassifier,根据比例,分别对样本和特征进行随机采样,在依次训练,并保存基本分类树和采样的特征列索引,详见fit()函数
  • 预测时 对于训练好的基本分类树和对应的特征索引,保存每个树的预测结果,最后统计投票次数最多的结果为最终结果,详见predit()函数。
    完整代码 bagging.py
class RandomForestClassifier(ForestModel):
    '''
    Random Forest Classifier
    '''
    def __init__(self, n_estimators, sample_scale, feature_scale):
        super(RandomForestClassifier, self).__init__(
            n_estimators, #基本分类器的数目
            sample_scale, #样本采样的比例
            feature_scale) #特征采样的比例

    def fit(self, X, y):
        '''
        随机森林的训练就是训练n个基础cart决策分类树,再对结果进行统计,求投票表决最大者
        '''
        #M个训练样本,N个特征
        M,N = X.shape
        self.forest = []

        for i in range(self.n_estimators):
            #生成行索引和列索引
            sample_indices = random.choice(M,int(self.sample_scale*M),replace=False)
            feature_indices = random.choice(N,int(self.feature_scale*N),replace=False)
            #生成数据
            data = X[[sample_indices]]
            data = data[:,feature_indices]
            target = y[[sample_indices]]
            #进行cart分类树训练
            basic_tree = CARTClassifier()
            basic_tree.fit(data,target)

            self.forest.append((basic_tree,feature_indices))

    def predict(self, X):
        res = []
        for tree,feature_indices in self.forest:
            data = X[:,feature_indices]
            pred = tree.predict(data)
            res.append(pred)
        res = mat(res).getA()
        preds= []
        for i in range(len(X)):
            column = res[:,i]
            preds.append(argmax(bincount(column)))
        return preds

4.优缺点

优缺点 内容 备注
优点 1. 结果表现好、效率高、实现简单、可以并行计算;2. 能够处理具有高维特征的输入样本,而且不需要降维; 3.对于异常值不敏感;4.可以计算特征的重要性。
缺点 1.随机森林在解决回归问题时,并没有像它在分类中表现的那么好,这是因为它并不能给出一个连续的输出。当进行回归时,随机森林不能够做出超越训练集数据范围的预测,这可能导致在某些特定噪声的数据进行建模时出现过度拟合。2.黑盒模型,无法控制模型内部。

5.FAQ

  • Bagging降低方差,Boosting降低偏差?
    详见为什么说bagging是减少variance,而boosting是减少bias?

  • 行采样和列采样的比例如何设定?基本学习器的个数如何设定?
    列采样一般为log2(N),N为特征数。

你可能感兴趣的:(《统计学习方法》之随机森林Random Forest)