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

1. Bagging和Boosting

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

Bagging是放回采样的过程,对于给定M个样本的数据集,对于每一个基本分类器t,随机抽样m<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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容