朴素贝叶斯分类算法

一、贝叶斯定理

        已知条件概率P(A|B)的情况下如何求得P(B|A),这就要用到贝叶斯定理了:

   

二、朴素贝叶斯算法的原理

朴素贝叶斯分类是一种十分简单的分类算法,叫它朴素贝叶斯分类是因为这种方法的思想的很朴素,朴素贝叶斯

的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此

待分类项属于哪个类别。通俗来说,就好比这么个道理,你在街上看到一个黑人,我问你你猜这哥们哪里来的,你

十有八九猜非洲。为什么呢?因为黑人中非洲人的比率最高,当然人家也可能是美洲人或亚洲人,但在没有其它可

用信息下,我们会选择条件概率最大的类别,这就是朴素贝叶斯的思想基础。

朴素贝叶斯分类的正式定义如下:

      1、设为一个待分类项,而每个ai为x的一个特征。

      2、有类别集合

      3、计算

      4、如果,则

  那么现在的关键就是如何计算第3步中的各个条件概率。我们可以这么做:

      1、找到一个已知分类的待分类项集合,这个集合叫做训练样本集。

      2、统计得到在各类别下各个特征属性的条件概率估计。即

      3、如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导:

      

      因为分母对于所有类别为常数,所以我们只要将分子最大化皆可。分子等于:


又因为各特征是条件独立的,所以有:

      

当上式最大时,对应的yi即为待分类样本的类别。

三、朴素贝叶斯算法的流程

根据上述分析,朴素贝叶斯分类的流程可以由下图表示(暂时不考虑验证):

四、在朴素贝叶斯算法中使用数值特征

在朴素贝叶斯算法中,样本的每个特征必须是“可分类的变量(factor,每个特征值表示该特征的一个类别level)”。

如果特征是数值型,那么它没有类别,之前的算法将无法使用。

一个简单有效的方法是将数值型特征值离散化,即:将数值分到不同的分段内。分段需要探索分割点,这就需要

你对数据有清晰的了解,从而确定最合适的分割点。如果没有明显的分割点,一种常用的方法就是利用分位数将数值

型特征离散化,例如:你可以用3分位数将特征值划分到3个分段中,可以用4分位数将特征值划分到4个分段中,......。

将特征值离散化会导致信息量减少,特征的原始数据的粒度变粗。在处理这个问题时,必须要取得权衡,太少的分

段会导致数据失真,太多的分段又会导致计算量增大,权衡,并取得一个最合适的分段数。

五、朴素贝叶斯应用实例 - 银行贷款通过预测

R代码如下:

# credit approval using Naive Bayes algorithm.
# author : oucpowerman  qiangz2012@yeah.net

# 载入源数据
credit_approval_raw <- read.csv("G:\\DataMining\\dataSets\\credit\\crx.csv",
stringsAsFactors = FALSE)

#删除包含缺失值的样本。
credit_approval_raw <- na.omit(credit_approval_raw) 

# 字符串转数值型。
A2_list <- lapply(credit_approval_raw$A2,as.numeric)
credit_approval_raw$A2 <- as.vector(unlist(A2_list))
A14_list <- lapply(credit_approval_raw$A14,as.numeric)
credit_approval_raw$A14 <- as.vector(unlist(A14_list))

