朴素贝叶斯训练集优化
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) 来进行概率计算,那么我该如何将您的解决方案纳入其中? 我在答案中添加了一个示例:希望这会让事情更清楚以上是关于朴素贝叶斯训练集优化的主要内容,如果未能解决你的问题,请参考以下文章