我正在编写一个朴素贝叶斯分类器,用于通过WiFi信号强度进行室内房间定位。目前运行良好,但我对缺失特征有一些疑问。由于使用的是WiFi信号,且WiFi接入点并非随处可用,因此这种情况经常发生。
问题1:假设我有两个类别,苹果和香蕉,我想对下面的测试实例T1进行分类。
我完全理解朴素贝叶斯分类器的工作原理。以下是我从维基百科关于分类器的文章中使用的公式。我使用的是均匀的先验概率P(C=c),所以在我的实现中省略了它。
现在,当我计算方程的右侧并遍历所有类条件特征概率时,我应该使用哪组特征?测试实例T1使用特征1、3和4,但这两个类别并不具备所有这些特征。因此,当我执行循环来计算概率乘积时,我看到了几种选择:
- 遍历训练中所有特征的并集,即特征1、2、3、4。由于测试实例T1没有特征2,则使用一个人为的微小概率。
- 仅遍历测试实例的特征,即1、3和4。
- 遍历每个类别可用的特征。为了计算’苹果’的类条件概率,我将使用特征1、2和3,而对于’香蕉’,我将使用2、3和4。
我应该使用上述哪一种方法?
问题2:假设我想对测试实例T2进行分类,其中T2具有在两个类别中都找不到的特征。我使用对数概率来帮助消除下溢,但我不确定循环的细节。我正在做类似这样的事情(使用类似Java的伪代码):
Double bestLogProbability = -100000;ClassLabel bestClassLabel = null;for (ClassLabel classLabel : allClassLabels){ Double logProbabilitySum = 0.0; for (Feature feature : allFeatures) { Double logProbability = getLogProbability(classLabel, feature); if (logProbability != null) { logProbabilitySum += logProbability; } } if (bestLogProbability < logProbability) { bestLogProbability = logProbabilitySum; bestClassLabel = classLabel; }}
问题是,如果没有一个类别具有测试实例的特征(例如中的特征5),那么logProbabilitySum将保持0.0,导致bestLogProbability为0.0,或线性概率为1.0,这显然是错误的。有什么更好的处理方法吗?
回答:
对于朴素贝叶斯分类器,你的方程右侧应该遍历所有属性。如果你有稀疏填充的属性,通常的处理方法是使用m估计概率,该方法使用等效样本大小来计算你的概率。这将防止在训练数据中缺少属性值时类条件概率变为零。搜索上述两个加粗术语,你会找到许多关于m估计公式的描述。一个很好的参考文本是Tom Mitchell的《机器学习》。基本公式是
P_i = (n_i + m*p_i) / (n + m)
n_i是属性值为f_i的训练实例数量,n是训练实例的数量(当前分类),m是等效样本大小,p_i是f_i的先验概率。如果你将m设为0,这就恢复到标准概率值(对于缺失的属性值可能是零)。当m变得非常大时,P_i接近p_i(即概率由先验概率主导)。如果你没有先验概率可使用,只需将其设为1/k,其中k是属性值的数量。
如果你使用这种方法,那么对于你的实例T2,其在训练数据中没有属性,结果将是训练数据中最常出现的类别。这是有道理的,因为训练数据中没有相关信息可以做出更好的决策。