学会用Spark实现朴素贝叶斯算法

  1. 本地模式(local):单机运行,将Spark应用以多线程方式直接运行在本地,通常只用于测试。我一般都会在windows环境下做充足的测试,无误以后才会打包提交到集群去执行。慎重!
  2. YARN/mesos模式:运行在资源管理系统上,对于Yarn存在两种细的模式,yarn-client和yarn-cluster,它们是有区别的。

一张图知晓yarn-client模式

一张图知晓yarn-cluster模式

为了安全起见,如果模型结果文件最终都是存于HDFS上的话,都支持使用yarn-cluster模式,即使某一个节点出问题,不影响整个任务的提交和执行。

总结:很多做大数据挖掘的朋友,代码能力和大数据生态圈的技术会是一个软弱,其实这点是很不好的,关键时候容易吃大亏。而我上面所提的,都是围绕着写好一个场景模型,从code实现到上线发布都需要留心的知识点。多一份了解,少一分无知。况且一天谈什么算法模型,落地都成困难,更别提上线以后对模型的参数修改和特征筛选。

第三部分:创作第一个数据挖掘算法(朴素贝叶斯)

看过以前文章的小伙伴都应该知道,在业务层面上,使用场景最多的模型大体归纳为以下四类:

  • 分类模型,去解决有监督性样本学习的分类场景。
  • 聚类模型,去自主判别用户群体之间的相似度。
  • 综合得分模型,去结合特征向量和权重大小计算出评估值。
  • 预测响应模型,去以历为鉴,预测未来。

所以我这里首先以一个简单的分类算法来引导大家去code出算法背后的计算逻辑,让大家知晓这样一个流程。

朴素贝叶斯的实现流程

  1. 理解先验概率和后验概率的区别?

    a.先验概率:是指根据以往经验和分析得到的概率。简单来说,就是经验之谈,打趣来说——不听老人言,吃亏在眼前。

    b.后验概率:是指通过调查或其它方式获取新的附加信息,去修正发生的概率。也就是参考的信息量更多、更全。

  2. 它们之间的转换,推导出贝叶斯公式

条件概率:

注:公式中P(AB)为事件AB的联合概率,P(A|B)为条件概率,表示在B条件下A的概率,P(B)为事件B的概率。

推导过程:

将P(AB)带入表达式

贝叶斯公式:

简单来说,后验概率 = ( 先验概率 * 似然度)/标准化常量。

扩展:

三、如何去理解朴素二字?

朴素贝叶斯基于一个简单的假定:给定特征向量之间相互条件独立。

朴素体现:

考虑到P(B1B2...Bn)对于所有类别都是一样的。而对于朴素贝叶斯的分类场景并需要准确得到某种类别的可能性,更多重点在于比较分类结果偏向那种类别的可能性更大。因此从简化度上,还可以对上述表达式进行优化。

简化公式:

这也是朴素贝叶斯得以推广使用一个原因,一方面降低了计算的复杂度,一方面却没有很大程度上影响分类的准确率。

但客观来说,朴素的假设也是这个算法存在缺陷的一个方面,有利有弊。

四、如何动手实现朴素贝叶斯算法

这里面有很多细节,但是为了迎合文章的主题,不考虑业务,只考虑实现。我们假设已经存在了下面几个东西:

  • 场景就假设为做性别二分类。
  • 假设所有特征向量都考虑完毕,主要有F1、F2、F3和F4四个特征影响判断用户性别。
  • 假设已经拥有训练样本,大约10000个,男性和女性样本各占50%。
  • 假设不考虑交叉验证,不考虑模型准确率,只为了实现分类模型。
  • 这里优先使用80%作为训练样本,20%作为测试样本。