分享

Spark 高级分析:第四章第11,12,13节

feilong 2018-2-9 09:08:43 发表于 推荐型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 6939

问题导读

1.什么是随机决策决策森林?
2.如何做预测?
3.Spark实现了哪几种分类算法?





上一篇:Spark 高级分析:第四章第9,10节
http://www.aboutyun.com/forum.php?mod=viewthread&tid=23915&extra=


第11节 随机决策森林

如果你一直遵循代码示例,那么你可能已经注意到,你的结果与书中代码清单中的结果稍有不同。这是因为在构建决策树时存在随机性的元素,在决定使用什么数据和探索哪些决策规则时,随机性就会发挥作用。

该算法实际上并没有考虑每个层次上的所有可能的决策规则。这样做可能需要花费大量的时间。对于超过N个值的分类特性,有2N - 2个可能的决策规则(除了空集和集合本身之外的每个子集,这是没有意义的)。即使是相当大的N,也会产生数十亿的候选决策规则。

相反,决策树使用几个启发式来更聪明地考虑哪些规则需要实际考虑。挑选规则的过程也涉及到一些随机性;每次只对随机抽取的几个特征进行观察,并且只从训练数据的随机子集中得到值。这种方法在速度上有一定的准确性,但这也意味着决策树算法不会每次都构建相同的树。这是一件好事。

这很好,因为“群体智慧”通常比个人的预测更有说服力。

为了说明这一点,我们来做一个快速的小测验:伦敦有多少辆黑色出租车?

不要看下面;先猜。

我猜是10000,偏离正确的答案19000。因为我猜的很低,你可能比我猜得更高,所以我们的答案的平均值会更准确,这就是回归均值的回归。一项针对13人的非正式调查的平均猜测是:11,170。

这一效应的关键在于猜测是相互独立的,并没有相互影响。(你没偷看,是吗?)如果我们一致同意并使用相同的方法进行猜测,那么这个练习将是无用的,因为猜测可能是相同的答案——同样可能是错误的答案。如果我只是预先说出我的猜测,那就更糟了。

如果没有一棵树,而是许多树,每棵树都能产生合理但不同的、独立的对目标价值的估计,那就太好了。他们的集体平均预测应该接近真实答案,比任何一棵树的预测都要多。正是构建过程中的随机性帮助我们创造了独立。这是随机决策森林的关键。

通过RandomForest, Spark MLlib可以构建随机决策森林,顾名思义,它是独立构建的决策树的集合。调用几乎是相同的:
[mw_shl_code=scala,true]val forest = RandomForest.trainClassifier(
trainData, 7, Map(10 -> 4, 11 -> 40), 20,
"auto", "entropy", 30, 300)[/mw_shl_code]
出现了两个新的参数,而DecisionTree.trainClassifier()。首先是一些树的建造,当然,这里是20。这个模型的建造过程可能比以前要长得多,因为正在建造的树多了20倍。

第二种策略是选择在树的每个级别上评估哪些特性,在这里设置为“auto”。随机决策森林的实现实际上甚至不会考虑每个特性作为决策规则的基础,而只是所有特性的一个子集。这个参数控制它如何选择子集。当然,只检查几个特性是比较快的,而且对现在正在构建更多的树的速度是很有帮助的。

然而,它也使得个体树木的决策更加独立,使得整个森林更不容易过度拟合。如果一个特定的特性包含有噪声的数据,或者只有在训练集中有迷惑性的预测,那么大多数时候大部分数树都不会考虑这个问题。大多数树都不会有噪音,而且会倾向于“胜过”森林里的那些树。

事实上,当构建一个随机决策森林时,每棵树都不一定能看到所有的训练数据。出于类似的原因,他们可能会被随机选择其中的一个子集。

对随机决策森林的预测仅仅是树木预测的加权平均值。对于分类目标,这可以是多数投票,也可以是基于树产生的概率平均值的最可能值。随机决策森林,像决策树一样,也支持回归,而森林的预测是每棵树预测的平均值。

这一随机森林模型的精确度为96.3%,虽然从另一种角度来看,这一比例比最佳决策树的错误率降低了33%,从5.5%下降到3.7%。

