Это что-то вроде продолжения этой темы, где я получал ошибочные результаты с классификатором 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
, они не используются для построения модели во время обучения. Не уверен, что это сделано намеренно - хотели бы вы игнорировать априорные значения, используемые для построения модели во время тестирования?