最新公告
  • 欢迎光临数据科学与编程,我们是数据学科学兴趣交流小组立即加入我们
  • 随机森林

    Python机器学习算法实现

    进入了集成学习的系列,介绍集成学习中最具代表性的Boosting框架。从AdaBoost到GBDT系列,对XGBoost、LightGBM和CatBoost作了较为详细的了解。本文作为集成学习的最后一篇文章,来介绍与Boosting框架有所不同的Bagging框架。

    Bagging与随机森林

        Bagging是并行式集成学习方法最典型的代表框架。其核心概念在于自助采样(Bootstrap Sampling),给定包含m个样本的数据集,有放回的随机抽取一个样本放入采样集中,经过m次采样,可得到一个和原始数据集一样大小的采样集。我们可以采样得到T个包含m个样本的采样集,然后基于每个采样集训练出一个基学习器,最后将这些基学习器进行组合。这便是Bagging的主要思想。Bagging与Boosting图示如下:

        可以清楚的看到,Bagging是并行的框架,而Boosting则是序列框架(但也可以实现并行)。

     

        有了之前多篇关于决策树的基础以及前述关于Bagging基本思想的阐述,随机森林(Random Forest)就没有太多难以理解的地方了。所谓随机森林,就是有很多棵决策树构建起来的森林,因为构建过程中的随机性,故而称之为随机森林。随机森林算法是Bagging框架的一个典型代表。

     

        关于构建决策树的过程,可以参考前述第4~5篇,这里不做重复阐述。因为基础的推导工作都是前述章节都已完成,这里我们可以直接阐述随机森林的算法过程,简单来说就是两个随机性。具体如下:

    • 假设有M个样本,有放回的随机选择M个样本(每次随机选择一个放回后继续选)。
    • 假设样本有N个特征,在决策时的每个节点需要分裂时,随机地从这N个特征中选取n个特征,满足n<<N,从这n个特征中选择特征进行节点分裂。
    • 基于抽样的M个样本n个特征按照节点分裂的方式构建决策树。
    • 按照1~3步构建大量决策树组成随机森林,然后将每棵树的结果进行综合(分类使用投票法,回归可使用均值法)。

        所以,当我们熟悉了Bagging的基本思想和决策树构建的过程后,随机森林就很好理解了。

     

    随机森林算法实现

        本文我们使用numpy来手动实现一个随机森林算法。随机森林算法本身是实现思路我们是非常清晰的,但其原始构建需要大量搭建决策树的工作,比如定义树节点、构建基本决策树、在基本决策树基础上构建分类树和回归树等。这些笔者在前述章节均已实现过,这里不再重复。

     

        在此基础上,随机森林算法的构建主要包括随机选取样本、随机选取特征、构造森林并拟合其中的每棵树、基于每棵树的预测结果给出随机森林的预测结果。

        导入相关模块并生成模拟数据集。


    定义第一个随机性,行抽样选取样本:


    然后基于分类树构建随机森林:


    定义训练函数,对随机森林中每棵树进行拟合。


        我们将上述过程进行封装,分别定义自助抽样方法、随机森林训练方法和预测方法。完整代码如下:


        基于上述随机森林算法封装来对模拟数据集进行训练并验证:



        sklearn也为我们提供了随机森林算法的api,我们也尝试一下与numpy手写的进行效果对比:



        可以看到sklearn的预测结果要略高于我们手写的结果。当然我们的训练结果还可以经过调参进一步提高。随机森林调参可参考sklearn官方文档,这里略过。

     

    参考资料:

    机器学习 周志华


    本站上原创文章未经作者许可,不得用于商业用途,仅做学习交流使用,本站免责声明。转载请注明出处,否则保留追究法律责任的权利。《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
    数据科学与编程 » 随机森林

    发表评论

    • 53会员总数(位)
    • 321资源总数(个)
    • 19本周发布(个)
    • 2 今日发布(个)
    • 334稳定运行(天)

    提供最优质的博文资源集合

    立即阅览 了解详情