朴素贝叶斯训练集优化

时间:2014-01-29 22:01:08

标签: machine-learning bayesian

我正在开发一个朴素的贝叶斯分类器,它采用了大量用户配置文件数据,例如:

Name
City
State
School
Email Address
URLS { ... }

最后一位是一堆网址,是用户按名称搜索用户搜集的用户的搜索结果。目标是确定搜索结果是否准确(即,是关于该人)还是不准确。为了做到这一点,在url数组中的每个链接中搜索每条配置文件数据,并且如果在页面上匹配该配置文件数据(例如City),则为每个属性分配二进制值。然后将结果表示为二进制文件的向量(即.1 0 0 0 1表示名称和电子邮件地址在URL上匹配)。

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

2 个答案:

答案 0 :(得分:0)

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

  2. 但是,您很可能无法使用精选的训练集创建合适的模型。简单的想法是,您应该将数据训练成与实时数据完全相同的数据。实时数据是否会缺少值,不完整的配置文件等?因此,您需要您的模型知道在这种情况下该做什么,因此,此类配置文件应该在训练集中。

  3. 是的,当然,您可以创建一个由多个子模型组成的模型,但是如果没有足够的训练数据和过度拟合,您可能会遇到问题。你必须创建多个好的模型才能工作,这更难。我认为最好将这个推理留给模型本身,而不是试图把它握向正确的方向,这就是机器学习的目的 - 省去你的麻烦......但是真的没办法说在尝试数据集之前。同样,无论你的具体情况如何,都是正确的。

答案 1 :(得分:0)

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

你有f1 ... fn的功能,其中一些可能会或可能不会出现在任何给定的条目中。后验概率p(相关| 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)] / evidence(t)

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

其中证据(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)]。< / p>

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

在这种情况下,后验相关概率变为零,因为计数(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]。