`
lbxhappy
  • 浏览: 303326 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mahout中bayes分类分析—1

 
阅读更多

根据http://blog.163.com/jiayouweijiewj@126/blog/static/17123217720113115027394/进行了bayes学习分析,部分内容做了更改:

首先解释下 TFIDF原理:

 TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份 文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜寻 引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜寻引擎还会使用基于连结分析的评级方法,以确定文件在搜寻结 果中出现的顺序。

  TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很 少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TFIDF实际上是:TF * IDF,TF词频(Term Frequency),IDF反文档频率(Inverse Document Frequency)。TF表示词条在文档d中出现的频率。IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有 很好的类别区分能力。如果某一类文档C中包含词条t的文档数为m,而其它类包含t的文档总数为k,显然所有包含t的文档数n=m+k,当m大的时候,n也 大,按照IDF公式得到的IDF的值会小,就说明该词条t类别区分能力不强。但是实际上,如果一个词条在一个类的文档中频繁出现,则说明该词条能够很好代 表这个类的文本的特征,这样的词条应该给它们赋予较高的权重,并选来作为该类文本的特征词以区别与其它类文档。这就是IDF的不足之处.

原理

  在一份给定的文件里,词频 (term frequency, TF) 指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否。)   逆向文件频率 (inverse document frequency, IDF) 是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。   某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语



实现包括三部分:The Trainer(训练器)、The Model(模型)、The Classifier(分类器)

1、训练

首先, 要对输入数据进行预处理,转化成Bayes M/R job 读入数据要求的格式,即训练器输入的数据是 KeyValueTextInputFormat 格式,第一个字符是类标签,剩余的是特征属性(即单词)。以 20 个新闻的例子来说,从官网上下载的原始数据是一个分类目录,下面每个文件夹名就是类标签,里面是属于此类的一些文档(一个文件是一篇文章)。 mahout 通过 org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups 对数据进行预处理,完成的工作是对于原始的一个分类目录下面的所有文件,依次遍历,并将目录名作为类别名,就这样完成了 inputDir -- >outputFile 的转变。如果要处理 html 文件的话,那么就需要在 BayesFileFormatter 调用 html clean extract body text 的过程,生成 cleaned text

PrepareTwentyNewsgroups调用 org.apache.mahout.classifier.BayesFileFormatter org.apache.lucene.analysis.standard.StandardAnalyzer 进行分析处理,将数据转换成了:类标签作为一个文件的名字,文件里每一个行(一个回车算一行)是包含在此类中的一篇文章(格式是:类标签 一篇文章中的所有单词)。

BayesFileFormatter的作用是把一个目录里的所有文件转换成一个文件, label \t content 其中的文件内容全部经过 tokenize ,词之间加入空格,存入 content BayesFileFormatter.collapse 的作用是将一个目录的所有文件加上 label 处理成 MapReduce 所需要的按行处理的文件格式 , 变成 1 个文件。

其次, 调用org.apache.mahout.classifier.bayes.TrainClassifier 进行训练,结果生成 newsmodel

这个类会根据命令行参数调用两个训练器: trainCNaiveBayes trainNaiveBayes ,其中trainCNaiveBayes 函数调用 CBayesDriver 类; trainNaiveBayes 调用 BayesDriver 类。

这里只分析org.apache.mahout.classifier.bayes.mapreduce.bayes.BayesDriver 类,它实现了 BayesJob 接口,在 runJob 函数里调用 4 map/reduce 作业类:

第一个:BayesFeatureDriver 负责 Read the features in each document normalized by length of each document

第二个:BayesTfIdfDriver 负责 Calculate the TfIdf for each word in each label

第三个:BayesWeightSummerDriver 负责 alculate the Sums of weights for each label, for each feature

第四个:BayesThetaNormalizerDriver 负责: Calculate the normalization factor Sigma_W_ij for each complement class

20-news 的例子分别分析这四个类:

BayesFeatureDriver

所在包:package org.apache.mahout.classifier.bayes.mapreduce.common;

输入格式:KeyValueTextInputFormat.class

输出格式:BayesFeatureOutputFormat.class

输出key 类型: StringTuple.class

输出value 类型: DoubleWritable.class

Map BayesFeatureMapper.class

Reduce BayesFeatureReducer.class

注意:BayesFeatureDriver 可以独立运行,默认的输入和输出:/home/drew/mahout/bayes/20news-  input /home/drew/mahout/bayes/20-news-features

只要在 hdfs上存在输入路径,运行完成后会有输出

input=new Path("/home/drew/mahout/bayes/20news-input");

output=new Path("/home/drew/mahout/bayes/20-news-features");

p=new BayesParameters(1) gramsize默认为 1

BayesFeatureOutputFormat继承了 MultipleOutputFormat ,定义了产生的四个文件路径及名字,文件的格式还是 SequenceFileOutputFormat.

$OUTPUT/trainer-wordFreq

$OUTPUT/trainer-termDocCount

$OUTPUT/trainer-featureCount

$OUTPUT/trainer- docCount

BayesFeatureMapper的输出为:

一行一个map,根据数据处理的格式即一篇文章一个map,以下的label指类标签,token是属性即单词,dKJ是某token在本篇文章中出现的次数,∑dKJ 2 是本篇文章中所有token出现次数的平方和,以下及后面的表格是觉得看着清楚自己画的,输出时只是里面的内容,例如:_WT,label,token空格value的值

 

key

value

_WT,label,token

L og[(1.0+dKJ)/(∑dKJ 2 1/2 ]即为某词在一个文档中的TF值

通俗点就是: L og[(1.0+某属性在本篇文章中出现的次数)/(本篇文章中所有属性出现次数的平方和) 1/2 ]

_DF,label,token

1.0出现的 文档

_FC,token

1.0 出现的 文档

_LC,label

1.0 出现的 文档

BayesFeatureReducer的输出为:

相同的key 放在一个 reduce 里执行合并

 

key

value

输出

_WT,label,token

L og[(1.0+dKJ)/(∑dKJ 2 1/2 ]即某类中某属性的TF值

trainer-wordFreq

_DF,label,token

某label中出现某token的文档数

trainer-termDocCount

_FC,token

所有训练集文章中出现某token的文档数

trainer-featureCount

_LC,label

某label下的文档数

trainer- docCount

_FT,token

与_FC的value一样

没输出且只在mhaout-0.4里出现这部分计算,0.3里没有

 

BayesTfIdfDriver

输入格式:SequenceFileInputFormat.class

输出格式:BayesTfIdfOutPutFormat.class

输出key 类型: StringTuple.class

输出value 类型: DoubleWritable.class

输入路径:就是第一个map/reduce 生成的 trainer-wordFreq trainer-termDocCount trainer-featureCount 文件

输出:trainer-tfIdf 文件

Map BayesTfIdfMapper.class

Reduce BayesTfIdfReducer.class

根据BayesFeatureReducer 的输出文件计算 TF-IDF 值,但是只调用了以上的 trainer-wordFreq trainer-termDocCount trainer-featureCount 三个文件,计算完毕后生成两个文件 trainer-tfIdf trainer- vocabCount BayesTfIdfOutPutFormat 里有)。 最后在BayesDriver里会删除这些中间文件

 Path docCountOutPath = new Path(output, "trainer-docCount");
    HadoopUtil.delete(conf, docCountOutPath);

BayesTfIdfMapper的输出为:

TF值是调用 trainer-wordFreq 中的value

Idf=某类下的文档数 / 某类下出现该 token 的文档数

其中某类下出现该token 的文档数是调用 trainer-termDocCount 中的value

 

key

value

_WT,label,token

TF值

_WT,label,token

logidf

_FS

1.0

 

BayesTfIdfReducer 的输出为:

 

key

value

输出

_WT,label,token

TF × logidf

trainer- tfidf

_FS

属性总数

trainer- VocabCount

 

BayesWeightSummerDriver

输入文件格式:SequenceFileInputFormat.class

输出文件格式:BayesWeightSummerOutputFormat.class

输出key StringTuple.class

输出value DoubleWritable.class

输入路径:是第二个map/reduce 生成的 trainer-tfIdf 文件

输出:trainer-weights 文件

Map BayesWeightSummerMapper.class

Reduce BayesWeightSummerReducer.class

这里只调用了第二个map/reduce 生成的 trainer-tfIdf ,没有调 trainer- VocabCount

BayesWeightSummerMapper的输出为:

 

key

value

_SJ,token

TFIdf值

_SK,label

TFIdf值

_SJSK

TFIdf值

 

BayesWeightSummerReducer 的输出为:

 

key

value

输出

_SJ,token

某属性的全部TFIdf总和

Sigma_j

_SK,label

某类下的所有属性的TFIdf总和

Sigma_k

_SJSK

所有的TFIdf值

Sigma_kSigma_j

 

BayesThetaNormalizerDriver

输入文件格式:SequenceFileInputFormat.class

输出文件格式:SequenceFileOutputFormat.class

输出key StringTuple.class

输出value DoubleWritable.class

输入路径: 第二个map/reduce 生成的 trainer-tfIdf/ 下的 trainer-tfIdf trainer- VocabCount,以及 trainer-weights/ Sigma_k Sigma_kSigma_ j

输出:trainer-thetaNormalizer 文件

BayesWeightSummerMapper的输出为:

Log里的分子中 TFIdf是某类下某属性的TFIdf值,分母中 VocabCount是属性总数

 

key

value

_LTN,label

Log[(TFIdf+1.0)/(sigma_k+ VocabCount )]

 

BayesWeightSummerReducer 的输出为:

Map 的结果合并

 

key

value

_LTN,label

ΣLog[(TFIdf+1.0)/(sigma_k+ VocabCount )]

 

 

分享到:
评论

相关推荐

    【甘道夫】通过Mahout构建贝叶斯文本分类器案例详解 -- 配套源码

    http://blog.csdn.net/u010967382/article/details/25368795#comments 博客配套源码

    Apache.Mahout.Beyond.MapReduce.1523775785

    Chapter 1 Meet Mahout Chapter 2 Setting things up Part II — Coding with Mahout Chapter 3 In-core Algebra Chapter 4 Distributed Algebra Part III — Approximating Distributed Problems Chapter 5 ...

    Learning Apache Mahout Classification

    Next, you will learn about different classification algorithms and models such as the Naïve Bayes algorithm, the Hidden Markov Model, and so on. Finally, along with the examples that assist you in ...

    Mahout in Action

    1 ■ Meet Apache Mahout 1 PART 1 RECOMMENDATIONS ...................................................11 2 ■ Introducing recommenders 13 3 ■ Representing recommender data 26 4 ■ Making ...

    [Mahout] 使用Mahout 对Kddcup 1999的数据进行分析 -- Naive Bayes

    NULL 博文链接:https://rangerwolf.iteye.com/blog/2093940

    Mahout in Action完整版本(英文)

    一些支持 Map-Reduce 的集群实现包括 k-Means、模糊 k-Means、Canopy、Dirichlet 和 Mean-Shift。  Distributed Naive Bayes 和 Complementary Naive Bayes 分类实现。

    Learning Apache Mahout(PACKT,2015)

    You will learn about Mahout building blocks, addressing feature extraction, reduction and the curse of dimensionality, delving into classification use cases with the random forest and Naïve Bayes ...

    yelp-dataset-project:Yelp 学术数据集项目

    yelp-数据集-项目 Yelp 学术数据集项目 该项目分为以下目录:- 1.) DSParser:- a.) 包含解析数据集的库 b.) 与数据库交互 c.) 过滤数据并将数据从文本... 5.) SLURM_Scripts:- 包含运行 Mahout Naive Bayes 的 SLURM

    大数据分析及处理方法.docx

    比较典型算法有用于聚类的K-Means、用于统计学习的SVM和用于分类的Naive Bayes,主要使用的工具有Hadoop的Mahout等。 该过程的特点和挑战主要是用于挖掘的算法很冗杂,并且计算涉及的`数据量和计算量都很大,还有,...

    mahoutr:R的大数据

    MAHOUR,具体是将并行化算法移植到R语言中的一个数据分析平台,由海量数据研究中心负责开发,以下是具体安装步骤。 环境准备:系统要求 ubuntu,jdk最好为1.6 确保hadoop,mahout,R安装正确,并且可以顺利运行。 以下...

Global site tag (gtag.js) - Google Analytics