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

我正在编写一个朴素贝叶斯分类器,用于通过WiFi信号强度进行室内房间定位。目前运行良好,但我对缺失特征有一些疑问。由于使用的是WiFi信号,且WiFi接入点并非随处可用,因此这种情况经常发生。

问题1:假设我有两个类别,苹果和香蕉,我想对下面的测试实例T1进行分类。

enter image description here

我完全理解朴素贝叶斯分类器的工作原理。以下是我从维基百科关于分类器的文章中使用的公式。我使用的是均匀的先验概率P(C=c),所以在我的实现中省略了它。

enter image description here

现在,当我计算方程的右侧并遍历所有类条件特征概率时,我应该使用哪组特征?测试实例T1使用特征1、3和4,但这两个类别并不具备所有这些特征。因此,当我执行循环来计算概率乘积时,我看到了几种选择:

  1. 遍历训练中所有特征的并集,即特征1、2、3、4。由于测试实例T1没有特征2,则使用一个人为的微小概率。
  2. 仅遍历测试实例的特征,即1、3和4。
  3. 遍历每个类别可用的特征。为了计算’苹果’的类条件概率,我将使用特征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,其在训练数据中没有属性,结果将是训练数据中最常出现的类别。这是有道理的,因为训练数据中没有相关信息可以做出更好的决策。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注