全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
5308 2
2014-12-13
        如题,R中哪个包具有朴素贝叶斯分类器的功能?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2015-1-15 21:50:59
语言中的e1071包中就有可以实施朴素贝叶斯分类的函数——naiveBayes()

klaR包里也有NaiveBayes()函数,这个函数较之前者增加了两个功能,一个是可以输入先验概率,另一个是在正态分布基础上增加了核平滑密度函数。为了避免过度拟合,在训练时还要将数据分割进行多重检验,所以我们还使用了caret包的一些函数进行配合。
   
# 加载扩展包和数据
library(caret)
data(PimaIndiansDiabetes2,package='mlbench')
# 对缺失值使用装袋方法进行插补
preproc <- preProcess(PimaIndiansDiabetes2[-9],method="bagImpute")
data <- predict(preproc,PimaIndiansDiabetes2[-9])
data$Class <- PimaIndiansDiabetes2[,9]
# 使用朴素贝叶斯建模,这里使用了三次10折交叉检验得到30个结果
fitControl <- trainControl(method = "repeatedcv", number = 10, repeats = 3,returnResamp = "all")
model1 <- train(Class~., data=data,method='nb',trControl = fitControl,tuneGrid = data.frame(.fL=1,.usekernel=F))
# 观察30次检验结果,发现准确率在0.75左右
resampleHist(model1)
# 返回训练数据的混淆矩阵
pre <- predict(model1)
confusionMatrix(pre,data$Class)

   


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-1-15 21:51:40
如果要写的话:
  
################################
# 朴素贝叶斯分类器
################################
   
library(plyr)
library(reshape2)

#1、根据训练集创建朴素贝叶斯分类器
#1.1、生成类别的概率

##计算训练集合D中类别出现的概率,即P{c_i}
##输入:trainData 训练集,类型为数据框
##      strClassName 指明训练集中名称为strClassName列为分类结果
##输出:数据框,P{c_i}的集合,类别名称|概率(列名为 prob)
class_prob <- function(trainData, strClassName){
#训练集样本数
  length.train <- nrow(trainData)
  dTemp <- ddply(trainData, strClassName, "nrow")
  dTemp <- ddply(dTemp, strClassName, mutate, prob = nrow/length.train)
  dTemp[,-2]
}

##1.2、生成每个类别下,特征取不同值的概率
##计算训练集合D中,生成每个类别下,特征取不同值的概率,即P{fi|c_i}
##输入:trainData 训练集,类型为数据框
##      strClassName 指明训练集中名称为strClassName列为分类结果,其余的全部列认为是特征值
##输出:数据框,P{fi|c_i}的集合,类别名称|特征名称|特征取值|概率(列名为 prob)
feature_class_prob <- function(trainData, strClassName){
  # 横表转换为纵表
  data.melt <- melt(trainData,id=c(strClassName))
  # 统计频数
  aa <- ddply(data.melt, c(strClassName,"variable","value"), "nrow")
  # 计算概率
  bb <- ddply(aa, c(strClassName,"variable"), mutate, sum = sum(nrow), prob = nrow/sum)
  # 增加列名
  colnames(bb) <- c("class.name",
                    "feature.name",
                    "feature.value",
                    "feature.nrow",
                    "feature.sum",
                    "prob")
  # 返回结果
  bb[,c(1,2,3,6)]
}

#feature_class_prob(iris,"Species")


## 以上创建完朴素贝叶斯分类器

## 2、使用生成的朴素贝叶斯分类器进行预测
##使用生成的朴素贝叶斯分类器进行预测P{fi|c_i}
##输入:oneObs 数据框,待预测的样本,格式为 特征名称|特征值
##      pc 数据框,训练集合D中类别出现的概率,即P{c_i}  类别名称|概率
##      pfc 数据框,每个类别下,特征取不同值的概率,即P{fi|c_i}
##                  类别名称|特征名称|特征值|概率
##输出:数据框,待预测样本的分类对每个类别的概率,类别名称|后验概率(列名为 prob)
pre_class <- function(oneObs, pc,pfc){
  colnames(oneObs) <- c("feature.name", "feature.value")
  colnames(pc) <- c("class.name","prob")
  colnames(pfc) <- c("class.name","feature.name","feature.value","prob")
  
  # 取出特征的取值的条件概率
  feature.all <- join(oneObs,pfc,by=c("feature.name","feature.value"),type="inner")
  # 取出特征取值的条件概率连乘
  feature.prob <- ddply(feature.all,.(class.name),summarize,prob_fea=prod(prob))  #prod为连乘函数
  
  #取出类别的概率
  class.all <- join(feature.prob,pc,by="class.name",type="inner")
  #输出结果
  ddply(class.all,.(class.name),mutate,pre_prob=prob_fea*prob)[,c(1,4)]
}


##3、数据测试
##用上面苹果的数据作为例子进行测试
#训练集
train.apple <-data.frame(
  size=c("大","小","大","大","小","小"),
  weight=c("轻","重","轻","轻","重","轻"),
  color=c("红","红","红","绿","红","绿"),
  taste=c("good","good","bad","bad","bad","good")
  )
#待预测样本
oneObs<-data.frame(
  feature.name =c("size", "weight", "color"),
  feature.value =c("大","重","红")
)

#预测分类
pc <- class_prob(train.apple,"taste")
pfc <- feature_class_prob(train.apple,"taste")
pre_class(oneObs, pc,pfc)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群