2013-04-26 62 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