Scikit-learn: BernoulliNB, v0.10 и v0.13: очень разные результаты

Это что-то вроде продолжения этой темы, где я получал ошибочные результаты с классификатором GaussianNB, которые оказались из-за того, что у меня был scikit-learn v0.10 на виртуальной машине Linux, над которой я проводил эксперименты. Вместо этого я использовал классификаторы Бернулли и Мультиномиальный NB, но когда я (наконец) установил scipy на свой macbook, версия scikit-learn, которую я взял, была 0.13, последняя на момент написания этой статьи. Теперь я столкнулся с новой проблемой:

  • В v0.10 я получаю более 90% точности с помощью классификатора BernoulliNB для одного из моих наборов функций, что является единственным заметным улучшением, которое я получил на данный момент.
  • В v0.13 он составляет около 67%, используя точно такой же код.

Кто-нибудь знает, что изменилось между версиями? Я просмотрел историю репо, но не нашел ничего, что объясняло бы такое изменение точности. Поскольку я получаю действительно хорошие результаты с BernoulliNB v0.10, я, очевидно, хотел бы их использовать, но я не решаюсь сделать это, не понимая немного больше противоречивых результатов между версиями.

Я попытался установить (более новое) свойство class_prior, но это не изменило результаты для 0.13.

Редактировать: если не считать рабочего примера (над которым я буду работать), результаты 0,13 сильно предвзяты, чего я не ожидал бы от байесовского классификатора, и заставляет меня поверить, что он может иметь был регрессом в предыдущих расчетах класса, хотя я еще не отследил его. Например:

0.10:
T\P F   M
F   120 18
M   19  175

0.13:
T\P F   M
F   119 19
M   59  135

Редактировать 2:

Я работал над несколькими примерами вручную. Версия 0.13 определенно правильная, а версия 0.10 определенно нет, чего я и подозревал, и опасался. Ошибка в 0,10, по-видимому, связана с предварительным расчетом класса. В функции _count обнаружены ошибки, особенно на этой строке файла, количество классов просто неверно: сравните с ветвь 0,13, игнорируя то, что две ветви используют коэффициенты сглаживания в разных местах.

Мне нужно еще немного подумать об этом, почему неверные подсчеты функций приводят к такой хорошей производительности на моих данных, и я все еще немного не уверен, почему установка априорных классов не сработала. Возможно, это наказание за уже присутствующую в исходных документах предвзятость к мужчинам?

Редактировать 3:

Я считаю, что это именно то, что он делает. Функция _count и, следовательно, расчет априорных признаков признаков в fit не учитывает этот параметр, поэтому, хотя class_priors учитываются в predict, они не используются для построения модели во время обучения. Не уверен, что это сделано намеренно - хотели бы вы игнорировать априорные значения, используемые для построения модели во время тестирования?


comment
Не могли бы вы включить минималистичный сценарий воспроизведения + данные, демонстрирующие регрессию?   -  person ogrisel    schedule 04.05.2013
comment
@ogrisel: я, конечно, могу попробовать, но потребуется некоторая работа, чтобы получить как код, так и тестовые данные, чтобы я мог воспроизвести регрессию за пределами моей текущей структуры. Это потребует немного больше усилий, чем я, по общему признанию, вложил в отладку проблемы до сих пор, поэтому я посмотрю, что я могу собрать, и либо обновлю сообщение, либо репост в зависимости от временных рамок, если никто не знает об этом навскидку. ожидаемое изменение поведения между версиями   -  person flatline    schedule 04.05.2013


Ответы (1)


Подводя итог моим результатам, ошибка была в версии 0.10 классификатора BernoulliNB, где он искажал количество классов при расчете априорных признаков и, по-видимому, смещал результирующую модель для получения превосходных результатов. Мне удалось адаптировать части того, что это делало, и в конечном итоге я получил эквивалентную производительность от (Правильно) MultinomialNB в версии 0.13.

person flatline    schedule 08.05.2013