Decision Trees in Apache Spark (Apache Spark中的决策树)
Decision Trees in Apache Spark
原文作者:Akash Sethi 原文地址:https://dzone.com/articles/decision-trees-in-apache-spark 译者微博:@从流域到海域 译者博客:blog.csdn.blog/solo95 本文同样刊载于腾讯云+:https://cloud.tencent.com/developer/article/1034616
Apache Spark中的决策树
决策树是在顺序决策问题进行分类,预测和促进决策的有效方法。决策树由两部分组成:
- 决策(Desion)
- 结果(Outcome)
决策树包含三种类型的节点:
- 根节点(Root node):包含所有数据的树的顶层节点。
- 分割节点(Splitting node):将数据分配给子组(subgroup)的节点。
- 终端节点(Terminal node):最终决定(即结果)。
(分割节点(Splitting node),仅就离散数学中的树的概念而言,就是指分支节点,下面的翻译为了强调”分支”有时会翻译成分支结点,译者注)
为了抵达终端结点或者说获得结果,该过程从根节点开始。根据在根节点上做出的决定,选择分支节点。基于在分支节点上做出的决定,选择下一个子分支节点。这个过程继续下去,直到我们到达终端节点,终端节点的值是我们的结果。
Apache Spark中的决策树
Apache Spark中没有决策树的实现可能听起来很奇怪。那么从技术上来说呢 在Apache Spark中,您可以找到一个随机森林算法的实现,该算法实现可以由用户指定树的数量。因此,Apache Spark使用一棵树来调用随机森林。
在Apache Spark中,决策树是在特征空间上执行递归二进制分割的贪婪算法。树给每个最底部(即叶子结点)分区预测了相同的标签。为了最大化树的节点处的信息增益,通过在一组可能的分支中选择其中的最佳分割来贪婪地选择每个分支结点。
节点不纯度(impurity)是节点上标签一致性的度量。目前的实施提供了两种不纯的分类方法(Gini杂质和熵(Gini impurity and entropy))。
停止规则
在满足以下列条件之一的情况下,在节点处停止递归树构建(即只要满足一个就停止,译者注):
- 节点深度等于训练用的
maxDepth
参数。 - 没有候选的分割结点导致信息收益大于
minInfoGain
。 - 没有候选的分割结点去产生(至少拥有训练
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)
就是这样!你可以在这里查看一个正在运行的例子。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- laravel 解决强制跳转 https的问题
- 在laravel中实现将查询的对象转换为多维数组的函数
- 在Laravel 中实现是否关注的示例
- Laravel框架查询构造器常见用法总结
- laravel 解决多库下的DB::transaction()事务失效问题
- laravel 实现上传图片到本地和前台访问示例
- laravel框架模型中非静态方法也能静态调用的原理分析
- Laravel 5.2 文档 数据库 —— 起步介绍
- laravel csrf排除路由,禁止,关闭指定路由的例子
- thinkphp框架类库扩展操作示例
- Laravel ORM 数据model操作教程
- Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
- laravel 解决Eloquent ORM的save方法无法插入数据的问题
- laravel框架中控制器的创建和使用方法分析
- php 使用expat方式解析xml文件操作示例