クラスの性別分類に関する作業を行っています。私は SVMLight を使用してまともな結果を得ていますが、データに対してベイジアン法も試してみたかったのです。私のデータセットはテキスト データで構成されており、機能削減を行って、一部のベイジアン手法で機能空間をより適切なサイズに縮小しました。すべてのインスタンスは tf-idf を介して実行され、(独自のコードを介して) 正規化されます。
現在のコードベースとの統合が簡単だったので、sklearn ツールキットを手に入れましたが、GaussianNB から得られる結果はすべて 1 つのクラス (この場合は -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