朴素贝叶斯的应用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了朴素贝叶斯的应用相关的知识,希望对你有一定的参考价值。

参考技术A

和决策树模型相比,朴素贝叶斯分类器(Naive Bayes Classifier,或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。同时,NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。理论上,NBC模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为NBC模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这给NBC模型的正确分类带来了一定影响。
解决这个问题的方法一般是建立一个属性模型,对于不相互独立的属性,把他们单独处理。例如中文文本分类识别的时候,我们可以建立一个字典来处理一些词组。如果发现特定的问题中存在特殊的模式属性,那么就单独处理。
这样做也符合贝叶斯概率原理,因为我们把一个词组看作一个单独的模式,例如英文文本处理一些长度不等的单词,也都作为单独独立的模式进行处理,这是自然语言与其他分类识别问题的不同点。
实际计算先验概率时候,因为这些模式都是作为概率被程序计算,而不是自然语言被人来理解,所以结果是一样的。
在属性个数比较多或者属性之间相关性较大时,NBC模型的分类效率比不上决策树模型。但这点有待验证,因为具体的问题不同,算法得出的结果不同,同一个算法对于同一个问题,只要模式发生变化,也存在不同的识别性能。这点在很多国外论文中已经得到公认,在机器学习一书中也提到过算法对于属性的识别情况决定于很多因素,例如训练样本和测试样本的比例影响算法的性能。
决策树对于文本分类识别,要看具体情况。在属性相关性较小时,NBC模型的性能稍微良好。属性相关性较小的时候,其他的算法性能也很好,这是由于信息熵理论决定的。

朴素贝叶斯的问题

【中文标题】朴素贝叶斯的问题【英文标题】:Problems with Naive Bayes 【发布时间】:2016-08-25 20:34:42 【问题描述】:

我正在尝试在 R 中运行朴素贝叶斯,以根据文本数据进行预测(通过构建文档术语矩阵)。

我阅读了几篇关于训练和测试集中可能缺少术语的帖子,因此我决定只使用一个数据框,然后将其拆分。我使用的代码是这样的:

data <- read.csv(file="path",header=TRUE)

########## NAIVE BAYES
library(e1071)
library(SparseM)
library(tm)

# CREATE DATA FRAME AND TRAINING AND
# TEST INCLUDING 'Text' AND 'InfoType' (columns 8 and 27)
traindata <- as.data.frame(data[13000:13999,c(8,27)])
testdata <- as.data.frame(data[14000:14999,c(8,27)])
complete <- as.data.frame(data[13000:14999,c(8,27)])

# SEPARATE TEXT VECTOR TO CREATE Source(),
# Corpus() CONSTRUCTOR FOR DOCUMENT TERM
# MATRIX TAKES Source()
completevector <- as.vector(complete$Text)

# CREATE SOURCE FOR VECTORS
completesource <- VectorSource(completevector)

# CREATE CORPUS FOR DATA
completecorpus <- Corpus(completesource)

# STEM WORDS, REMOVE STOPWORDS, TRIM WHITESPACE
completecorpus <- tm_map(completecorpus,tolower)
        completecorpus <- tm_map(completecorpus,PlainTextDocument)
        completecorpus <- tm_map(completecorpus, stemDocument)
completecorpus <- tm_map(completecorpus, removeWords,stopwords("english"))
        completecorpus <- tm_map(completecorpus,removePunctuation)
        completecorpus <- tm_map(completecorpus,removeNumbers)
        completecorpus <- tm_map(completecorpus,stripWhitespace)

# CREATE DOCUMENT TERM MATRIX
completematrix<-DocumentTermMatrix(completecorpus)
trainmatrix <- completematrix[1:1000,]
testmatrix <- completematrix[1001:2000,]

# TRAIN NAIVE BAYES MODEL USING trainmatrix DATA AND traindata$InfoType CLASS VECTOR
model <- naiveBayes(as.matrix(trainmatrix),as.factor(traindata$InfoType),laplace=1)

# PREDICTION
results <- predict(model,as.matrix(testmatrix))
conf.matrix<-table(results, testdata$InfoType,dnn=list('predicted','actual'))

conf.matrix

问题是我得到了这样奇怪的结果:

               actual
predicted    1   2   3
         1  60 833 107
         2   0   0   0
         3   0   0   0

知道为什么会这样吗?

原始数据如下所示:

head(complete)

      Text
13000 Milkshakes, milkshakes, whats not to love? Really like the durability and weight of the cup. Something about it sure makes good milkshakes.Works beautifully with the Cuisinart smart stick.
13001 excellent. shipped on time, is excellent for protein shakes with a cuisine art mixer.  easy to clean and the mixer fits in perfectly
13002 Great cup. Simple and stainless steel great size cup for use with my cuisinart mixer.  I can do milkshakes really easy and fast. Recommended. No problems with the shipping.
13003 Wife Loves This. Stainless steel....attractive and the best part is---it won't break. We are considering purchasing another one because they are really nice.
13004 Great! Stainless steel cup is great for smoothies, milkshakes and even chopping small amounts of vegetables for salads!Wish it had a top but still love it!
13005 Great with my. Stick mixer...the plastic mixing container cracked and became unusable as a result....the only downside is you can't see if the stuff you are mixing is mixed well 

      InfoType
13000        2
13001        2
13002        2
13003        3
13004        2
13005        2

【问题讨论】:

没有数据很难调试。您正在按特定行拆分火车和测试。这些行很可能不包含所有类。您最好随机抽样行进行测试/训练拆分。 不,那没用。我尝试随机拆分行,得到完全相同的结果。 只是为了确保 - 您的混淆矩阵(预测与实际)表明所有实际项目都属于 1 类,而不是它预测所有项目的第 1 类? 嗨帕特里克。不,我的混淆矩阵报告说它预测所有这些都是第 1 类 【参考方案1】:

问题似乎在于 TDM 需要摆脱如此多的稀疏性。所以我补充说:

completematrix<-removeSparseTerms(completematrix, 0.95)

它开始工作了!!

             actual
predicted   1   2   3
        1  60 511   6
        2   0  86   2
        3   0 236  99

感谢大家的想法(感谢 Chelsey Hill!)

【讨论】:

以上是关于朴素贝叶斯的应用的主要内容,如果未能解决你的问题,请参考以下文章

基于朴素贝叶斯的wine数据集分类预测-机器学习实验-朴素贝叶斯

机器学习基础:朴素贝叶斯小结

朴素贝叶斯的优缺点

#私藏项目实操分享# Java实现基于朴素贝叶斯的情感词分析

基于朴素贝叶斯的乳腺癌数据集分类

基于朴素贝叶斯的wine数据集分类预测-机器学习实验四-朴素贝叶斯