随机决策森林在大数据的背景下是有吸引力的,因为树应该是独立构建的,而像Spark和MapReduce这样的大数据技术本身就需要数据并行的问题,在这些问题中,整体解决方案的部分可以独立于数据的部分计算。事实上,树不但可以而且应该只对一个子集的特性或输入数据进行培训,这就为并行化提供了一种简单而简单的方法构建的树。

虽然Spark MLlib还没有直接支持它,但是随机决策森林也可以在这个过程中评估它们自己的准确性,因为通常树只建立在所有训练数据的一个子集上,并且可以在内部对剩余的数据进行交叉验证。这意味着森林甚至可以知道它的哪些树是最准确和最重要的。

该属性还可以评估输入的哪些特性对预测目标最有帮助,从而帮助解决特征选择问题。这超出了本章和MLlib的范围。

第12节 预测

构建一个分类器,虽然有趣,但却有一个微妙的过程,并这不是最终的目的。当然,我们的目标是做出预测。这是回报,相对来说比较容易。上面的训练集由LabeledPoint实例组成,每个实例都包含一个Vector和一个目标值。它们分别是输入和已知输出。波尔说,当做出预测时——尤其是关于未来的预测——产出当然是未知的。

到目前为止所显示的决策树和随机森林训练的结果分别是DecisionTreeModel和RandomForestModel对象。两者都包含一个方法,predict()。它接受一个Vector,就像LabeledPoint的特征向量部分一样。因此,可以通过将其转换为特征向量并预测其目标类的方法来分类一个新示例:
[mw_shl_code=scala,true]val input = "2709,125,28,67,23,3224,253,207,61,6094,0,29"
val vector = Vectors.dense(input.split(',').map(_.toDouble))
forest.predict(vector)[/mw_shl_code]
结果应该是4.0,它对应的是原来的Covtype数据集中的第5类(原始特性是1-索引),这个例子中描述的土地的预测覆盖类型是“Aspen”。很明显。

第13节 下一步

本章介绍了机器学习的两个相关的重要类型,分类和回归,以及构建和调优模型的一些基本概念:特征、向量、训练和交叉验证。它演示了如何利用Covtype数据集,利用Covtype数据集预测一种类型的森林覆盖,并使用Spark MLlib中实现的决策树和森林。

与前一章的推荐一样,继续探究超参数对准确性的影响可能是有用的。大多数决策树超参数交易时间的准确性:更多的容器和树通常会产生更好的准确性,但是达到了一个收益递减点会返回。

这里的分类器非常准确;它竟然达到了超过95%的精确度。一般来说,通过包含更多的特性,或者将现有的特性转化为更具有预测性的形式,可以进一步提高准确性。这是迭代改进分类器模型的常见步骤。例如,对于这个数据集,两个特征编码水平和垂直距离的地表水特征可以产生第三个特征:直线距离的地表水特征。这可能比原来的功能更有用。或者,如果可以收集更多的数据,我们可以尝试添加新的信息,比如土壤湿度,以提高分类。

当然,在现实世界中,并不是所有的预测问题都与Covtype数据集完全一样,例如,一些问题需要预测一个连续的数值,而不是一个分类值。同样的分析和代码也适用于这种类型的回归问题;在这种情况下,trainssor()方法将代替trainClassifier()。

此外,决策树和森林并不是唯一的分类或回归算法,并且不是唯一在Spark MLlib中实现的。对于分类,它包括:
•朴素贝叶斯
•支持向量机(SVMs)
•逻辑回归

是的,逻辑回归是一种分类技术。在引擎盖下面,它通过预测一个类概率的连续函数来分类。这个细节没有必要理解。

每一种算法的运作方式与决策树和森林完全不同。但是,许多元素是相同的:它们接受LabeledPoint作为输入的RDD,并且有必须通过输入数据的训练、交叉验证和测试子集来选择的超参数。同样的一般原则,与这些其他算法,也可以被部署到模型分类和回归问题。

这些都是引导性学习的例子。当某些或全部目标值未知时,会发生什么?接下来的章节将探讨在这种情况下可以做些什么。

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条