公号:码农充电站pro

主页:https://codeshellme.github.io

本篇文章来介绍随机森林RandomForest)算法。

1,集成算法之 bagging 算法

在前边的文章《AdaBoost 算法-分析波士顿房价数据集》中,我们介绍过集成算法。集成算法中有一类算法叫做 bagging 算法。

bagging 算法是将一个原始数据集随机抽样成 N 个新的数据集。然后将这 N 个新的数据集作用于同一个机器学习算法,从而得到 N 个模型,最终集成一个综合模型。

在对新的数据进行预测时,需要经过这 N 个模型(每个模型互不依赖干扰)的预测(投票),最终综合 N 个投票结果,来形成最后的预测结果。

bagging 算法的流程可用下图来表示:

2,随机森林算法

随机森林算法是 bagging 算法中比较出名的一种。

随机森林算法由多个决策树分类器组成,每一个子分类器都是一棵 CART 分类回归树,所以随机森林既可以做分类,又可以做回归。

当随机森林算法处理分类问题的时候,分类的最终结果是由所有的子分类器投票而成,投票最多的那个结果就是最终的分类结果。

当随机森林算法处理回归问题的时候,最终的结果是每棵 CART 树的回归结果的平均值。

3,随机森林算法的实现

sklearn 库即实现了随机森林分类树,又实现了随机森林回归树

RandomForestClassifier 类的原型如下:

RandomForestClassifier(n_estimators=100,
criterion='gini', max_depth=None,
min_samples_split=2, min_samples_leaf=1,
min_weight_fraction_leaf=0.0,
max_features='auto', max_leaf_nodes=None,
min_impurity_decrease=0.0,
min_impurity_split=None,
bootstrap=True, oob_score=False,
n_jobs=None, random_state=None,
verbose=0, warm_start=False,
class_weight=None, ccp_alpha=0.0,
max_samples=None)

可以看到分类树的参数特别多,我们来介绍几个重要的参数:

  • n_estimators:随机森林中决策树的个数,默认为 100。
  • criterion:随机森林中决策树的算法,可选的有两种:
    • gini:基尼系数,也就是 CART 算法,为默认值。
    • entropy:信息熵,也就是 ID3 算法
  • max_depth:决策树的最大深度。

RandomForestRegressor 类的原型如下:

RandomForestRegressor(n_estimators=100,
criterion='mse', max_depth=None,
min_samples_split=2, min_samples_leaf=1,
min_weight_fraction_leaf=0.0,
max_features='auto', max_leaf_nodes=None,
min_impurity_decrease=0.0,
min_impurity_split=None,
bootstrap=True, oob_score=False,
n_jobs=None, random_state=None,
verbose=0, warm_start=False,
ccp_alpha=0.0, max_samples=None)

回归树中的参数与分类树中的参数基本相同,但 criterion 参数的取值不同。

在回归树中,criterion 参数有下面两种取值:

  • mse:表示均方误差算法,为默认值。
  • mae:表示平均误差算法

4,随机森林算法的使用

下面使用随机森林分类树来处理鸢尾花数据集,该数据集在《决策树算法-实战篇》中介绍过,这里不再介绍,我们直接使用它。

首先加载数据集:

from sklearn.datasets import load_iris

iris = load_iris()   	# 准备数据集
features = iris.data # 获取特征集
labels = iris.target # 获取目标集

将数据分成训练集测试集

from sklearn.model_selection import train_test_split

train_features, test_features, train_labels, test_labels =
train_test_split(features, labels, test_size=0.33, random_state=0)

接下来构造随机森林分类树:

from sklearn.ensemble import RandomForestClassifier

# 这里均使用默认参数
rfc = RandomForestClassifier() # 训练模型
rfc.fit(train_features, train_labels)

estimators_ 属性中存储了训练出来的所有的子分类器,来看下子分类器的个数:

>>> len(rfc.estimators_)
100

