使用R进行朴素贝叶斯分类 – 奇怪的结果

我遇到了以下问题:我想使用贝叶斯分类器,通过两个变量“性别”和“年龄组”来预测一个因子变量“癌症”(是或否)。这些是我(虚构的)样本数据:

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 testsettestset$predicted<-predict(model, testset)testset$cancer<-cancerCrossTable(testset$predicted, testset$cancer, prop.chisq=F, prop.r=F,    prop.c=F, prop.t = F)

结果显示,根据我的数据,男性和年轻人的癌症发生率更高。与真实的癌症分类相比,我的模型正确分类了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 | ------------------|-----------|-----------|-----------|

然而,当我只使用一个分类变量(性别)进行同样的操作时:

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

模型如下:

Naive Bayes Classifier for Discrete PredictorsCall:naiveBayes.default(x = testset2, y = cancer)A-priori probabilities:cancer   no   yes 0.645 0.355 Conditional probabilities:      xcancer         f         m   no  0.4573643 0.5426357   yes 0.5774648 0.4225352

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

# apply model on testsettestset2$predicted<-predict(model2, testset2)testset2$cancer<-cancerCrossTable(testset2$predicted, testset2$cancer, prop.chisq=F, prop.r=F, prop.c=F, prop.t = F)

现在,当我将模型应用于原始数据时,所有案例都被分类为同一类别:

Total Observations in Table:  200                    | testset2$cancer testset2$predicted |        no |       yes | Row Total | -------------------|-----------|-----------|-----------|                no |       129 |        71 |       200 | -------------------|-----------|-----------|-----------|      Column Total |       129 |        71 |       200 | -------------------|-----------|-----------|-----------|

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


回答:

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

Conditional probabilities:      xcancer         f         m   no  0.4573643 0.5426357   yes 0.5774648 0.4225352

得出“显然,与女性相比,男性更容易患癌症(54%对46%)”的结论是错误的。

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

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

通过查看以下输出来看这一点是显而易见的

table(cancer, testset2)      testset2cancer  f  m   no  59 70   yes 41 30

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

现在回答您的问题:谁能解释一下,为什么女性和男性都被分配到同一类别?

要决定男性将被分配到哪个类别,您需要比较
P(Cancer | Male)P(No Cancer | male)。哪个更大,我们就会声明它指示该类别。在使用朴素贝叶斯时,这些通过贝叶斯规则重新表述为比较

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.15P(Male | No Cancer) * P(No Cancer)  = 0.5426357 * 0.645 = 0.35

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

同样,对于女性我们计算

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

对于女性,我们也预测没有癌症。强调对女性的这一计算可能会有帮助。尽管P(Female | Cancer) > P(Female | No Cancer),但这些是由总体概率P(Cancer)P(No Cancer)加权的。
由于总体上没有癌症的可能性比有癌症的可能性更大,这会改变哪个更大。朴素贝叶斯对两种性别都预测没有癌症。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注