文档章节

[译]随机森林模型的参数调优

hblt-j
 hblt-j
发布于 2017/09/11 16:38
字数 2008
阅读 64
收藏 0
点赞 0
评论 0

 

文章介绍了如何对随机森林模型进行参数调优

原文来自:http://www.analyticsvidhya.com/blog/2015/06/tuning-random-forest-model/

为什么要调整机器学习算法?

一个月以前,我在kaggle上参加了一个名为TFI的比赛。 我第一次提交的结果在50%。 我不懈努力在特征工程上花了超过2周的时间,勉强达到20%。 出乎我意料的事是,在调整机器学习算法参数之后,我能够达到前10%。

这是这就是机器学习算法参数调优的重要性。 随机森林是在工业界中使用的最简单的机器学习工具之一。 在我们以前的文章中,我们已经向您介绍了随机森林和和CART模型进行了对比 。 机器学习工具包正由于这些算法的表现而被人所熟知。。

随机森林是什么?

随机森林是一个集成工具,它使用观测数据的子集和变量的子集来建立一个决策树。 它建立多个这样的决策树,然后将他们合并在一起以获得更准确和稳定的预测。 这样做最直接的事实是,在这一组独立的预测结果中,用投票方式得到一个最高投票结果,这个比单独使用最好模型预测的结果要好。

我们通常将随机森林作为一个黑盒子,输入数据然后给出了预测结果,无需担心模型是如何计算的。这个黑盒子本身有几个我们可以摆弄的杠杆。 每个杠杆都能在一定程度上影响模型的性能或资源 -- 时间平衡。 在这篇文章中,我们将更多地讨论我们可以调整的杠杆,同时建立一个随机林模型。

调整随机森林的参数/杠杆

随机森林的参数即可以增加模型的预测能力,又可以使训练模型更加容易。 以下我们将更详细地谈论各个参数(请注意,这些参数,我使用的是Python常规的命名法):

1.使模型预测更好的特征

主要有3类特征可以被调整,以改善该模型的预测能力:

A. max_features:

随机森林允许单个决策树使用特征的最大数量。 Python为最大特征数提供了多个可选项。 下面是其中的几个:

  1. Auto/None :简单地选取所有特征,每颗树都可以利用他们。这种情况下,每颗树都没有任何的限制。

  2. sqrt :此选项是每颗子树可以利用总特征数的平方根个。 例如,如果变量(特征)的总数是100,所以每颗子树只能取其中的10个。“log2”是另一种相似类型的选项。

  3. 0.2:此选项允许每个随机森林的子树可以利用变量(特征)数的20%。如果想考察的特征x%的作用, 我们可以使用“0.X”的格式。

max_features如何影响性能和速度?

增加max_features一般能提高模型的性能,因为在每个节点上,我们有更多的选择可以考虑。 然而,这未必完全是对的,因为它降低了单个树的多样性,而这正是随机森林独特的优点。 但是,可以肯定,你通过增加max_features会降低算法的速度。 因此,你需要适当的平衡和选择最佳max_features。

B. n_estimators:

在利用最大投票数或平均值来预测之前,你想要建立子树的数量。 较多的子树可以让模型有更好的性能,但同时让你的代码变慢。 你应该选择尽可能高的值,只要你的处理器能够承受的住,因为这使你的预测更好更稳定。

C. min_sample_leaf:

如果您以前编写过一个决策树,你能体会到最小样本叶片大小的重要性。 叶是决策树的末端节点。 较小的叶子使模型更容易捕捉训练数据中的噪声。 一般来说,我更偏向于将最小叶子节点数目设置为大于50。在你自己的情况中,你应该尽量尝试多种叶子大小种类,以找到最优的那个。

2.使得模型训练更容易的特征

有几个属性对模型的训练速度有直接影响。 对于模型速度,下面是一些你可以调整的关键参数:

A. n_jobs:

这个参数告诉引擎有多少处理器是它可以使用。 “-1”意味着没有限制,而“1”值意味着它只能使用一个处理器。 下面是一个用Python做的简单实验用来检查这个指标:

%timeit 
model = RandomForestRegressor(n_estimator = 100, oob_score = TRUE,n_jobs = 1,random_state =1)
model.fit(X,y)
Output  ———-  1 loop best of 3 : 1.7 sec per loop

%timeit 
model = RandomForestRegressor(n_estimator = 100,oob_score = TRUE,n_jobs = -1,random_state =1)
model.fit(X,y)
Output  ———-  1 loop best of 3 : 1.1 sec per loop 