预测数据:

test_predict = rfc.predict(test_features)

测试准确率:

>>> from sklearn.metrics import accuracy_score
>>> accuracy_score(test_labels, test_predict)
0.96

5,模型参数调优

在机器学习算法模型中,一般都有很多参数,每个参数都有不同的取值。如何才能让模型达到最好的效果呢?这就需要参数调优。

sklearn 库中有一个 GridSearchCV 类,可以帮助我们进行参数调优。

我们只要告诉它想要调优的参数有哪些,以及参数的取值范围,它就会把所有的情况都跑一遍,然后告诉我们参数的最优取值。

先来看下 GridSearchCV 类的原型:

GridSearchCV(estimator,
param_grid, scoring=None,
n_jobs=None, refit=True,
cv=None, verbose=0,
pre_dispatch='2*n_jobs',
error_score=nan,
return_train_score=False)

其中有几个重要的参数:

  • estimator:表示为哪种机器学习算法进行调优,比如随机森林,决策树,SVM 等。
  • param_grid:要优化的参数及取值,输入的形式是字典或列表
  • scoring:准确度的评价标准。
  • cv:交叉验证的折数,默认是三折交叉验证。

下面我们对随机森林分类树进行参数调优,还是使用鸢尾花数据集

首先载入数据:

from sklearn.datasets import load_iris

iris = load_iris()

构造分类树:

from sklearn.ensemble import RandomForestClassifier

rfc = RandomForestClassifier()

如果我们要对分类树的 n_estimators 参数进行调优,调优的范围是 [1, 10],则准备变量:

param = {"n_estimators": range(1,11)}

创建 GridSearchCV 对象,并调优:

from sklearn.model_selection import GridSearchCV

gs = GridSearchCV(estimator=rfc, param_grid=param)

# 对iris数据集进行分类
gs.fit(iris.data, iris.target)

输出最优准确率和最优参数:

>>> gs.best_score_
0.9666666666666668
>>> gs.best_params_
{'n_estimators': 7}

可以看到,最优的结果是 n_estimators7,也就是随机森林的子决策树的个数是 7 时,随机森林的准确度最高,为 0.9667

6,总结

本篇文章主要介绍了随机森林算法的原理及应用,并展示了如何使用 GridSearchCV 进行参数调优。

(本节完。)


推荐阅读:

AdaBoost 算法-分析波士顿房价数据集

决策树算法-实战篇-鸢尾花及波士顿房价预测

EM 算法-对鸢尾花数据进行聚类

Apriori 算法-如何进行关联规则挖掘

Logistic 回归-原理及应用


欢迎关注作者公众号,获取更多技术干货。

