Python sklearn GaussianNB-坏结果,[nan]概率

Python sklearn GaussianNB-坏结果,[nan]概率,python,machine-learning,scikit-learn,bayesian,Python,Machine Learning,Scikit Learn,Bayesian,我正在为一个班级做一些性别分类的工作。我一直在使用SVMLight,效果不错,但我也想在我的数据上尝试一些贝叶斯方法。我的数据集由文本数据组成,我已经进行了特征缩减,以将一些贝叶斯方法的特征空间缩减到更合理的大小。所有实例都通过tf-idf运行,然后(通过我自己的代码)进行规范化 我使用了sklearn工具包,因为它很容易与我当前的代码库集成,但是我从GaussianNB中得到的结果都是一个类(-1),并且预测的概率都是[nan] 我粘贴了一些相关代码;我不知道这是否足以继续下去,但我希望我只是

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

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

我粘贴了一些相关代码;我不知道这是否足以继续下去,但我希望我只是忽略了使用sklearnapi时显而易见的一些东西。我有两个不同的功能集,我已经尝试通过它推动,也有相同的结果。使用训练集和交叉验证也是一样的。有什么想法吗?可能是因为我的功能空间过于稀疏,无法工作吗?我有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值是非负频率;改用
多项式nb
,或者试试
伯努林b
。scikit learn附带了一个示例,顺便说一下,它使用内置的
tfidf Transformer
使用tf-idf加权

不过,不要期望奇迹出现,因为300个样本对于一个训练集来说是相当小的(尽管对于二进制分类来说,它可能只足以超过“最频繁”的基线)。YMMV


全面披露:我是scikit learn核心开发者之一,也是当前
多项式nb
伯努林b
代码的主要作者。

GaussianNB
根本不适合文档分类,因为tf idf值是非负频率;改用
多项式nb
,或者试试
伯努林b
。scikit learn附带了一个示例,顺便说一下,它使用内置的
tfidf Transformer
使用tf-idf加权

不过,不要期望奇迹出现,因为300个样本对于一个训练集来说是相当小的(尽管对于二进制分类来说,它可能只足以超过“最频繁”的基线)。YMMV


全面披露:我是scikit learn核心开发者之一,也是当前
多项式nb
伯努林b
代码的主要作者。

如果没有看到数据,或者至少是其中的一个样本,这真的很难判断。不过,第一个问题是:你确定
GaussianNB
合适吗?你的特征(大致)是高斯分布的,即正态分布吗?好问题。我实际上不确定tf idf和归一化对分布有什么影响,但它很可能不是高斯分布。老实说,我只是从工具箱中获取了这个,因为它处理连续的特性,所以对于数据来说,它可能是一个糟糕的选择。我仍然不确定这是否解释了我得到的结果。我忽略了它们是tf idf向量的事实。我会迅速给出一个答案。如果没有看到数据,或者至少是一个样本,这真的很难说。不过,第一个问题是:你确定
GaussianNB
合适吗?你的特征(大致)是高斯分布的,即正态分布吗?好问题。我实际上不确定tf idf和归一化对分布有什么影响,但它很可能不是高斯分布。老实说,我只是从工具箱中获取了这个,因为它处理连续的特性,所以对于数据来说,它可能是一个糟糕的选择。我仍然不确定这是否解释了我得到的结果。我忽略了它们是tf idf向量的事实。我会想出一个答案。谢谢-多项式和伯努利分类器都起作用了。在re。奇迹,你可能会感到惊讶,但实际上我得到了相当好的结果(大约84%的准确度),与SVM结果相当。考虑到你正在进行性别分类,我预计基线值将略高于50%?不幸的是,基线值有点偏颇-58%为男性-但仍然是一个比我一开始预期的更好的结果。我不认为我会在这一点上寻求任何其他东西,但你永远不知道。Scikit learn看起来是一个非常好的软件包,顺便说一句,我比weka更喜欢它。多项式nb/BernoulliNB至少可以处理比我想象的贝叶斯方法大得多的特征空间。谢谢-多项式和Bernoulli分类器都能工作。在re。奇迹,你可能会感到惊讶,但实际上我得到了相当好的结果(大约84%的准确度),与SVM结果相当。考虑到你正在进行性别分类,我预计基线值将略高于50%?不幸的是,基线值有点偏颇-58%为男性-但仍然是一个比我一开始预期的更好的结果。我不认为我会在这一点上寻求任何其他东西,但你永远不知道。Scikit learn看起来是一个非常好的软件包,顺便说一句,我比weka更喜欢它。多项式nb/BernoulliNB至少可以处理比我认为的贝叶斯方法更大的特征空间。