机器学习算法之随机深林算法

前言

说好的PCA算法先暂时鸽一下,因为还没写完,大概明天发,先发一个机器学习比赛中常见的bagging算法之一:随机深林算法。需要结合之前发的那篇决策树算法一起看。

算法原理

随机森林是一个用随机方式建立的,包含多个决策树的集成分类器。其输出的类别由各个树投票而定(如果是回归树则取平均)。假设样本总数为n,每个样本的特征数为a,则随机森林的生成过程如下:

  • 从原始样本中采用有放回抽样的方法选取n个样本;
  • 对n个样本选取a个特征中的随机k个,用建立决策树的方法获得最佳分割点;
  • 重复m次,获得m个决策树;
  • 对输入样例进行预测时,每个子树都产生一个结果,采用多数投票机制输出。 随机森林的随机性主要体现在两个方面: 数据集的随机选取:从原始的数据集中采取有放回的抽样(bagging),构造子数据集,子数据集的数据量是和原始数据集相同的。不同子数据集的元素可以重复,同一个子数据集中的元素也可以重复。 待选特征的随机选取:与数据集的随机选取类似,随机森林中的子树的每一个分裂过程并未用到所有的待选特征,而是从所有的待选特征中随机选取一定的特征,之后再在随机选取的特征中选取最优的特征。

以上两个随机性能够使得随机森林中的决策树都能够彼此不同,提升系统的多样性,从而提升分类性能。 随机森林的优点:

  • 实现简单,训练速度快,泛化能力强,可以并行实现,因为训练时树与树之间是相互独立的;
  • 相比单一决策树,能学习到特征之间的相互影响,且不容易过拟合;
  • 能处理高维数据(即特征很多),并且不用做特征选择,因为特征子集是随机选取的;
  • 对于不平衡的数据集,可以平衡误差;
  • 相比SVM,不是很怕特征缺失,因为待选特征也是随机选取;
  • 训练完成后可以给出哪些特征比较重要。

随机森林的缺点:

  • 在噪声过大的分类和回归问题还是容易过拟合;
  • 相比于单一决策树,它的随机性让我们难以对模型进行解释。

代码实现

在上一篇文章实现的决策树的基础上实现,代码如下:

#coding=utf-8
import decision_tree
from decision_tree import DecisionTree
from random import sample, choices, choice

class RandomForest(object):
    def __init__(self):
        self.trees = None
        self.tree_features = None

    def fit(self, X, y, n_estimators=, max_depth=, min_samples_split=, max_features=None, n_samples=None):
        self.trees = []
        self.tree_features = []
        for _ in range(n_estimators):
            m = len(X[])
            n = len(y)
            if n_samples:
                idx = choices(population=range(n), k=min(n, n_samples))
            else:
                idx = range(n)
            if max_features:
                n_features = min(m, max_features)
            else:
                n_features = int(m ** 0.5)
            features = sample(range(m), choice(range(, n_features+)))
            X_sub = [[X[i][j] for j in features] for i in idx]
            y_sub = [y[i] for i in idx]
            clf = DecisionTree()
            clf.fit(X_sub, y_sub, max_depth, min_samples_split)
            self.trees.append(clf)
            self.tree_features.append(features)

    def _predict(self, Xi):
        pos_vote = 
        for tree, features in zip(self.trees, self.tree_features):
            score = tree._predict([Xi[j] for j in features])
            if score >= 0.5:
                pos_vote += 
        neg_vote = len(self.trees) - pos_vote
        if pos_vote > neg_vote:
            return 
        elif pos_vote < neg_vote:
            return 
        else:
            return choice([, ])

    def predict(self, X):
        return [self._predict(Xi) for Xi in X]


@decision_tree.run_time
def main():
    print("Tesing the performance of RandomForest...")
    # Load data
    X, y = decision_tree.load_data()
    # Split data randomly, train set rate 70%
    X_train, X_test, y_train, y_test = decision_tree.train_test_split(X, y, random_state=)

    # Train model
    rf = RandomForest()
    rf.fit(X_train, y_train, n_samples=, max_depth=, n_estimators=)
    # Model evaluation
    y_hat = rf.predict(X_test)
    acc = decision_tree.get_acc(y_test, y_hat)
    print("Accuracy is %.3f" % acc)

在肺癌数据集上测试结果如下

在这里插入图片描述

参考文章

https://blog.csdn.net/login_sonata/article/details/73929426

本文分享自微信公众号 - GiantPandaCV(BBuf233)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI算法与图像处理

使用深度学习来实现超分辨率的介绍

超分辨率是从给定的低分辨率(LR)图像中恢复高分辨率(HR)图像的过程。由于较小的空间分辨率(即大小)或退化的结果(如模糊),图像可能具有“较低的分辨率”。我们...

12930
来自专栏算法channel

Python最被低估的库,用好了效率提升10倍!

Python有许多很好的库(libraries),实现这些功能只需要几行代码。今天介绍一个库:collections. 这个模块提供容器相关的更高性能的数据类型...

6730
来自专栏AI算法与图像处理

目标检测:速度和准确性比较(Fater R-CNN,R-FCN,SSD,FPN,RetinaNet和YOLOv3)

文章来源:https://zhuanlan.zhihu.com/p/91719437

22410
来自专栏CDA数据分析师

AI眼中的世界是什么样子?谷歌新研究找到了机器的视觉概念

随着机器学习模型广泛用于制定重要决策,可解释性成为研究领域的重要主题。目前大多数解释方法通过特征重要性得分来提供解释,即识别每个输入中重要的特征。然而,如何系统...

9530
来自专栏MixLab科技+设计实验室

2019人工智能用户体验设计指南:技术、场景、设计

我觉得MIT教授Patrick Winston总结的蛮好,他把AI在软件系统中的身份分为四类:

9020
来自专栏AI算法与图像处理

NLP入门竞赛,搜狗新闻文本分类

使用keras框架通过构建CNN+BiGRU网络实现在搜狗新闻文本数据集上91+的准确率。

10120
来自专栏AI小白入门

【机器学习】Fisher线性判别与线性感知机

本文介绍了分类模型中两种经典的分类思想,Fisher线性判别:将数据从原始空间映射到一维,使得类内紧致、类间分离(采用一维距离度量);线性感知机:在数据某一空间...

7230
来自专栏AI小白入门

【NLP】加速BERT:从架构优化、模型压缩到模型蒸馏最新进展详解

原文链接:https://blog.inten.to/speeding-up-bert-5528e18bb4ea

11220
来自专栏AI科技大本营的专栏

Hulu视频如何提升推荐多样性?

导读:本文主要介绍Hulu在NIPS 2018上发表的《Fast Greedy MAP Inference for Determinantal Point Pr...

11120
来自专栏AI小白入门

【综述】​从基础到前沿看迁移学习在NLP中的演化

论文标题:Evolution of Transfer Learning in Natural Language Processing

6530

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励