为啥 WEKA NaiveBayes 分类器会给出标准。开发。全零属性的值?

Posted

技术标签:

【中文标题】为啥 WEKA NaiveBayes 分类器会给出标准。开发。全零属性的值?【英文标题】:why do WEKA NaiveBayes classifier gives a std. dev. value for all-zero attribute?为什么 WEKA NaiveBayes 分类器会给出标准。开发。全零属性的值? 【发布时间】:2016-07-30 01:32:41 【问题描述】:
@relation weather
@attribute outlook 'overcast','rainy','sunny'
@attribute temperature numeric
@attribute humidity numeric
@attribute windy 'FALSE','TRUE'
@attribute play 'no','yes'
@attribute attr numeric
@data
'sunny',85,85,'FALSE','no',4
'sunny',80,90,'TRUE','no',9
'overcast',83,86,'FALSE','yes',0
'rainy',70,96,'FALSE','yes',0
'rainy',68,80,'FALSE','yes',0
'rainy',65,70,'TRUE','no',4
'overcast',64,65,'TRUE','yes',0
'sunny',72,95,'FALSE','no',3
'sunny',69,70,'FALSE','yes',0
'rainy',75,80,'FALSE','yes',0
'sunny',75,70,'TRUE','yes',0
'overcast',72,90,'TRUE','yes',0
'overcast',81,75,'FALSE','yes',0
'rainy',71,91,'TRUE','no',8

上面是WEKA的weather.arff数据,我只是手动添加了一个人工属性“attr”。 “play 'no', 'yes' 是类。请注意,“yes”类样本的所有“attr”值都是 0。

当我使用 WEKA NaiveByes 分类器构建模型(“使用训练集”)时,输出模型如下所示:

=== Classifier model (full training set) ===

Naive Bayes Classifier

                 Class
Attribute           no     yes
                (0.38)  (0.63)
===============================
outlook
  overcast          1.0     5.0
  rainy             3.0     4.0
  sunny             4.0     3.0
  [total]           8.0    12.0

temperature
  mean          74.8364 72.9697
  std. dev.       7.384  5.2304
  weight sum          5       9
  precision      1.9091  1.9091

humidity
  mean          86.1111 78.8395
  std. dev.      9.2424  9.8023
  weight sum          5       9
  precision      3.4444  3.4444

windy
  FALSE             3.0     7.0
  TRUE              4.0     4.0
  [total]           7.0    11.0

attr
  mean             5.85       0
  std. dev.         2.7   0.375
  weight sum          5       9
  precision        2.25    2.25

对于“yes”类中的“attr”属性,平均值为 0,但 sd 为 0.375。我想知道 WEKA 中的 NaiveBayes 是如何计算的。是否使用了某种修正方法?

此外,当我尝试在 R 中使用 caret 包执行此操作时:

library(caret)
library(foreign)
weather <- read.arff('weather.arff')
set.seed(1)
fit <- train(play ~., data = weather, method = 'nb', trControl = trainControl(method = 'none'), tuneGrid = data.frame(fL = 0, usekernel = F))

错误提示:

Error in NaiveBayes.default(x, y, usekernel = param$usekernel, fL = param$fL,  : 
  Zero variances for at least one class in variables: attr
Called from: NaiveBayes.default(x, y, usekernel = param$usekernel, fL = param$fL, 
    ...)

我如何告诉 R 忽略这种全零属性的情况并给我一个(修正的)模型?

【问题讨论】:

我也有同样的问题;需要别人的帮助! 【参考方案1】:

对于 attr 列,精度等于 2.75

在课堂上:weka.estimators.NormalEstimator,我们有:

89 // 一个区间内最多允许 3 个 sd 90 m_StandardDev = m_Precision / (2 * 3);

所以属性 attr 的最小标准差是 0.375

【讨论】:

感谢您抽出宝贵时间提供答案。正是因为像您这样乐于助人的同龄人,我们才能作为一个社区一起学习。以下是一些关于如何使您的答案出色的提示:How do I write a good answer。

以上是关于为啥 WEKA NaiveBayes 分类器会给出标准。开发。全零属性的值?的主要内容,如果未能解决你的问题,请参考以下文章

使用 NaiveBayes 分类器对 Weka 中的一个实例进行分类

Weka 中 SMO、NaiveBayes 和 BayesNet 分类器的不同结果

从命令行运行 weka - 找不到类 NaiveBayes

使用预训练模型对一个实例进行分类时,NaiveBayes 分类器出错

Weka 逻辑分类器不可用

朴素贝叶斯 (Weka) - 属性总数 x 实例总数 - 为啥不同?