8

我正在编写一个朴素贝叶斯分类器,用于根据 WiFi 信号强度执行室内房间定位。到目前为止,它运行良好,但我对缺少的功能有一些疑问。这种情况经常发生,因为我使用 WiFi 信号,而 WiFi 接入点根本不是随处可用。

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

在此处输入图像描述

我完全理解朴素贝叶斯分类器的工作原理。下面是我在维基百科关于分类器的文章中使用的公式。我正在使用统一的先验概率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;
    }
}

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

4

2 回答 2

6

对于朴素贝叶斯分类器,等式的右侧应该遍历所有属性。如果您拥有稀疏填充的属性,通常的处理方法是使用概率的m 估计,该概率使用等效样本量来计算您的概率。当您的训练数据缺少属性值时,这将防止类条件概率变为零。对上面的两个粗体字词进行网络搜索,您会发现大量关于 m-estimate 公式的描述。描述这一点的一个很好的参考文本是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,结果将是训练数据中最常出现的类别。这是有道理的,因为训练数据中没有相关信息可以用来做出更好的决定。

于 2012-11-19T20:37:23.477 回答
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 具有一些任意方差。或者你可以假设他们的 mus 是平等的,在这种情况下,它不会对决定产生影响,你也可以忽略它!

因此,不幸的是,您的问题 2 的答案是您的代码正在做正确的事情。如果你的新测试实例只有在训练中从未观察到的特征,你怎么希望为它选择一个类?你只能根据先验选择。

于 2012-11-20T12:19:12.703 回答