朴素贝叶斯训练集优化

Posted

技术标签:

【中文标题】朴素贝叶斯训练集优化【英文标题】:Naive Bayes training set optimization 【发布时间】:2014-02-21 23:52:02 【问题描述】:

我正在研究一个朴素的贝叶斯分类器,它需要一堆用户个人资料数据,例如:

Name
City
State
School
Email Address
URLS  ... 

最后一点是一堆 url,它们是通过 google 按名称搜索用户收集的用户搜索结果。目的是确定搜索结果是准确的(即,它是关于人的)还是不准确的。为此,在 url 数组中的每个链接中搜索每个配置文件数据,如果该配置文件数据(例如城市)在页面上匹配,则为每个属性分配一个二进制值。然后将结果表示为二进制向量(即 1 0 0 0 1 表示名称和电子邮件地址在 url 上匹配)。

我的问题围绕着创建最佳训练集。如果一个人的个人资料包含不完整的信息(例如缺少电子邮件地址),那应该是在我的训练集中使用的好个人资料吗?我应该只对包含完整培训信息的个人资料进行培训吗?制作不同的训练集(每个完整的配置文件属性组合一个)是否有意义,然后当我获得用户的 url 进行测试时,我根据记录的用户配置文件的数量来确定要使用的训练集测试人?我该怎么办?

【问题讨论】:

【参考方案1】:

    一般来说,没有“应该”。无论您以何种方式创建模型,唯一重要的是其性能,无论您如何创建它。

    但是,您极不可能使用精心挑选的训练集创建合适的模型。简单的想法是,您应该在看起来与实时数据完全相同的数据上训练模型。实时数据是否会有缺失值、不完整的配置文件等?因此,您需要您的模型知道在这种情况下该做什么,因此,此类配置文件应该在训练集中。

    是的,当然,您可以制作一个由多个子模型组成的模型,但是您可能会遇到训练数据不足和过拟合的问题。你必须创建多个好的模型才能让它工作,这更难。我想最好把这个推理留给模型本身,而不是试图把它推向正确的方向,这就是机器学习的目的——省去你的麻烦……但真的没有办法说在您的数据集上尝试之前。同样,在您的特定情况下有效的方法都是正确的。

【讨论】:

问题是在一天结束时,训练集看起来像 0 0 0 0 1 有两个原因。可能实际上每个 0 属性的文件中都有信息,但在搜索页面上找不到它们。或者可能是数据丢失,因此默认为 0 值。既然无法区分这两种情况,我们可以得出什么结论? @JohnBaum 无论您如何构建模型,对于无法区分的条目,该模型都会产生相同的结果。这是预期的行为。如果您想改进它,请向训练集添加更多参数。 如果我只处理具有完整数据的配置文件,这是否消除了训练集中无法区分条目的可能性?如果训练集有一个 0 就只能说明在搜索的页面上没有找到数据? @JohnBaum 问题是你为什么要从你的训练集中删除那些?这些资料是真实的。当在现场情况下遇到这种情况时,该模型将不得不使用。如果是这样,它应该与在场的人一起训练。 由于朴素贝叶斯的独立假设,您错过了一个技巧。更多详情见我的回答【参考方案2】:

因为您使用朴素贝叶斯作为您的模型(也正因为如此),您可以从独立性假设中受益,以使用您可用的每条数据,并且只考虑新样本中存在的数据。

您有特征 f1...fn,其中一些可能出现在任何给定条目中,也可能不出现。后验概率 p(related | f_1 ... f_n) 分解为:

p( 相关 | f_1 ... f_n ) \propto p( 相关) * p( f_1 | 相关) * p( f_2 | 相关) ... p(f_n | 相关)

p(无关 | f_1...f_n) 是相似的。如果某些特定的 f_i 不存在,只需从两个后验中删除这些术语——假设它们是在相同的特征空间上定义的,概率是可比较的,并且可以以标准方式进行归一化。然后,您只需要估计项 p( f_i | related ):这只是相关链接中第 i_th 特征为 1 的部分(可能已平滑)。要估计这个参数,只需使用定义第 i 个特征的相关链接集。

这只有在你自己实现的情况下才会起作用,因为我认为你不能使用标准包来做到这一点,但考虑到实现的容易程度,我不会担心。

编辑:一个例子

假设您有以下特征和数据(它们是二元的,因为您说这就是您所拥有的,但我希望扩展到分类或连续并不难):

D = [ email: 1, city: 1, name: 1, RELEVANT: 1,
      city: 1, name: 1, RELEVANT: 0,
      city: 0, email: 0, RELEVANT: 0
      name: 1, city: 0, email: 1, RELEVANT: 1 ]

其中列表的每个元素都是一个实例,分类的目标变量是特殊的 RELEVANT 字段(请注意,其中一些实例缺少一些变量)。

然后您想要对以下实例进行分类,但缺少 RELEVANT 字段,因为这是您希望预测的:

t = email: 0, name: 1

后验概率

p(RELEVANT=1 | t) = [p(RELEVANT=1) * p(email=0|RELEVANT=1) * p(name=1|RELEVANT)] / 证据(t)

同时

p(RELEVANT=0 | t) = [p(RELEVANT=0) * p(email=0|RELEVANT=0) * p(name=1|RELEVANT=0)] / 证据(t)

其中 evidence(t) 只是将上述两个分子相加得到的归一化器。

要获取 p(email=0|RELEVANT=1) 形式的每个参数,请查看 RELEVANT=1 且 email=0 的训练实例的比例:

p(email=0|RELEVANT=1) = count(email=0,RELEVANT=1) / [count(email=0,RELEVANT=1) + count(email=1,RELEVANT=1)]。

请注意,该术语只是忽略未定义电子邮件的实例。

在这种情况下,相关性的后验概率变为零,因为计数 (email=0,RELEVANT=1) 为零。所以我建议使用平滑估计器,在每个计数中添加一个,这样:

p(email=0|RELEVANT=1) = [count(email=0,RELEVANT=1)+1] / [count(email=0,RELEVANT=1) + count(email=1,RELEVANT=1 ) + 2]。

【讨论】:

我实际上只是使用此处的方程式 (en.wikipedia.org/wiki/Naive_Bayes_classifier#Examples) 来进行概率计算,那么我该如何将您的解决方案纳入其中? 我在答案中添加了一个示例:希望这会让事情更清楚

以上是关于朴素贝叶斯训练集优化的主要内容,如果未能解决你的问题,请参考以下文章

朴素贝叶斯法

4.朴素贝叶斯法

朴素贝叶斯

朴素贝叶斯法

Naive Bayes朴素贝叶斯法

朴素贝叶斯