RandomForest 随机森林算法与模型参数的调优的更多相关文章

  1. R语言︱机器学习模型评估方案(以随机森林算法为例)

    笔者寄语:本文中大多内容来自<数据挖掘之道>,本文为读书笔记.在刚刚接触机器学习的时候,觉得在监督学习之后,做一个混淆矩阵就已经足够,但是完整的机器学习解决方案并不会如此草率.需要完整的评 ...

  2. R语言︱决策树族——随机森林算法

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:有一篇<有监督学习选择深度学习 ...

  3. Python机器学习笔记——随机森林算法

    随机森林算法的理论知识 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法.随机森林非常简单,易于实现,计算开销也很小,但是它在分类和回归上表现出非常惊人的性能,因此,随机森林被誉为“代 ...

  4. 用Python实现随机森林算法,深度学习

    用Python实现随机森林算法,深度学习 拥有高方差使得决策树(secision tress)在处理特定训练数据集时其结果显得相对脆弱.bagging(bootstrap aggregating 的缩 ...

  5. 随机森林算法demo python spark

    关键参数 最重要的,常常需要调试以提高算法效果的有两个参数:numTrees,maxDepth. numTrees(决策树的个数):增加决策树的个数会降低预测结果的方差,这样在测试时会有更高的accu ...

  6. H2O中的随机森林算法介绍及其项目实战(python实现)

    H2O中的随机森林算法介绍及其项目实战(python实现) 包的引入:from h2o.estimators.random_forest import H2ORandomForestEstimator ...

  7. 随机森林算法-Deep Dive

    0-写在前面 随机森林,指的是利用多棵树对样本进行训练并预测的一种分类器.该分类器最早由Leo Breiman和Adele Cutler提出.简单来说,是一种bagging的思想,采用bootstra ...

  8. spark 随机森林算法案例实战

    随机森林算法 由多个决策树构成的森林,算法分类结果由这些决策树投票得到,决策树在生成的过程当中分别在行方向和列方向上添加随机过程,行方向上构建决策树时采用放回抽样(bootstraping)得到训练数 ...

  9. 随机森林算法OOB_SCORE最佳特征选择

    RandomForest算法(有监督学习),可以根据输入数据,选择最佳特征组合,减少特征冗余:原理:由于随机决策树生成过程采用的Boostrap,所以在一棵树的生成过程并不会使用所有的样本,未使用的样 ...

随机推荐

  1. 总结 Visual Studio 2019 发布以来 XAML 工具的改进

    不知不觉,Visual Studio 2019 已经出到 16.8 和 16.9 Preview 了.虽然每次更新都林林总总地一大堆新功能和改进,但关于 XAML 的内容总是,always,每次都只有 ...

  2. [日常摸鱼]Luogu2878 [USACO07JAN]Protecting the Flowers

    直接贴题面x 有$n$头奶牛跑到FJ的花园里去吃花儿了,它们分别在距离牛圈$T$分钟处吃花儿,每分钟会吃掉$D$朵卡哇伊的花儿,FJ现在要将它们给弄回牛圈,但是他每次只能弄一头回去,来回用时总共为$2 ...

  3. 刚入坑之C#《方法》解说

    说好的用一周时间学方法,我都快耽误成两周了.原因就是跟着传智播客的课程做了个飞行棋项目,想要梳理其中的方法却把自己绕晕了.那接下来我先说一下我学到方法的内容,在最后献上飞行器项目的代码,当然是传智播客 ...

  4. 2021韩顺平图解Linux课程(全面升级)基础篇

    第1章 Linux 开山篇-内容介绍 本套 Linux 课程内容 Linux 主要应用领域:服务器 第2章 Linux 基础篇-Linux 入门 Linux 之父 Linus Torvalds Git ...

  5. 10天,从.Net转Java,并找到月薪2W的工作(三)

    放弃Offer之后,压力一天比一天打 好点的公司,除了技术追根问底,还对你平时代码实践问的很多.比如问你,redis缓存一般设置多大.问你项目内容的细节,业务流程. 集合.锁.Jvm.多线程高并发.微 ...

  6. 读取pdf中的内容

    import com.spire.pdf.PdfDocument;import com.spire.pdf.PdfPageBase;import java.io.*; public class Ext ...

  7. 加班申请单flowable中

    /* * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. * * Redistribution and use in source ...

  8. ExecutionListener,TaskListener流程监听 和任务监听

    1.ExecutionListener 流程实例的启动和结束. 选中一条连线. 节点的开始和结束. 网关的开始和结束. 中间事件的开始和结束. 开始时间结束或结束事件开始. 2.TaskListene ...

  9. 听说又有兄弟因为用YYYY-MM-dd被锤了...

    还记得去年分享过一篇日期格式化使用 YYYY-MM-dd 的潜在问题的文章不? 历史又重演了... 事故现场 我们来写个单元测试,重现一下这个问题. 测试逻辑: 创建两个日期格式化,一个是出问题的YY ...

  10. 阿里云Ubuntu配置安装MQTT服务器

    先来说说mqtt协议: MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,它比较适合于在低带宽.不可靠的网络的进行远程 ...