“%timeit”是一个非常好的功能,他能够运行函数多次并给出了最快循环的运行时间。 这出来非常方便,同时将一个特殊的函数从原型扩展到最终数据集中。

B. random_state:

此参数让结果容易复现。 一个确定的随机值将会产生相同的结果,在参数和训练数据不变的情况下。 我曾亲自尝试过将不同的随机状态的最优参数模型集成,有时候这种方法比单独的随机状态更好。

C. oob_score:

这是一个随机森林交叉验证方法。 它和留一验证方法非常相似,但这快很多。 这种方法只是简单的标记在每颗子树中用的观察数据。 然后对每一个观察样本找出一个最大投票得分,是由那些没有使用该观察样本进行训练的子树投票得到。

下面函数中使用了所有这些参数的一个例子:

model = RandomForestRegressor(n_estimator = 100, oob_score = TRUE, n_jobs = -1,random_state =50,
                                max_features = "auto", min_samples_leaf = 50)

model.fit(x, y)

通过案例研究学习

我们以在以前的文章中经常提到泰坦尼克号为例。 让我们再次尝试同样的问题。 这种情况下的目标是,了解调整随机森林参数而不是找到最好的特征。 试试下面的代码来构建一个基本模型:

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import roc_auc_score
import pandas as pd
x = pd.read_csv("train.csv")
y = x.pop("Survived")
model =  RandomForestRegressor(n_estimator = 100 , oob_score = TRUE, random_state = 42)
model.fit(x(numeric_variable,y)
print "AUC - ROC : ", roc_auc_score(y,model.oob_prediction)

AUC - ROC:0.7386

这是一个非常简单没有参数设定的模型。 现在让我们做一些参数调整。 正如我们以前讨论过,我们有6个关键参数来调整。 我们有一些Python内置的的网格搜索算法,它可以自动调整所有参数。在这里让我们自己动手来实现,以更好了解该机制。 下面的代码将帮助您用不同的叶子大小来调整模型。

练习:试试运行下面的代码,并在评论栏中找到最佳叶片大小。

sample_leaf_options = [1,5,10,50,100,200,500]

for leaf_size in sample_leaf_options :
    model = RandomForestRegressor(n_estimator = 200, oob_score = TRUE, n_jobs = -1,random_state =50,
                                max_features = "auto", min_samples_leaf = leaf_size)

model.fit(x(numeric_variable,y)

print "AUC - ROC : ", roc_auc_score(y,model.oob_prediction)

备注

就像是随机森林,支持向量机,神经网络等机器学习工具都具有高性能。 他们有很高的性能,但用户一般并不了解他们实际上是如何工作的。 不知道该模型的统计信息不是什么问题,但是不知道如何调整模型来拟合训练数据,这将会限制用户使用该算法来充分发挥其潜力。 在一些后续的文章中,我们将讨论其他机器学习算法,像支持向量机,GBM和neaural networks。

本文转载自:http://tankle.github.io/2015/06/11/Random-Forest-parameter-turning.html

共有 人打赏支持
hblt-j
粉丝 14
博文 92
码字总数 11113
作品 0
海淀
架构师
在真实数据集上的随机森林模型参数调优

搞机器学习的人,都会有自己偏爱的某种算法,有的喜欢支持向量机(SVM),因为它公式表达的优雅和可利用方法实现的高质量;有的人喜欢决策树,因为它的简洁性和解释能力;还有人对神经网络非...

YoghurtIce ⋅ 2016/01/28 ⋅ 0

模型介绍、评估和参数调优(附代码)

我们在用训练数据对模型进行拟合时会得到模型的一些参数,但将模型用于新数据时需重设这些参数,并且还需要评估这个模型的实用性。我们可以利用scikit-learn中的一些方法来达到这么目的。 我...

鸣人吃土豆 ⋅ 2017/12/26 ⋅ 0

学途无忧网的视频怎么破解下载?学途无忧网淘宝可以买吗?

学途无忧网的视频怎么破解下载?学途无忧网淘宝可以买吗? 我想下载这几集,或者低价购买这几集 课时7:SparkSQL java操作mysql数据 课时8:Spark统计用户的收藏转换率 课时9:Spark梳理用户...

Baclk5 ⋅ 2016/12/19 ⋅ 2

Python机器学习(sklearn)——分类模型评估与调参总结(下)

前文传送门: Python机器学习(sklearn)——分类模型评估与调参总结(上) 21. 集成方法有随机森林(random forest)和梯度提升树(gradient boosted decision tree)GBDT 随机森林中树的随...

ID王大伟 ⋅ 06/03 ⋅ 0

Deep Forest 算法解读

曾凡祥 北京邮电大学通信与信息系统博士,现为去哪儿网金融事业部大数据算法工程师,主要进行机器学习、深度学习等人工智能技术的研究和应用。 摘要 无论是这几年兴起的神经网络,还是经典的...

Qunar技术沙龙 ⋅ 04/26 ⋅ 0

如何实现AutoML -- 先Auto每个环节

前言 先给AutoML做个定义:用户给出可能的raw数据(但是经过标注),机器自动完成整个特征化,模型训练,模型选择/组合,超参数调优,部署上线。 最近一直在思考如何提高算法工程师效率,并且...

祝威廉 ⋅ 05/02 ⋅ 0

IT人告诉你【泰坦尼克号】上哪类人更易活下来?

《泰坦尼克号》都知道,杰克和露丝的爱情,既美好又悲伤,在看电影的时候,不知你是否想过这样一个问题:在【泰坦尼克号】沉船事故中,什么样的人更容易生存下来呢? 作为一名程序员,我们可...

实验楼 ⋅ 01/09 ⋅ 0

《R语言实战》第四部分第十七章-分类学习笔记

前面一章的内容主要是对数据进行聚类,可能是两类,也可能是三类,甚至更多,而分类一般是指一分为二。举几个例子: 根据个人信息和财务历史记录预测其是否会还贷; 根据重症病人的症状和生命...

Datacruiser ⋅ 2017/07/16 ⋅ 0

DeepMind提出快速调参新算法PBT,适用GAN训练(附论文)

从围棋到Atari游戏到图像识别和语言翻译,神经网络在各个领域都取得了巨大的成功。但是经常容易被忽视的是,神经网络在某个特定应用中的成功通常取决于在研究初始时所做的一系列选择,包括选...

技术小能手 ⋅ 2017/11/28 ⋅ 0

机器学习模型评价(Evaluating Machine Learning Models)-主要概念与陷阱

转载自:http://blog.csdn.net/heyongluoyao8/article/details/49408319# 机器学习模型评价(Evaluating Machine Learning Models)-主要概念与陷阱 前言   本文主要解释一些关于机器学习模型...

eucommiaulmoides ⋅ 04/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(十)JavaScript的DOM基础

JavaScript零基础入门——(十)JavaScript的DOM基础 欢迎大家回到我们的JavaScript零基础入门,上一节课,我们了解了JavaScript中的函数,这一节课,我们来了解一下JavaScript的DOM。 第一节...

JandenMa ⋅ 56分钟前 ⋅ 0

Spring mvc DispatchServlet 实现原理

在Spring中, ContextLoaderListener只是辅助类,在web 容器启动的时候查找并创建WebApplicationContext对象,通过该对象进行加载spring的配置文件。而真正的逻辑实现其实是在DispatcherSer...

轨迹_ ⋅ 今天 ⋅ 0

Weex起步

本教程假设你已经在你的本地环境安装了node 其实weex起步教程在 https://github.com/lilugirl/incubator-weex 项目说明文件中都已经有了,但为了有些同学看到英文秒变文盲,所以这里我重新写...

lilugirl ⋅ 今天 ⋅ 0

Jenkins实践1 之安装

1 下载 http://mirrors.jenkins.io/war/latest/jenkins.war 2 启动 java -jar jenkins.war 前提:安装jdk并配置环境变量 启动结果节选: ************************************************......

晨猫 ⋅ 今天 ⋅ 0

组合数学 1-2000 中,能被6或10整除的数的个数

1--2000 中,能被6或10整除的数的个数 利用集合的性质 能被6整除的个数 2000/6 = 333 能被10整除的个数 2000/10 = 200 能被6和10整除的个数 2000/30 = 66 能被6或10整除的个数 333+200-66 =...

阿豪boy ⋅ 今天 ⋅ 0

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 今天 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 今天 ⋅ 0

Kylin 对维度表的的要求

1.要具有数据一致性,主键值必须是唯一的;Kylin 会进行检查,如果有两行的主键值相同则会报错。 2.维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询;过大的表不适合作为维度表,默...

无精疯 ⋅ 今天 ⋅ 0

58到家数据库30条军规解读

军规适用场景:并发量大、数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一、基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及...

kim_o ⋅ 今天 ⋅ 0

代码注释中顺序更改 文件读写换行

`package ssh; import com.xxx.common.log.LogFactory; import com.xxx.common.log.LoggerUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; public class DirErgodic ......

林伟琨 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部