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

sta*_*010 7 java classification machine-learning data-mining bayesian

我正在写一个朴素贝叶斯分类器,用于从WiFi信号强度进行室内房间定位.到目前为止,它运行良好,但我有一些关于缺少功能的问题.这经常发生,因为我使用WiFi信号,并且WiFi接入点根本无处不在.

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

在此输入图像描述

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

在此输入图像描述

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

  1. 循环遍历训练中所有特征的并集,即特征1,2,3,4.由于测试实例T1没有特征2,因此使用人为的微小概率.
  2. 仅循环测试实例的功能,即1,3和4.
  3. 循环遍历每个类的可用功能.要计算'Apple'的类条件概率,我会使用功能1,2和3,而对于'Banana',我会使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,如果没有类具有测试实例的功能(示例中的功能5),则logProbabilitySum将保持为0.0,导致bestLogProbability为0.0,或线性概率为1.0,这显然是错误的.有什么更好的方法来处理这个问题?

bog*_*ron 6

对于朴素贝叶斯分类器,等式的右侧应迭代所有属性.如果您具有稀疏填充的属性,则通常使用概率的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,其在训练数据中没有属性,结果将是训练数据中最常出现的类别.这是有道理的,因为训练数据中没有相关信息可以帮助您做出更好的决策.