2013-04-26 4 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' подходит? Являются ли ваши функции (грубо говоря) гауссианцами, то есть нормально распределены? –

+0

Хороший вопрос. На самом деле я не уверен, какое влияние имеет tf-idf и нормализация на дистрибутив, но это, вполне возможно, не гауссово. Я честно просто схватил это из инструментария, потому что он обрабатывает непрерывные функции, поэтому он может быть плохим выбором для данных. Я все еще не уверен, объясняет ли это результаты, которые я получаю или нет. – flatline

+0

Я пропустил тот факт, что они являются векторами tf-idf. Я подниму ответ. –

ответ

5

GaussianNB не хорошо подходит для классификации документов вообще, так как Tf-IDF значения являются неотрицательными частоты; вместо этого используйте MultinomialNB, и, возможно, попробуйте BernoulliNB. scikit-learn поставляется с примером document classification, который, кстати, использует взвешивание tf-idf с использованием встроенного TfidfTransformer.

Не ожидайте чудес, хотя 300 образцов довольно малы для набора тренировок (хотя для двоичной классификации это может быть достаточно, чтобы обыграть «наиболее частой» базовый уровень). YMMV.

Полное раскрытие: Я один из scikit освоении основных разработчиков и основного автора текущего MultinomialNB и BernoulliNB кода.

+0

Спасибо - работало многоминимальное и бернуллиевское классификаторы. В ре. чудеса, вы можете быть удивлены, но я действительно получаю неплохие результаты (~ 84% точности), наравне с результатами SVM. – flatline

+0

@flatline: это хороший результат! Учитывая, что вы занимаетесь гендерной классификацией, я ожидаю, что базовый уровень составит чуть более 50%? –

+0

Базовая линия немного более предвзятая, к сожалению, 58% мужчин - но все же лучший результат, чем я ожидал с самого начала. Я не думаю, что в этот момент я собираюсь извлечь из него что-нибудь еще, но вы никогда не знаете. Scikit-learn выглядит как действительно хороший пакет, мне нравится намного лучше, чем weka. MultinomialNB/BernoulliNB, по крайней мере, может работать с гораздо большим пространством объектов, чем я думал, что смогу сделать с байесовскими методами. – flatline