【问题标题】:Handling missing attributes in Naive Bayes classifier处理朴素贝叶斯分类器中的缺失属性
【发布时间】:2012-11-07 17:41:16
【问题描述】:

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

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

我完全理解朴素贝叶斯分类器的工作原理。下面是我在分类器上使用Wikipedia's article 的公式。我使用的是统一的先验概率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,这显然是错误的。有什么更好的方法来处理这个问题?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢。 m 估计方法适用于离散数据,对吗?类似于拉普拉斯平滑?我的问题是这些特征都是连续的,我使用高斯 PDF 来计算似然概率密度。连续特征是否有等效的 m 估计?
    • 啊,我没有意识到你正在使用 pdf 的副计算概率。是的,m 估计与离散数据一起使用。如果您将公式中的 n_i 替换为 n_i*pdf_i,您可能仍然可以使用 m 估计,其中 pdf_i 是您为给定属性值计算的高斯 pdf 值。然后,对于非零 m,它会阻止你的后验概率变为零,你仍然可以使用 m 的值来平衡你计算的概率和假设的先验。
    • 我不熟悉 m-estimates,但我正在考虑一种类似于拉普拉斯加 1 平滑的不同方法:只需给缺失特征一个小概率,以便产品不为零。对于我的示例中的测试实例 T1,特征 2 将被赋予很小的概率,例如 0.000001 或其他值。我已经实现了它,它似乎运行良好。但这是一种合理的方法吗?
    • 这基本上是 m 估计完成的,但它也保证默认的最小概率不会大于非零计数的实际概率。如果您的默认概率小于任何非零概率并且不会导致类条件概率四舍五入为零,那么这是一种合理的方法。
    • 请参阅我的答案以获取更多详细信息,但是将 m 估计推广到任意值变量是根据先验来理解它(m 估计是基于参数)。在这种特定情况下,仅使用少量可能有效,但理论上非常不稳定(多小应该取决于各种因素,例如样本量、先前的信念等)。
    【解决方案2】:

    我很想在训练时简单地忽略所有类中没有的任何功能。如果您选择不这样做,您实际上是在对数据产生幻觉,然后将其与分类步骤中真正存在的数据同等对待。所以我对问题 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 的答案是您的代码正在做正确的事情。如果你的新测试实例只有在训练中从未观察到的特征,你怎么希望为它选择一个类?你只能根据之前的选择来做。

    【讨论】:

    • 感谢您的解释。关于先验,我目前假设等概率先验。事实上,关于朴素贝叶斯分类的维基百科文章说:“一个类的先验可以通过假设等概率类或通过从训练集中计算类概率的估计来计算”。做这个等概率假设可以吗?如果不是,那么将先验计算为#Apple/#allClasses 似乎相当随意。如果训练数据恰好有 1000 个苹果和 10 根香蕉,因为杂货店碰巧有卖香蕉而它们都不见了怎么办?
    • 这是一个经常混淆的点——我不是在谈论类先验,而是每个特性参数的先验。如果您的特征是正态分布的,则它具有参数 mu_i(均值)和 sigma_i(标准开发)。我建议了一个关于 mu_i 的先验,它包含了这样一个想法,即您对 mu_i 的外观有预期在您查看示例之前。如果您没有可查看的示例,请退回到先前的示例。一本关于贝叶斯方法的好教科书将阐明:David Mackay 的书,可在线获取:inference.phy.cam.ac.uk/mackay/itila/book.html
    猜你喜欢
    • 2017-01-10
    • 2012-07-31
    • 2016-08-12
    • 2015-08-27
    • 2011-03-05
    • 2018-02-06
    • 2012-01-03
    • 2012-07-02
    相关资源
    最近更新 更多