我使用R(RStudio版本0.98.1017)使用朴素贝叶斯算法训练二元分类器并进行5倍交叉验证。这是我正在使用的代码:
library(caret)
dataset <- read.table("dataFile.csv", header=TRUE, sep = ",")
attributes = dataset[,-3]
labels = as.factor(dataset$Class)
model = train(attributes, labels, method='nb', trControl=trainControl(method='repeatedcv', number=5))
confusionMatrixResults<-table(predict(model$finalModel,attributes)$class,labels)
confusionMatrix(confusionMatrixResults)
以下是dataFile.csv文件的示例数据(仅前10行):
firstName,lastName,Class
ayah,salat,0
abdulahi,youssif,1
yara,abshir,0
sawda,alanazi,1
abubaker,farah,1
yusaira,aden,1
mohammad,okash,0
farhia,alossehy,1
mais,alom,0
如果文件包含2001行(1个标题和2000个记录),代码可以正常工作,并生成以下混淆矩阵和结果:
labels
0 1
0 991 2
1 17 990
Accuracy : 0.9905
95% CI : (0.9852, 0.9943)
No Information Rate : 0.504
P-Value [Acc > NIR] : < 2.2e-16
Kappa : 0.981
Mcnemar's Test P-Value : 0.001319
Sensitivity : 0.9831
Specificity : 0.9980
Pos Pred Value : 0.9980
Neg Pred Value : 0.9831
Prevalence : 0.5040
Detection Rate : 0.4955
Detection Prevalence : 0.4965
Balanced Accuracy : 0.9906
'Positive' Class : 0
但是,如果我只添加一个额外的行,它将产生非常差的结果(尽管没有错误或警告):
labels
0 1
0 596 78
1 413 914
Accuracy : 0.7546
95% CI : (0.7352, 0.7733)
No Information Rate : 0.5042
P-Value [Acc > NIR] : < 2.2e-16
Kappa : 0.5106
Mcnemar's Test P-Value : < 2.2e-16
Sensitivity : 0.5907
Specificity : 0.9214
Pos Pred Value : 0.8843
Neg Pred Value : 0.6888
Prevalence : 0.5042
Detection Rate : 0.2979
Detection Prevalence : 0.3368
Balanced Accuracy : 0.7560
'Positive' Class : 0
我的问题是:一条额外的记录怎么可能导致这种不同的结果。 值得一提的是,我已经尝试了几个具有不同记录的随机测试,并且在所有这些测试中,问题独立于特定记录,并且当文件超过2001行时发生。
我的猜测是内存大小或Naive Bayes库必须有一些限制。
如果您想尝试,请输入以下文件(我重命名了这些属性以保密): https://www.dropbox.com/s/7z39wzxilblo2bm/dataFile.csv 删除最后一行将显着改善结果!