Apache Spark中的决策树

Decision Trees in Apache Spark

原文作者:Akash Sethi

原文地址:https://dzone.com/articles/decision-trees-in-apache-spark

译者微博:@从流域到海域

译者博客:blog.csdn.blog/solo95

Apache Spark中的决策树

决策树是在顺序决策问题进行分类,预测和促进决策的有效方法。决策树由两部分组成:

  1. 决策(Desion)
  2. 结果(Outcome)

决策树包含三种类型的节点:

  1. 根节点(Root node):包含所有数据的树的顶层节点。
  2. 分割节点(Splitting node):将数据分配给子组(subgroup)的节点。
  3. 终端节点(Terminal node):最终决定(即结果)。

(分割节点(Splitting node),仅就离散数学中的树的概念而言,就是指分支节点,下面的翻译为了强调"分支"有时会翻译成分支结点,译者注)

为了抵达终端结点或者说获得结果,该过程从根节点开始。根据在根节点上做出的决定,选择分支节点。基于在分支节点上做出的决定,选择下一个子分支节点。这个过程继续下去,直到我们到达终端节点,终端节点的值是我们的结果。

Apache Spark中的决策树

Apache Spark中没有决策树的实现可能听起来很奇怪。然而从技术上来说是有的。在Apache Spark中,您可以找到一个随机森林算法的实现,该算法实现可以由用户指定树的数量。因此,Apache Spark使用一棵树来调用随机森林。

在Apache Spark中,决策树是在特征空间上执行递归二进制分割的贪婪算法。树给每个最底部(即叶子结点)分区预测了相同的标签。为了最大化树的节点处的信息增益,通过在一组可能的分支中选择其中的最佳分割来贪婪地选择每个分支结点。

节点不纯度(impurity)是节点上标签一致性的度量。目前的实施提供了两种不纯的分类方法(Gini杂质和熵(Gini impurity and entropy))。

停止规则

在满足以下列条件之一的情况下,在节点处停止递归树构建(即只要满足一个就停止,译者注):

  1. 节点深度等于训练用的 maxDepth 参数。
  2. 没有候选的分割结点导致信息收益大于 minInfoGain
  3. 没有候选的分割结点去产生(至少拥有训练minInstancesPerNode实例)的子节点 。

有用的参数

  • algo:它可以是分类或回归。
  • numClasses:分类类的数量。
  • maxDepth:根据节点定义树的深度。
  • minInstancesPerNode:对于要进一步拆分的节点,其每个子节点必须至少接收到这样的训练实例数(即实例数必须等于这个参数)。
  • minInfoGain:对于一个节点进一步拆分,必须满足拆分后至少提高这么多信息量。
  • maxBins:离散连续特征时使用的bin数。

准备决策树的训练数据

您不能直接向决策树提供任何数据。它需要一种特殊的格式来提供。您可以使用 HashingTF 技术将训练数据转换为标记数据,以便决策树可以理解。这个过程也被称为数据的标准化。

(数据)供给和获得结果

一旦数据被标准化,您就可以提供相同的决策树算法进来行分类。但在此之前,您需要分割数据以用于训练和测试目的; 为了测试的准确性,你需要保留一部分数据进行测试。你可以像这样提供数据:

val splits = data.randomSplit(Array(0.7, 0.3))
val (trainingData, testData) = (splits(0), splits(1))

// Train a DecisionTree model.
//  Empty categoricalFeaturesInfo indicates all features are continuous.

val numClasses = 2
val categoricalFeaturesInfo = Map[Int, Int]()
val impurity = "gini"
val maxDepth = 5
val maxBins = 32
val model = DecisionTree.trainClassifier(trainingData, numClasses, categoricalFeaturesInfo,
impurity, maxDepth, maxBins)

在这里,数据是我的标准化输入数据,为了训练和测试目的,我将其分成7:3的比例。我们正在使用最大深度的为5"gini" 杂质("gini" impurity)。

一旦模型生成,您也可以尝试预测其他数据的分类。但在此之前,我们需要验证最近生成的模型的分类准确性。您可以通过计算"test error"来验证其准确性。

// Evaluate model on test instances and compute test error
val labelAndPreds = testData.map { point =>
  val prediction = model.predict(point.features)
  (point.label, prediction)
}

val testErr = labelAndPreds.filter(r => r._1 != r._2).count().toDouble / testData.count()
println("Test Error = " + testErr)

就是这样!你可以在这里查看一个正在运行的例子。

本文的版权归 Steve Wang 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hbbliyong

WPF Trigger for IsSelected in a DataTemplate for ListBox items

<DataTemplate DataType="{x:Type vm:HeaderSlugViewModel}"> <vw:HeaderSlug...

4224
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2787
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

8838
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

5248
来自专栏跟着阿笨一起玩NET

c#实现打印功能

3782
来自专栏c#开发者

为什么nhibernate 不能保存on-to-many的结构

下面是主类文件 Code namespace EasyTalk.Module {     /// <summary>     /// SiteAddre...

2585
来自专栏ASP.NETCore

ASP.NET Core 整合Autofac和Castle实现自动AOP拦截

除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninjec...

754
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

3007
来自专栏芋道源码1024

熔断器 Hystrix 源码解析 —— 断路器 HystrixCircuitBreaker

本文主要基于 Hystrix 1.5.X 版本 1. 概述 2. HystrixCircuitBreaker 3. HystrixCircuitBreaker....

5827
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2980

扫码关注云+社区