R 的朴素贝叶斯分类 - 奇怪的结果

Naive Bayes Classification with R - strange result

我有以下问题:我想使用两个变量 "sex" 和 "agegroup" 与贝叶斯 class 。 这些是我的(虚构的)示例数据:

install.packages("e1071")
install.packages("gmodels")
library(e1071)
library(gmodels)

data<-read.csv("http://www.reduts.net/cancer.csv", sep=";", stringsAsFactors = T)

## Sex and Agegroup ##
######################

# classification 
testset<-data[,c("sex", "agegroup")]
cancer<-data[,"cancer"]
model<-naiveBayes(testset, cancer)
model

# apply model on testset
testset$predicted<-predict(model, testset)
testset$cancer<-cancer

CrossTable(testset$predicted, testset$cancer, prop.chisq=F, prop.r=F,    prop.c=F, prop.t = F)

结果告诉我,根据我的数据,男性和年轻人更容易患癌症。与真正的癌症-class化相比,我的模型 class 正确化了 200 个案例中的 147 个(=88+59)(73.5%)。

                  | testset$original 
testset$predicted |        no |       yes | Row Total | 
------------------|-----------|-----------|-----------|
               no |        88 |        12 |       100 | 
------------------|-----------|-----------|-----------|
              yes |        54 |        46 |       100 | 
------------------|-----------|-----------|-----------|
     Column Total |       142 |        58 |       200 | 
------------------|-----------|-----------|-----------|

但是,然后我只使用一个 classification-variable(性别)做同样的事情:

## Sex only         ##
######################

# classification 
testset2<-data[,c("sex")]
cancer<-data[,"cancer"]
model2<-naiveBayes(testset2, cancer)
model2

型号如下:

Naive Bayes Classifier for Discrete Predictors

Call:
naiveBayes.default(x = testset2, y = cancer)

A-priori probabilities:
cancer
   no   yes 
0.645 0.355 

Conditional probabilities:
      x
cancer         f         m
   no  0.4573643 0.5426357
   yes 0.5774648 0.4225352

显然,男性比女性更容易患癌症 (54% vs 46%)。

# apply model on testset
testset2$predicted<-predict(model2, testset2)
testset2$cancer<-cancer

CrossTable(testset2$predicted, testset2$cancer, prop.chisq=F, prop.r=F, prop.c=F, prop.t = F)

现在,当我将我的模型应用到原始数据时,所有情况都class化为相同class:

Total Observations in Table:  200 

                   | testset2$cancer 
testset2$predicted |        no |       yes | Row Total | 
-------------------|-----------|-----------|-----------|
                no |       129 |        71 |       200 | 
-------------------|-----------|-----------|-----------|
      Column Total |       129 |        71 |       200 | 
-------------------|-----------|-----------|-----------|

谁能解释一下,为什么女性和男性都被分配到同一个class

您误解了这些输出。 当您打印出 model2 并看到

Conditional probabilities:
      x
cancer         f         m
   no  0.4573643 0.5426357
   yes 0.5774648 0.4225352

得出“显然,男性更有可能 与女性相比患癌症(54% 对 46%)。"

这个table告诉我们的是四个数字

P(female | no cancer)     P(male | no cancer) 
P(female | cancer)        P(male | cancer)

通过查看

的输出很容易看出这一点
table(cancer, testset2)
      testset2
cancer  f  m
   no  59 70
   yes 41 30

模型的第一行条件概率可以计算如下: 129 人未患癌症。 59/129 = 0.4573643 是女性。 70/129 = 0.5426357 是男性。所以阅读第一行的方法是 “鉴于患者没有癌症,他们更 可能是男性(54% 对 46%)。

现在回答你的问题:任何人都可以解释一下,为什么 女性和男性被分配到相同的 class?

要决定分配给哪些 class 男性,您需要比较
P(Cancer | Male)P(No Cancer | male)。哪个大, 我们将声明以指示class。使用朴素贝叶斯时,这些 通过应用贝叶斯规则将其重新表述为比较

来估计
P(Cancer | Male) = P(Male | Cancer) * P(Cancer) / P(Male)  
with  
P(No Cancer | Male) = P(Male | No Cancer) * P(No Cancer) / P(Male)

两种情况下的分母相同,所以如果我们只关心 哪个更大,我们可以比较

的大小

P(Male | Cancer) * P(Cancer)P(Male | No Cancer) * P(No Cancer)

这些是完全打印模型时报告的数字。

所以,对于男性来说

P(Male | Cancer) * P(Cancer)        = 0.4225352 * 0.355 = 0.15
P(Male | No Cancer) * P(No Cancer)  = 0.5426357 * 0.645 = 0.35

(注意:这些不是真实的概率,因为我们忽略了分母 P(Male) ) 由于没有癌症的数字更高,我们预测男性没有癌症。

同样,对于女性,我们计算

P(Female | Cancer) * P(Cancer)      = 0.5774648 * 0.355 = 0.205
P(Female | No Cancer) * P(No Cancer)    = 0.4573643 * 0.645 = 0.295

我们也预测女性不会患癌症。强调这一点可能会有用 女性的计算。尽管P(Female | Cancer) > P(Female | No Cancer), 这些由总体概率 P(Cancer)P(No Cancer).
加权 由于总体上没有癌症而不是癌症的可能性更大,因此 开关哪个更大。朴素贝叶斯预测男女都不会患癌症。