2013-04-26 32 views
1

我正在做一些关于一个班的性别分类的工作。我一直在使用SVMLight,结果不错,但我也想对我的数据尝试一些贝叶斯方法。我的数据集由文本数据组成,并且我已经完成了特征缩减以将特征空间减少到对于一些贝叶斯方法更合理的大小。所有的实例都通过tf-idf运行,然后进行标准化(通过我自己的代码)。sklearn GaussianNB - 不好的结果,[nan]可能性

我抓起sklearn工具包,因为它很容易与我目前的代码库整合,但我从GaussianNB得到的结果都是一个类(-1在这种情况下),并且预测概率都[楠。

我粘贴了一些相关的代码;我不知道这是否足以继续,但我希望我只是忽略了使用sklearn api的一些明显的东西。我有几个不同的功能集,我已经试过了,也有相同的结果。使用训练集和交叉验证也一样。有什么想法吗?难道我的功能空间太稀疏了吗?我有300多个实例,其中大多数有几百个非零特征。

class GNBLearner(BaseLearner): 
    def __init__(self, featureCount): 
     self.gnb = GaussianNB() 
     self.featureCount = featureCount 

    def train(self, instances, params): 
     X = np.zeros((len(instances), self.featureCount)) 
     Y = [0]*len(instances) 
     for i, inst in enumerate(instances): 
      for idx,val in inst.data: 
       X[i,idx-1] = val 
      Y[i] = inst.c 
     self.gnb.fit(X, Y) 

    def test(self, instances, params): 
     X = np.zeros((len(instances), self.featureCount)) 
     for i, inst in enumerate(instances): 
      for idx,val in inst.data: 
       X[i,idx-1] = val 
     return self.gnb.predict(X) 

    def conf_mtx(self, res, test_set): 
     conf = [[0,0],[0,0]] 
     for r, x in xzip(res, test_set): 
      print "pred: %d, act: %d" % (r, x.c) 
      conf[(x.c+1)/2][(r+1)/2] += 1 
     return conf 
+1

如果没有看到数据,或者至少是一个样本,这真的很难说。第一个问题,但:你确定'GaussianNB'是适当的?你的特征(粗略)是高斯,即正态分布? – 2013-04-26 16:08:22

+0

好问题。实际上我不确定tf-idf和规范化对分布有什么影响,但它很可能不是高斯。老实说,我只是从工具包中抓住了它,因为它处理了连续的功能,所以它可能是数据的不好选择。我仍然不确定这是否解释了我得到的结果。 – flatline 2013-04-26 16:14:06

+0

我错过了他们是tf-idf载体的事实。我会提出一个答案。 – 2013-04-26 16:19:00

回答

5

GaussianNB是不适合用于文档分类可言,因为TF-IDF值是非负频率;改为使用MultinomialNB,也可以尝试BernoulliNB。 scikit-learn附带一个document classification示例,顺便说一句,使用tf-idf加权使用内置的TfidfTransformer

不要指望奇迹,因为300个样本对于一个训练集是非常小的(尽管对于二元分类,它可能足以击败“最频繁”的基线)。因人而异。

全面披露:我是scikit学习核心开发者和当前MultinomialNBBernoulliNB代码的主要作者之一。

+0

谢谢 - 多项分类器和伯努利分类器都有效。在重新。奇迹,你可能会感到惊讶,但我实际上得到了相当不错的结果(〜84%的准确性),与SVM结果一致。 – flatline 2013-04-26 17:43:44

+0

@flatline:这是一个很好的分数!鉴于你在进行性别分类,我预计基线刚好超过50%? – 2013-04-26 18:28:19

+0

不幸的是,基准线有点偏颇 - 58%的男性 - 但仍然比我在一开始预期的要好。在这一点上,我认为我不会想到其他任何东西,但你永远不知道。 Scikit学习看起来像一个非常好的软件包,我比迄今为止更喜欢它。 MultinomialNB/BernoulliNB至少可以处理比我认为可以用贝叶斯方法做得更多的特征空间。 – flatline 2013-04-26 18:50:54