处理朴素贝叶斯分类器中的缺失属性

时间:2012-11-19 18:33:40

标签: java machine-learning data-mining bayesian classification

我正在编写Naive Bayes分类器,用于根据WiFi信号强度执行室内房间定位。到目前为止,它运行良好,但我有一些关于缺少功能的问题。这经常发生,因为我使用WiFi信号,并且WiFi接入点根本无处可用。

问题1 :假设我有两个类,Apple和Banana,我想将测试实例T1分类如下。

enter image description here

我完全理解Naive Bayes分类器的工作原理。以下是我在分类器上使用Wikipedia's article的公式。我使用统一的先验概率 P(C = c),所以我在实现中省略了它。

enter image description here

现在,当我计算方程的右边并循环所有类条件特征概率时,我会使用哪一组特征?测试实例T1使用功能1,3和4,但这两个类没有所有这些功能。因此,当我执行循环计算概率乘积时,我会看到有关我循环的几个选择:

  1. 遍历训练中所有特征的并集,即特征1,2,3,4。由于测试实例T1没有特征2,因此使用人为的微小概率。
  2. 仅循环测试实例的功能,即1,3和4。
  3. 循环播放每个课程的可用功能。要计算Apple'的类条件概率,我会使用功能1,2和3,而对于' Banana',我会使用2,3和4。
  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,这是显然错了。有什么更好的办法来解决这个问题?

2 个答案:

答案 0 :(得分:6)

对于朴素贝叶斯分类器,等式的右侧应迭代所有属性。如果您拥有稀疏填充的属性,通常使用 m-estimate 的概率来使用等效样本大小来计算概率。当训练数据缺少属性值时,这将防止类条件概率变为零。对上面的两个粗体术语进行网络搜索,您会发现m估计公式的大量描述。 Tom Mitchell撰写的Machine Learning是一个很好的参考文本。基本公式是

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,其在训练数据中没有属性,结果将是训练数据中最常出现的类别。这是有道理的,因为训练数据中没有相关信息可以让您做出更好的决定。

答案 1 :(得分:1)

我很想忽略培训中所有课程中没有的任何功能。如果您选择不这样做,那么您基本上会产生幻觉数据,然后将其平等地分配给分类步骤中真正存在的数据。所以我对问题1的简单回答就是简单地在功能3的基础上做出决定(你只是没有足够的信息去做其他事情)。这是@bogatron提到的m估计的一部分。

对于培训中缺少某些功能的课程,有一个更复杂的答案,但需要做更多的工作。 m估计实际上是对p_i(在你的情况下是mu_i,sigma_i)的后验分布的点估计,给出你的训练数据,其由先前的p_i(分数n_i / n)和似然函数p组成。 (数据| p_i)。如果您没有观察到数据点,则基本上可以恢复到之前的预测分布。

现在,您如何评估先前的情况?好吧,如果问题中的类数量较少,相对于缺少某些特征值的数字,可以从具有数据的类中推断出先验的参数,并考虑缺少类的预测分布数据就像是先前的(对于有数据的类,你的预测分布是后验的)。对你有用的指针是,因为你似乎假设你的数据是正态分布的(或者至少以它们的均值和标准偏差为特征),为了共轭,平均值的先验也应该是正常的。我可能想避免对标准差的先前分布进行推断,因为如果你是新手,这有点繁琐。

但是请注意,只有当您有足够的类对该特征进行观察时,这一点才有意义,即分数缺失值很小。特别是,在你的例子中,你只有一个带有观察的类,所以对于“香蕉”类中的特征一,你可能做的最好的事情就是假设关于mu_1的不确定性由以“Apple”为中心的分布来表示。 mu_1有一些任意的变化。或者你可以假设他们的穆斯林是平等的,在这种情况下它会对决定没有影响,你可能也会忽略它!

因此,遗憾的是,您的问题2的答案是您的代码正在做正确的事情。如果您的新测试实例仅具有从未在培训中观察到的功能,您怎么能希望为它选择一个类?你可以做的比根据先前的选择更好。