分享

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

feilong 2017-11-10 21:02:01 发表于 连载型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 4 5010
问题导读

1.样例中是如何选择特征值作为分析依据的?
2.Spark Mlib是什么?
3.文章中建议学习Scala可以选择哪两本书?






上一篇:Spark 高级分析:第二章第9,10节
http://www.aboutyun.com/forum.php?mod=viewthread&tid=23245&page=1#pid244372



第11节 Simple Variable Selection and Scoring 简单变量选择和评分
     利用statsWithMissing函数我们可以分析RDD中分布式分数数组里匹配的和不匹配的数据:
[mw_shl_code=scala,true]val statsm = statsWithMissing(parsed.filter(_.matched).map(_.scores))
val statsn = statsWithMissing(parsed.filter(!_.matched).map(_.scores))[/mw_shl_code]
     statsm 和statsn 有相同的结构但是它们描述的是不同的数据集合:statsm 包含的是分数数组中匹配的数据的统计,statsn 包含的是未匹配的。我们可以使用列的值的差异作为一个简单的分析,以帮助我们提出一个评分功能,从匹配好的分数中鉴别匹配的和非匹配的:
[mw_shl_code=scala,true]statsm.zip(statsn).map { case(m, n) =>
(m.missing + n.missing, m.stats.mean - n.stats.mean)
}.foreach(println)
...
(1007,0.2854529057466858)
(5645434,0.09104268062279874)
(0,0.6838772482597568)
(5746668,0.8064147192926266)
(0,0.03240818525033484)
(795,0.7754423117834044)
(795,0.5109496938298719)
(795,0.7762059675300523)
(12843,0.9563812499852178)[/mw_shl_code]
     一个好的特性有两个属性:它对匹配和非匹配都有显著不同的值(所以方法之间的差别会很大),而且在数据中经常发生,我们可以依赖它作为任何一对记录是否定期可用的判断标准。通过这种方法,特征1不太有用:它缺少很多时间,而匹配和非匹配的平均值的差异相对较小——0.09,分数从0到1不等。特性4也不是特别有用。尽管它对任何一对记录都是可用的,但方法上的差别仅为0.03。
     特点5、7,从另一方面来说是优秀的:他们几乎总是发生在任何一条记录中,并有一个非常大的差异平均值(超过0.77为特征)。特点2、6、8似乎也有好处:他们在数据集中大部分可用并且匹配非匹配平均值的差异是巨大的。
功能0和3更像是一个混合包:特性0不区分所有的好(手段的差异只有0.28),即使它通常是一对记录,而功能3有很大的差异的手段,但它几乎总是缺失。在什么情况下,我们应该在这些模型中包含这些特征,这并不十分明显。
     现在,我们将使用一个简单的评分模型,根据明显好的特征值的总和,排列成对记录的相似性:2、5、6、7和8。对于缺少这些特征值的少数记录,我们将使用0代替我们的总和中的NaN值。我们可以通过创建一个RDD得分和匹配值和评价以及对比赛得分和非在不同阈值匹配获得我们的简单模型性能的粗糙感:
[mw_shl_code=scala,true]def naz(d: Double) = if (Double.NaN.equals(d)) 0.0 else d
case class Scored(md: MatchData, score: Double)
val ct = parsed.map(md => {
val score = Array(2, 5, 6, 7, 8).map(i => naz(md.scores(i))).sum
Scored(md, score)
})[/mw_shl_code]
     使用4的高阈值,这意味着五个特征的平均值为0.8,我们过滤掉几乎所有的非匹配,同时保留超过90%的匹配值:
[mw_shl_code=scala,true]ct.filter(s => s.score >= 4.0).map(s => s.md.matched).countByValue()
...
Map(false -> 637, true -> 20871)[/mw_shl_code]
     使用2的下限阈值,我们可以确保捕获所有已知的匹配记录,但在误报方面花费很大:
[mw_shl_code=scala,true]ct.filter(s => s.score >= 2.0).map(s => s.md.matched).countByValue()
...
Map(false -> 596414, true -> 20931)[/mw_shl_code]
     尽管误报的数量比我们预期的要高,但这个更慷慨的过滤器仍然从我们的预计的结果中删除了90%的非匹配记录,同时包括每个正匹配。虽然这是很好的,但也可能做得更好;如果你能找到一种方式,用一些分数数组(缺失和未缺失的)其他的值想出一个评分功能,在小于一百的误报成本下成功地识别每一个真正的匹配。

第12节 Where To Go From Here 下一步
     如果这一章是你第一次使用Scala和Spark进行数据准备和分析,我们希望你能感觉到这些工具强大的功能。如果你使用Scala和Spark已经有一段一段时间,我们希望你能给你的朋友和同事通过这章介绍Scala和Spark。
     本章的目标是为你提供足够的Scala知识,以便理解并执行本书中的其他方法。如果你是通过练习实例学习的人,你的下一步是继续下一章,我们将向你介绍Spark的机器学习库--MLlib。
     当你成为Spark和Scala的经验丰富的数据分析用户时,你很可能会达到一个x新的点,即开始构建工具和库,以帮助其他分析师和数据科学家应用Spark来解决他们自己的问题。在你发展的这一点上,像Dean Wampler和Alex Payne著的Scala编程,和由Alvin Alexander写的Scala CookBook将有助你于选择其他的关于Scala的书。

已有(4)人评论

跳转到指定楼层
sadfdfgfhg 发表于 2019-1-9 09:19:10
辛苦了  感谢
回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条