Scikit-learn: доступна ли полууправляемая реализация Naive Bayes?

Я хотел бы использовать реализацию Semi-supervised Naive Bayes (Bernoulli) Scikit-learn. Согласно этой ссылке в github, была проведена некоторая работа и обсуждение об этом год назад (класс SemisupervisedNB). С другой стороны, похоже, существует другая другая реализация (функция fit_semi?), которая кажется впоследствии он был отполирован другим пользователем. Однако ни один из них не доступен в текущей стабильной версии.

Может ли кто-нибудь показать мне пример того, как я могу использовать одну из этих двух реализаций с текущим выпуском scikit-learn для создания полууправляемого наивного байесовского метода? Спасибо.

PS: я использую классификаторы scikit-learn от NLTK с классом SklearnClassifier

ИЗМЕНИТЬ

Я попробовал код SemiSupervisedNB в своем проекте, изменив метку для немаркированного класса с -1 на 2 (я использую SKlearnClassifier из NLTK, и мой немаркированный класс получает метку 2). Однако я получаю ValueError: массив не должен содержать infs или NaN при вычислении d (разница между текущими и предыдущими параметрами модели), потому что массивы перехвата содержат значения inf... Есть идеи, как это решить?


person AM2    schedule 19.01.2013    source источник
comment
Вы можете попробовать проверить ветку и поработать над этим, но я не уверен, что она в настоящее время в хорошем состоянии - также она сильно отстает от текущей стабильной версии. Вы можете попробовать перебазировать / объединить ветку с текущим мастером. Но если вы не знакомы с git/проектом, у вас наверняка возникнут некоторые проблемы. Или просто подождите, пока @larsmans прокомментирует и скажет вам, что делать ;)   -  person Andreas Mueller    schedule 19.01.2013
comment
Спасибо за ваш ответ. К сожалению, сейчас у меня не так много времени на просмотр кода... Я тоже подожду @ogrisel :)   -  person AM2    schedule 19.01.2013
comment
Извините, но у меня действительно нет времени, чтобы исправить это или даже проинструктировать вас, как это сделать. Полууправляемый NB должен работать (коллега пробовал всего несколько месяцев назад), но он вообще не связан с текущим scikit-learn. Вы можете попробовать перебазировать его, как предложил @amueller.   -  person Fred Foo    schedule 20.01.2013
comment
@AM2 Несколько месяцев назад я открыл проблему на GitHub по этой теме. . Я нашел способ заставить реализацию SemiSupervisedNB работать. Однако я пока не проверял, влияют ли описанные изменения в ветке master на другие классификаторы или код. Пробуйте с осторожностью!   -  person pemistahl    schedule 29.01.2013
comment
@ Питер Шталь Спасибо. Я попробовал код SemiSupervisedNB в своем проекте, изменив метку для немаркированного класса с -1 на 2 (я использую SKlearnClassifier из NLTK, и мой немаркированный класс получает метку 2). Однако я получаю ValueError: массив не должен содержать infs или NaN при вычислении d (разница между текущими и предыдущими параметрами модели), потому что массивы перехвата содержат значения inf... Есть идеи, как это решить?   -  person AM2    schedule 31.01.2013
comment
@ AM2 Вы просто используете ветку emnb форка @larsmans? Или вы скопировали класс SemiSupervisedNB в текущую основную ветку? Вы также должны скопировать класс LabelBinarizer из sklearn/preprocessing/__init__.py в sklearn/preprocessing.py и заменить класс с тем же именем в последнем файле. Пожалуйста, прочитайте вопрос на GitHub более внимательно. Тогда должно быть понятно, я думаю.   -  person pemistahl    schedule 31.01.2013


Ответы (1)


Несколько месяцев назад я открыл вопрос на GitHub по этой теме. Можно добавить соответствующий код в текущую основную ветку scikit-learn.

Пользователь @larsmans около года назад добавил экспериментальный класс SemisupervisedNB в файл sklearn/naive_bayes.py. Этот код находится в ветке emnb его разветвленного репозитория scikit-learn, и доступ к нему можно получить здесь.

Основной код находится в двух файлах:

  1. Файл naive_bayes.py в текущей ветке master должен быть заменен более старым из ветки emnb.

  2. Необходимо редактирование класса LabelBinarizer, которое можно найти в файле sklearn/preprocessing.py в ветке master. Весь класс должен быть заменен его определением в ветке emnb @larsmans. Там он находится в файле sklearn/preprocessing/__init__.py.

Несмотря на то, что код наивных байесовских классификаторов за год не сильно изменился, в них были добавлены некоторые исправления ошибок. Поэтому имеет смысл сохранить текущие версии файла naive_bayes.py и класса LabelBinarizer, а вместо этого дать экспериментальным версиям другие имена.

Я только что создал свой собственный форк репозитория scikit-learn и добавил экспериментальные файлы поверх текущей стабильной ветки 0.13.X. Эта ветка называется 0.13.X-emnb и доступна здесь. Если вы посмотрите на три моих последних коммита (1 и 2 и 3), вы увидите, какие файлы я изменил и создал заново.

Поскольку SemisupervisedNB не работает вместе с самыми последними версиями других классификаторов, я только что добавил новый модуль рядом с naive_bayes.py под названием semisupervised_naive_bayes.py. Там вы найдете более старые версии классификаторов в переименованных версиях, например. SemiMultinomialNB вместо MultinomialNB, чтобы они не конфликтовали с самыми последними версиями классификаторов. Точно так же я добавил класс SemisupervisedLabelBinarizer рядом с LabelBinarizer (выбор имени немного неудачен, но, по крайней мере, понятно, для чего он должен использоваться).

Итак, если вы хотите использовать полууправляемые версии классификаторов, используйте модуль sklearn.semisupervised_naive_bayes. Для текущих версий используйте модуль sklearn.naive_bayes.

Но, пожалуйста, имейте в виду, что это очень экспериментально. Это просто настройка для того, чтобы этот старый код работал. Я не искал баги.

person pemistahl    schedule 31.01.2013
comment
Спасибо за ваше время и терпение, наконец-то запустили текущую ветку. Мне пришлось изменить строки 501 и 448 semisupervised_naive_bayes.py на SemiBaseDiscreteNB и SemiBernoulliNB соответственно. - person AM2; 31.01.2013
comment
@AM2 Нет проблем. Пожалуйста. :) Мне самому нужна полууправляемая версия, поэтому я так подробно разобрался с этим вопросом. Я рад, что смог помочь. - person pemistahl; 31.01.2013
comment
@ AM2 О, понятно, я изменил имена классов в двух забытых строках 448 и 501. Спасибо, что сообщили мне. - person pemistahl; 31.01.2013
comment
Спасибо еще раз! Я изменил SKlearnClassifier NLTK, чтобы использовать этот классификатор. При запуске с relabel_all=false EM всегда останавливается после 2 итераций, что выглядит не очень хорошо... Кстати, строка 567 semisupervised_naive_bayes.py, кажется, выполняется в случае relabel_all=false, однако X_unlabeled не определен, поскольку условие блока if в строке 545 не очищается. Это похоже на ошибку оригинальной реализации, но я не уверен - person AM2; 31.01.2013
comment
@ AM2 Вы правы, это действительно ошибка. У вас есть идея, как это исправить? - person pemistahl; 31.01.2013
comment
Я думаю, вы могли бы просто поместить все содержимое внутри этого блока if снаружи и удалить if. Я собираюсь более внимательно изучить код через несколько дней и опубликовать снова. Кстати, я тоже хочу EM для PU-Learning :) - person AM2; 01.02.2013