# 连续的数值型特征值离散化(分段离散化)。
#hist(credit_approval_raw$A2,breaks = length(credit_approval_raw$A2),ccol = 
"red", xlab = "A2", main = "histogram A2")
A2_breaks <- 7
A2_points <- c(0,20,30,40,50,60,70,80)
A2_labels <- c("A2_level1","A2_level2","A2_level3","A2_level4","A2_level5",
"A2_level6","A2_level7")
#hist(credit_approval_raw$A3,breaks = length(credit_approval_raw$A3),ccol = 
"red", xlab = "A3", main = "histogram A3")
A3_breaks <- 6
A3_points <- c(0,5,10,15,20,25)
A3_labels <- c("A3_level1","A3_level2","A3_level3","A3_level4","A3_level5",
"A3_level6")
#hist(credit_approval_raw$A8,breaks = length(credit_approval_raw$A8),ccol = 
"red", xlab = "A8", main = "histogram A8")
A8_breaks <- 5
A8_points <- c(0,5,10,15,20,25)
A8_labels <- c("A8_level1","A8_level2","A8_level3","A8_level4","A8_level5")
#hist(credit_approval_raw$A11,breaks = length(credit_approval_raw$A11),ccol = 
"red", xlab = "A11", main = "histogram A11")
A11_breaks <- 5
A11_points <- c(0,5,10,15,20)
A11_labels <- c("A11_level1","A11_level2","A11_level3","A11_level4","A11_level5")
#hist(credit_approval_raw$A14,breaks = length(credit_approval_raw$A14),ccol = 
"red", xlab = "A14", main = "histogram A14")
A14_breaks <- 7
A14_points <- c(0,100,200,300,400,500,1000)
A14_labels <- c("A14_level1","A14_level2","A14_level3","A14_level4","A14_level5",
"A14_level6","A14_level7")
#hist(credit_approval_raw$A15,breaks = length(credit_approval_raw$A15),ccol = 
"red", xlab = "A15", main = "histogram A15")
A15_breaks <- 7
A15_points <- c(0,100,600,1000,2000,4000,6000)
A15_labels <- c("A15_level1","A15_level2","A15_level3","A15_level4","A15_level5",
"A15_level6","A15_level7")

Continuous2Levels <- function(x,points,labels,extendMore){
  result <- -1
  points_len <- length(points)
  labels_len <- length(labels)

  temp <- x
  i <- 1
  while(i <= (points_len-1)) { x[temp >= points[i] & temp < points[i+1]] <- labels[i]; i <- i+1 }
  if(extendMore == 1){
    x[temp >= points[points_len]] <- labels[labels_len]
  }
  result <- x
  
  return (result)
}

credit_approval_raw$A2 <- Continuous2Levels(credit_approval_raw$A2, A2_points,A2_labels,0)
credit_approval_raw$A3 <- Continuous2Levels(credit_approval_raw$A3, A3_points,A3_labels,1)
credit_approval_raw$A8 <- Continuous2Levels(credit_approval_raw$A8, A8_points,A8_labels,0)
credit_approval_raw$A11 <- Continuous2Levels(credit_approval_raw$A11, A11_points,A11_labels,1)
credit_approval_raw$A14 <- Continuous2Levels(credit_approval_raw$A14, A14_points,A14_labels,1)
credit_approval_raw$A15 <- Continuous2Levels(credit_approval_raw$A15, A15_points,A15_labels,1)

# 样本类别因子化。
credit_approval_raw$A16 <- factor(credit_approval_raw$A16, levels = c("+","-"), labels = 
c("Approval","Not Approval"))

# 训练集、测试集。
credit_approval_raw <- na.omit(credit_approval_raw) 
library(dplyr)
credit_approval_raw <- filter(credit_approval_raw,A1 != "?" & A2 != "?" & A3 != "?" & A4 != "?" & A5 != "?" & 
                                A6 != "?" & A7 != "?" & A8 != "?" & A9 != "?" & A10 != "?" & A11 != "?" & 
                                A12 != "?" & A13 != "?" & A14 != "?" & A15 != "?" & A16 != "?")
credit_train <- credit_approval_raw[1:519,]
credit_test <- credit_approval_raw[520:649,]

# 用朴素贝叶斯算法进行分类预测。
# Package : e1071 (或 klaR)
library(e1071)
nb_model <- naiveBayes(x = credit_train,y = credit_train$A16, laplace = 0) # 创建分类器。
credit_test_predict_labels <- predict(nb_model, credit_test, type = "class") # 测试集分类预测。
credit_test_original_labels <- credit_test$A16

# 模型性能评估。
library(gmodels)
CrossTable(x = credit_test_original_labels, y = credit_test_predict_labels, prop.chisq = FALSE)

试验结果(交叉表):


连续数值型特征的离散化,这里采用的是最简单的分段离散化,其实不是很准确,实际应用中需要用基于熵的方法等

定最合适的分段点


参考:

算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值