整个流程包括数据处理部分和分类算法部分。数据处理部分对语料库进行处理生成算法能执行的标准格式。分类算法部分的实现被分作三个部分:训练器(The Trainer)、数据模型(The Model)、分类器(The Classifier)。
数据预处理
PrepareTwentyNewsgroups
for(dir in categoryDirectorys)
BayesFileFormatter.collapse(dir,分词器,outputdir,charset,outputfile);
→ dir.listFiles(new FileProcessor())
→ FileProcessor.accept();
→ Analyzer.tokenstream();//分词,得到tokenstream
→ BayesFileFormatter.writeFile();//label\ttokens
org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups对数据进行预处理:遍历根目录(categoryDirectorys)下面的所有子目录,并将子目录名作为类别名。对于每个子目录(存放着一个类别的数据),使用listFiles遍历所有的文件,并将文件交由FileProcessor的accpet函数处理。FileProcessor使用参数提供的分词器(如,lucence)处理每个文件,得到token序列。最后,调用writeFile函数,将每个文件的数据按照“label\ttoken token ...”的格式作为一行输出到输出文件(outputDir/labelName+".txt")
分类器训练过程
大致的执行路径:
TrainClassifier.trainNaiveBayes()
BayesDriver.runJob()
→BayesFeatureDriver.runJob()
FeaturePartation//决定什么样的key的item映射到同一reducer
FeatureLabelComparator//决定了不同item到达reducer的次序
BayesFeatureMapper
BayesFeatureReducer
BayesFeatureOutput//定义了reducer的输出位置
→BayesTfIdfDriver.runJob()
BayesTfIdfMapper
BayesTfIdfReducer
→BayesWeightSummerDriver.runJob()
BayesWeightSummerMapper
BayesWeightSummerReducer
→BayesThetaNormalizerDriver.runJob() //求贝叶斯的m-估计
BayesThetaNormalizerMapper
BayesThetaNormalizerMapper
每个Job下Mapper与Reducer执行的工作与输出:
BayesFeatureMapper
一行输入就是一个文档,label为该文档的标签,token为特征即文档中的单词,BayesFeatureMapper的输出为MapReducer的标准形式:key,value。输出的每一行在数据模型里都是一个item,如下:
WEIGHT key: _WT label token value:Log[(1.0+dKJ)/(∑dKJ2)1/2] //某文档中某单词的TF值
DOCUMENT FREQUENCY key: _DF label token value: 1
FEATURE COUNT key: _FC token value: 1
FEATURE TERM FREQUENCY key: _FF token value: dkj
LABEL COUNT key: _LC label value: 1
BayesFeatureReducer
该Mapper将处理相同的key的item,并执行合并操作,并将合并的结果输出到BayesFeatureOutput类中配置的路径中。由Mapper的输出可以预见每一项输出的value的意义:
LABEL_COUNT key:_LC,label value:label下的文档数
DOCUMENT_FREQUENCY key:_DF,label,token value:label下出现token的文档数
FEATURE_COUNT key:_FC,token value:出现token的文档数
WEIGHT key:_WT,label,token value: ∑(Log[(1.0+dKJ) /SQRT(∑dKJ2)])(即label下token的TF值)
BayesTfIdfMapper
根据BayesFeatureReducer输出到文件中的数据计算IDF=某类下的文档数(LABEL_COUNT)/某类下出现该token的文档数(DOCUMENT_FREQUENCY)。输出如下:
WEIGHT key: _WT,label,token value: logidf
WEIGHT key: _WT,label,token value: tf
FEATURE_SET_SIZE key: _FS value: 1
BayesTfIdfReducer
根据Mapper输出的tf值和idf值计算TF-IDF,并统计FEATURE_SET_SIZE的总和为vocabCount,并输出:
FEATURE_SET_SIZE key: _FS value: vocabCount
WEIGHT key:_WT,label,token value: TF-IDF
BayesWeightSummerMapper
每个Mapper统计该Mapper下所有label下某token(_SJ)的TF-IDF的值总和,某label(_SK)下所有token的TF-IDF的值总和,以及所有label下所有token的TF-IDF的值:
FEATURE_SUM key: _SJ,token value: TF-IDF
LABEL_SUM key: _SK,label value: TF-IDF
TOTAL_SUM key: _SJSK value: TF-IDF
BayesWeightSummerReducer
Reducert将各个Mapper node下相同token的值合并,求得所有数据下feature、label、total值,即:
FEATURE_SUM key: _SJ,token value: SUM(TF-IDF)
LABEL_SUM key: _SK,label value: SUM(TF-IDF)
TOTAL_SUM key: _SJSK value: SUM(TF-IDF)
BayesThetaNormalizerMapper
该Mapper将求贝叶斯的m-估计,至于其必要性,以及为什么公式是这样的,详见 贝叶斯的m-估计:
LABEL_THETA_NORMALIZER key: _LTN,label value: log(( tfidf +1)/(vocabCount+SigmaK))
BayesThetaNormalizerReducer
将所有Mapper的数据执行合并操作
LABEL_THETA_NORMALIZER key: _LTN label value: SUM(log(( tfidf +1)/(vocabCount+SigmaK)))
分类器分类过程
分类过程有串行和并行两种实现,下面只介绍并行实现。
TestClassifier.classifyParallel()
BayesClassifierDriver.runJob()
→BayesClassifierMapper.configure()
ClassifierContext.initialize();
InMemoryBayesDatastore.initialize();
//将训练模型装入datastore
BayesAlgorithm.initialize();
→BayesClassifierMapper.map()
ClassifierContext.classifyDocument();
BayesAlgorithm.classifyDocument();
→BayesClassifierReducer
BayesClassifierMapper
Mapper在初始化时运行ClassifierContext.initialize(),然后调用SequenceFileModelReader的loadModel方法将输入装入datastore。其次,运行map函数,最终调用BayesAlgorithm.classifyDocument()。对每个类别循环,调用documentWeight,先计算文档中每个词的次数生成一个Map类型的wordlist,针对wordlist的each pair计算:
∑[frequency×featureweight(datastore,label,word)]。
其中featureweight函数返回log[(tfidf+1.0)/(sumLabelWeight+vocabCount)]
documenWeight返回的值是测试文档属于某类的概率的大小,即所有属性的在某类下的frequency×featureweight之和,值得注意的是sumLabelWeight是类别下权重之和。与在其他类下的和值进行比较,取出最大值的label,该文档就属于此类,并输出:
CLASSIFIER_TUPLE key:_CT correctLabel classifiedLabel value:1
BayesClassifierReducer
合并Mapper的结果,输出:
CLASSIFIER_TUPLE key:_CT correctLabel classifiedLabel value:正确分类的文档数
总结:贝叶斯原理,后验概率=先验概率×条件概率。此处没有乘先验概率,直接输出为最佳label,可能是因为所用的20个新闻的数据每类中的文档数大致一样(先验概率几乎一样)。
http://blog.csdn.net/cyningsun/article/details/8679989
相关推荐
在Mahout中,朴素贝叶斯算法常用于文本分类,如垃圾邮件检测、新闻分类等。Mahout实现的朴素贝叶斯分类器支持多元高斯模型和多项式模型,适应不同类型的特征数据。 3. **Mahout的朴素贝叶斯实现** Mahout提供了两...
Apache Mahout是一个基于Hadoop的机器学习库,它提供了一系列的算法,包括聚类、分类和协同过滤,用于大数据分析。贝叶斯分类器是其中一种常用的文本分类方法,因其简单高效而在实际应用中广泛使用。 首先,我们要...
在Java编程环境中实现贝叶斯算法,可以借助各种库,如Weka、Apache Mahout等,但这里的源代码是独立编写的,可以帮助开发者深入理解算法内部工作流程。源代码可能包括以下几个部分: 1. 数据预处理:数据清洗,去除...
贝叶斯算法是一种基于概率统计的分类方法,尤其在文本分类领域中广泛应用。它的核心思想是利用贝叶斯定理来更新先验概率,通过已知的训练数据集来预测未知数据的类别。在Java中实现贝叶斯算法,通常会涉及到以下几个...
《Mahout in Action》是一本深入探讨Apache Mahout机器学习框架的专业书籍,其源码提供了丰富的实践示例和深入理解Mahout算法的机会。在GitHub上,你可以找到这些源码的完整版本,链接为。下面,我们将详细探讨...
使用Maven作为构建工具,可以方便地编译和打包Mahout源码。通过以下步骤,你可以自行编译源码并进行测试: 1. 首先,确保安装了Java开发环境(JDK)和Maven。 2. 解压`mahout-distribution-0.7-src.zip`文件到本地...
2. **源码分析**: 在源码中,您可以探索Mahout实现的各种算法,如协同过滤(Collaborative Filtering)、频繁项集挖掘(Frequent Itemset Mining)、近邻搜索(Nearest Neighbor Search)等。这些算法是通过Java...
源码分析可以帮助读者深入理解算法的实现细节,从而更好地定制和优化算法以适应特定需求。 通过阅读源码,你可以学习到如何组织一个大型机器学习项目的代码结构,理解算法的设计思路,以及如何利用Hadoop进行分布式...
分类算法在Mahout中主要包括决策树(ID3、C4.5)、朴素贝叶斯和随机森林等。ID3是最早的决策树算法,而C4.5是对ID3的改进,处理连续特征更有效。朴素贝叶斯基于概率模型,假设特征之间相互独立,适用于文本分类。...
"mahout-0.3.tar"是Mahout项目在0.3版本的源码或二进制发行版的压缩文件,通常包含了项目的源代码、构建脚本、文档和其他必要的资源。 在Mahout 0.3版本中,我们可以探索以下几个关键知识点: 1. **推荐系统**:...
分析Mahout源码有助于理解分布式机器学习的实现细节,对于开发者来说,可以学习如何在实际项目中设计和优化算法,以及如何利用Hadoop进行大数据处理。 8. **持续发展**: Apache Mahout项目不断更新和维护,以...
在IT领域,尤其是在数据分析和机器学习中,Spark框架与朴素贝叶斯算法的结合常常用于处理大规模数据,例如股票市场的预测。本项目就是一个基于Spark API的朴素贝叶斯(Naive Bayes)股票预测实例,它包括了从原始...
总的来说,通过《Mahout in Action》的源码,你将能深入了解机器学习算法的实现原理,以及如何在大数据环境中有效地运用它们。这将对你的数据挖掘技能提升大有裨益,也能为开发智能应用打下坚实的基础。
6. **源码分析**:深入源码层面,解析Mahout算法的实现细节,帮助开发者理解如何根据需求进行修改和扩展。 7. **性能调优**:介绍如何优化Mahout的性能,包括调整Hadoop集群参数、并行度控制和内存管理。 8. **...
Mahout提供了丰富的预定义算法,如协同过滤、决策树、朴素贝叶斯等,用于开发智能应用。 **2. Kddcup 1999数据集** Kddcup 1999是网络安全领域的经典数据集,主要用于异常检测和入侵检测系统的研究。该数据集包含了...
配置庖丁解牛包的配置文件)然后利用mahout 中的牛人已经写好的分布式程序(文本分类器贝叶斯算法cbayes:计算出现在训练集中每一个的概率)在公司是用来根据访问内容判断用户喜好个人评论的分析。开发环境实际是...
- **Mahout**:接触机器学习库,进行大规模数据的预测和分析。 - **Spark**:深入理解Spark的内存计算模型,适用于批处理和实时分析。 - **Storm**:学习实时数据处理框架,处理连续的数据流。 **大数据数据采集...