Как реализовать инкрементальное обучение с использованием наивного алгоритма Байеса в python? - PullRequest
0 голосов
/ 26 декабря 2018

Я реализовал модель ML, используя наивный алгоритм Байеса, где я хочу реализовать инкрементальное обучение.Проблема, с которой я сталкиваюсь, заключается в том, что, когда я тренирую свою модель, и она генерирует 1500 функций во время предварительной обработки, а затем через месяц, используя механизм обратной связи, если я хочу обучить свою модель новыми данными, которые могут содержать некоторые новые функции, может быть меньше или большечем 1500 (т.е. из моего предыдущего набора данных), если я использую fit_transform для получения новых функций, тогда мой существующий набор функций теряется.

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

cv = CountVectorizer()

X = cv.fit_transform(corpus).toarray() #replaces my older feature set

classifier = GaussianNB()

classifier.partial_fit(X,y) 
#does not fit because the size of feature set count is not equal to previous feature set count

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Вы не можете с CountVectorizer.Вам нужно будет исправить количество функций для partial_fit() в GaussianNB.

Теперь вы можете использовать другой препроцессор (вместо CountVectorizer), который может отображать входные данные (старые и новые) в одно и то же пространство функций.Взгляните на HashingVectorizer, который авторы scikit-learn рекомендуют использовать только в упомянутом вами сценарии.При инициализации вам нужно будет указать количество функций, которые вы хотите.В большинстве случаев значения по умолчанию достаточно, чтобы не было коллизий в хешах разных слов.Вы можете попробовать поэкспериментировать с разными номерами.Попробуйте использовать это и проверьте производительность.Если не соответствует номиналу CountVectorizer, вы можете сделать то, что предлагает @AI_Learning, и создать новую модель для всех данных (старая + новая).

0 голосов
/ 26 декабря 2018

Вы можете использовать только transform() для CountVectorizer() и затем partial_fit() для наивного байесовского, как показано ниже для инкрементного обучения.Помните, что преобразование с использованием извлечения тех же функций, которые вы изучили с помощью предыдущего набора данных.

X = cv.transform(corpus)

classifier.partial_fit(X,y) 

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

Если вы думаете, что ваш новый набор данных имеет значительно отличающиеся функции по сравнению со старым, используйте cv.fit_transform (), а затем classifier.fit () для полного набора данных (как старого, так и нового), что означает, что мысобираюсь создать новую модель для всех доступных данных.Вы можете принять это, если ваш набор данных недостаточно велик, чтобы хранить его в памяти!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...