因为您使用朴素贝叶斯作为您的模型(也正因为如此),您可以从独立性假设中受益,以使用您可用的每条数据,并且只考虑新样本中存在的数据。
您有特征 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]。