【问题标题】:sklearn GaussianNB - bad results, [nan] probabilitiessklearn GaussianNB - 不好的结果,[nan] 概率
【发布时间】:2013-04-27 00:30:58
【问题描述】:

我正在为一个班级做一些性别分类工作。我一直在使用 SVMLight 并取得了不错的结果,但我也想在我的数据上尝试一些贝叶斯方法。我的数据集由文本数据组成,并且我已经完成了特征缩减,以将特征空间缩减到一些贝叶斯方法的更合理的大小。所有实例都通过 tf-idf 运行,然后规范化(通过我自己的代码)。

我抓住了 sklearn 工具包,因为它很容易与我当前的代码库集成,但是我从 GaussianNB 得到的结果都是一类(在本例中为 -1),并且预测的概率都是 [nan ].

我已经粘贴了一些相关代码;我不知道这是否足以继续,但我希望我只是忽略了使用 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

【问题讨论】:

  • 如果不查看数据,或者至少是其中的样本,这真的很难说。不过,第一个问题:你确定GaussianNB 合适吗?您的特征(大致)是高斯分布,即正态分布吗?
  • 好问题。我实际上不确定 tf-idf 和归一化对分布有什么影响,但它很可能不是高斯分布的。老实说,我只是从工具包中获取了这个,因为它处理连续的特征,所以它对于数据来说可能是一个糟糕的选择。我仍然不确定这是否解释了我得到的结果。
  • 我错过了它们是 tf-idf 向量的事实。我会拿出一个答案。

标签: python machine-learning scikit-learn bayesian


【解决方案1】:

GaussianNB 根本不适合文档分类,因为 tf-idf 值是非负频率;改用MultinomialNB,也许试试BernoulliNB。 scikit-learn 附带了一个 document classification 示例,顺便说一下,它使用内置 TfidfTransformer 的 tf-idf 加权。

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

全面披露:我是 scikit-learn 核心开发人员之一,也是当前 MultinomialNBBernoulliNB 代码的主要作者。

【讨论】:

  • 谢谢 - 多项式分类器和伯努利分类器都有效。在重新。奇迹,你可能会感到惊讶,但实际上我得到了相当不错的结果(准确率约为 84%),与 SVM 的结果相当。
  • @flatline:这个分数不错!鉴于您正在进行性别分类,我预计基线会超过 50%?
  • 不幸的是,基线偏向更多 - 58% 是男性 - 但仍然比我一开始预期的要好。我不认为我会在这一点上寻求其他任何东西,但你永远不知道。顺便说一句,Scikit-learn 看起来是一个非常不错的软件包,到目前为止,我比 weka 更喜欢它。 MultinomialNB/BernoulliNB 至少可以处理比我想象的贝叶斯方法更大的特征空间。
猜你喜欢
  • 2021-07-16
  • 1970-01-01
  • 2017-09-18
  • 2015-06-24
  • 2015-05-04
  • 2015-02-13
  • 2019-11-20
  • 1970-01-01
  • 2013-12-24
相关资源
最近更新 更多