云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

对象存储_服务器centos_怎么买

小七 141 0

MLlib中的随机森林和Boosting

这是一篇与Manish Amde合著的来自折纸逻辑的帖子。apachespark1.2在MLlib中引入了随机森林和梯度增强树(GBTs)。它们适用于分类和回归,是最成功和应用最广泛的机器学习方法之一。随机森林和GBTs是集成学习算法,它们结合多个决策树来生成更强大的模型。在本文中,我们将描述这些模型以及MLlib中的分布式实现。我们还提供了一些简单的例子,并提供了如何开始的指导。系综方法简单地说,集成学习算法建立在其他机器学习方法的基础上,通过组合模型。这种组合比任何一种单独的模型都更加强大和精确。在mllib1.2中,我们使用决策树作为基本模型。我们提供了两种集成方法:随机森林和梯度增强树(GBTs)。这两种算法的主要区别在于每个组件树的训练顺序。随机森林使用数据的随机样本独立训练每棵树。这种随机性有助于使模型比单个决策树更健壮,并且不太可能过度适应训练数据。GBTs一次训练一棵树,每棵新树都有助于纠正先前训练的树所犯的错误。每增加一棵树,模型就变得更具表现力。最后,这两种方法都会产生一个加权的决策树集合。集合模型通过合并各个树的结果来进行预测。下图显示了一个包含三棵树的组合的简单示例。在上面的示例回归集合中,每棵树预测一个实际值。然后将这三种预测组合在一起,产生集合的最终预测。在这里,我们使用平均值组合预测(但是算法根据预测任务使用不同的技术)。群的分布式学习在MLlib中,随机林和GBTs都按实例(行)对数据进行分区。该实现建立在原始决策树代码的基础上,该代码分发单个树的学习(在前面的博客文章中描述过)。我们的许多优化都是基于Google的PLANET项目,这是在分布式环境下学习树的集合的主要出版作品之一。随机森林:由于随机森林中的每棵树都是独立训练的,所以可以并行训练多棵树(除了对单个树进行并行训练外)。MLlib正是这样做的:一个可变数量的子树被并行训练,其中子树的数量在每次迭代中根据内存约束进行优化。GBTs:由于GBTs必须一次训练一棵树,所以训练只在单个树级别并行化。我们要强调MLlib中使用的两个关键优化:内存:随机森林使用不同的数据子样本来训练每棵树。我们没有显式地复制数据,而是使用树点结构来节省内存,该结构存储每个子示例中每个实例的副本数量。通信:决策树通常是通过从树中每个决策节点的所有特征中进行选择来训练的,而随机森林通常将选择限制在每个节点上特征的随机子集上。MLlib的实现利用这种子采样来减少通信:例如,如果每个节点只使用1/3的特征,那么我们可以将通信减少1/3。有关更多详细信息,请参阅MLlib编程指南中的Ensembles部分。使用MLlib组合我们演示了如何使用MLlib学习集成模型。学习如何在一个测试数据集中读取和打印它的数据集,并在测试集中显示其精度。有关Java和Python中的示例,请参阅MLlib编程指南。注意,GBTs还没有pythonapi,但是我们希望它在spark1.3版本中(通过githubpr3951)。随机森林示例进口org.apache.spark网站.mllib.tree.RandomForest进口org.apache.spark网站.mllib.tree.configuration配置.策略进口org.apache.spark网站.mllib.util.MLUtils//加载并解析数据文件。val数据=MLUtils.loadLibSVMFile(sc,"data/mllib/sample-libsvm_数据.txt")//将数据拆分为训练/测试集val拆分=数据.随机分割(数组(0.7,0.3))val(trainingData,testData)=(拆分(0),拆分(1))//训练一个随机森林模型。val树分类=策略.默认策略("分类")val numTrees=3//在实践中使用更多。val featureSubsetStrategy="auto"//让算法选择。val模型=RandomForest.trainClassifier(培训数据,树分类,树数,功能子集策略,种子=12345)//在测试实例上评估模型并计算测试误差val测试R=测试数据.map{点=>预测值=模型.预测(要点.特征)如果(点.标签==预测)1.0其他0.0}.平均值()println("测试错误="+testErr)println("随机学习森林:n" + model.toDebugString)梯度增强树示例进口org.apache.spark网站.mllib.tree.GradientBoostedTrees进口org.apache.spark网站.mllib.tree.configuration配置.刺激策略进口org.apache.spark网站.mllib.util.MLUtils//加载并解析数据文件。val数据=MLUtils.loadLibSVMFile(sc,"data/mllib/sample-libsvm_数据.txt")//将数据拆分为训练/测试集val拆分=数据.随机分割(数组(0.7,0.3))val(trainingData,testData)=(拆分(0),拆分(1))//训练一个梯度boostedtrees模型。val助推策略=BoostingStrategy.defaultParams("分类")boostingStrategy.数字=3//注:在实践中使用更多val模型=梯度boostedtrees.train(训练数据,助推策略)//在测试实例上评估模型并计算测试误差val测试R=测试数据.map{点=>预测值=模型.预测(要点.特征)如果(点.标签==预测)1.0其他0.0}.平均值()println("测试错误="+testErr)println("学习的GBT型号:n" + model.toDebugString)可扩展性我们用一个二元分类问题的经验结果来证明MLlib集合的可伸缩性。下面的每个图比较了梯度增强树("GBT")和随机森林("RF"),其中树木被建造到不同的最大深度。这些测试是一项回归任务,从音频特性(来自UCIML存储库的YearPredictionMSD数据集)预测歌曲发行日期。我们用的是ec2r3.2x大型机器。算法参数保留为默认值,除非另有说明。缩放模型大小:训练时间与测试误差下面的两张图显示了增加集合中树的数量的效果。对于这两种情况,增加树需要更多的时间来学习(第一个图),但在测试均方误差(MSE)方面也提供了更好的结果(第二个图)。比较这两种方法,随机森林的训练速度更快,但它们通常需要比GBTs更深的树来实现相同的错误。GBTs可以进一步减少每次迭代的错误,但是在过多的迭代之后,它们可能开始过度拟合(增加测试误差)。随机森林不容易过度适应,但它们的测试误差处于平稳期。下面,为了了解MSE的基础,请注意,当使用单个决策树(深度分别为2、5或10)时,最左边的点显示了错误。详情:463715个培训实例。16名工人。扩展训练数据集大小:训练时间与测试误差下面两个图显示了使用更大的训练数据集的效果。随着数据量的增加,这两种方法的训练时间都会更长,但会获得更好的测试结果。详情:16名工人。强大的扩展性:更快的培训和更多的工人最后这张图显示了使用更大的计算集群来解决相同问题的效果。当使用更多的工人时,这两种方法都要快得多。例如,具有depth-2树的GBTs在16个工人身上的训练速度是2个工人的4.7倍,而更大的数据集产生的加速效果甚至更好。详情:463715个培训实例。下一步是什么?GBTs很快将包含pythonapi。未来开发的另一个首要问题是可插性:集成方法可以应用于几乎任何分类或回归算法,而不仅仅是决策树。spark1.2实验中引入的管道API火花.ml这个包将允许我们将集成方法泛化为真正的可插拔的。要开始自己使用决策树,请立即下载Spark 1.2!进一步阅读请参阅MLlib ensembles文档中的示例和API。了解更多关于决策树的背景信息,这些决策树用于构建集合。致谢MLlib集成算法是由本文作者李启平(Alibaba)、Sung Chung(阿尔卑斯数据实验室)和Davies Liu(Databricks)共同开发的。我们还感谢leeyang、andrewfeng和Hirakendu Das(雅虎)在设计和测试方面的帮助。我们也欢迎您的贡献!免费试用Databricks。今天就开始吧