我正在做一些關於一個班的性別分類的工作。我一直在使用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