我正在做一些关于一个班的性别分类的工作。我一直在使用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
如果没有看到数据,或者至少是一个样本,这真的很难说。第一个问题,但:你确定'GaussianNB'是适当的?你的特征(粗略)是高斯,即正态分布? – 2013-04-26 16:08:22
好问题。实际上我不确定tf-idf和规范化对分布有什么影响,但它很可能不是高斯。老实说,我只是从工具包中抓住了它,因为它处理了连续的功能,所以它可能是数据的不好选择。我仍然不确定这是否解释了我得到的结果。 – flatline 2013-04-26 16:14:06
我错过了他们是tf-idf载体的事实。我会提出一个答案。 – 2013-04-26 16:19:00