0

Я классифицирую небольшие тексты (твиты), используя Naive Bayes (MultinominalNB) в scikit-learn. Данные моего поезда имеют 1000 функций, а мои тестовые данные имеют 1200 функций. Предположим, что для обоих поездов и тестовых данных используются 500 функций.Naive Bayes unseen features обработка scikit learn

Интересно, почему MultinominalNB в scikit узнать не обрабатывает невидимые черты, и дает мне ошибку:

Traceback (most recent call last): 
    File "/Users/osopova/Documents/00_KSU_Masters/01_2016_Spring/Twitter_project/mda_project_1/step_4.py", line 60, in <module> 
    predict_Y = classifiers[i].predict(test_X) 
    File "/Library/Python/2.7/site-packages/sklearn/naive_bayes.py", line 65, in predict 
    jll = self._joint_log_likelihood(X) 
    File "/Library/Python/2.7/site-packages/sklearn/naive_bayes.py", line 672, in _joint_log_likelihood 
    return (safe_sparse_dot(X, self.feature_log_prob_.T) 
    File "/Library/Python/2.7/site-packages/sklearn/utils/extmath.py", line 184, in safe_sparse_dot 
    return fast_dot(a, b) 
ValueError: matrices are not aligned 

ответ

2

Он не обрабатывает невидимые черты, потому что вы не передаете никаких ссылок имен функции. Почему у вас есть 1200 функций в одном случае и 1000 в другом? Вероятно, потому, что в испытании не было объектов, не присутствующих на тренировке, - но как Наивный Байес должен выяснить, какие из этих 1200 пропали без вести в 1000? В этой реализации (которая является единственной возможной, когда вы принимаете массивы как входные данные), ваша обязанность - удалить все столбцы, которые не соответствуют тем, которые находятся в наборе обучения, добавить столбцы нулей (в допустимых точках), если это наоборот, и, что самое важное, убедитесь, что столбец «i» в одном наборе один и тот же (фиксирует появление одного и того же слова/объекта) как «i-й» столбец во втором. Следовательно, в вашем случае есть всего 500 столбцов, которые можно фактически использовать, и у Наивного Байеса нет информации о том, как их найти. Вы должны предоставить в тестовом сценарии те же самые 1000 функций, которые использовались в поезде, поэтому в вашем случае это означает удаление 700 столбцов, которые не видели во время поезда, и добавление (в действительных точках!) 500 столбцов нулей.

В частности, scikit-learn дает вам множество утилит предварительной обработки данных, которые делают это для вас (например, CountVectorizer и т. Д.).