Байесовский классификатор
Обновлено: 26 марта 2018 г. Обновлено: 26 марта 2018 г.
Автор: Виндсон Ян
Авторские права принадлежат автору. Для коммерческих перепечаток, пожалуйста, свяжитесь с автором для получения разрешения, а для некоммерческих перепечаток, пожалуйста, укажите источник (www.enginego.org).
Байесовские модели появляются как в машинном обучении, так и в искусственном интеллекте.cherryКлассификатор использует наивный алгоритм байесовской модели и достигает точности 97,5% при небольшом количестве данных (1000 предложений). В этой статье я расскажу о теории, реализации и анализе ошибок байесовской модели. Я знаю, что все основные фреймворки имеют реализацию алгоритма наивной байесовской модели. Большинству людей нужно только вызвать функцию для достижения аналогичной точности. Однако , при реальном использовании, сталкиваясь с разными наборами данных, вы должны понимать принцип алгоритма, чтобы знать, как настроить параметры.
- Использование классификатора
- фильтрация ключевых слов
- Вывод байесовской модели
- Реализация байесовской модели
- контрольная работа
- Статистический анализ
- Суммировать
Использование классификатора Использование классификатора
Основные условия: Основные условия:
-
тренировочные данные
Наборы данных с определяемыми людьми категориями
-
введите предложение
Новые предложения, по которым необходимо оценивать категории (обычно не должны присутствовать в обучающих данных)
В кеше данных по умолчанию китайские обучающие данные содержатнормальный,политически чувствительный,азартная игра,порнография4 категории, данные для обучения английскому языку содержатобычная почта,спамДве категории, данные обучения могут быть переданы черезGoogle driveскачать. Введите предложение:
Полиция провела телеконференцию, посвященную специальной кампании провинции, посвященной борьбе с незаконными и преступными азартными играми. В центре внимания встречи было «расследование и наказание» азартных игр, таких как Mark Six, ставки на футбол и лошадей.
>>> result = cherry.classify('警方召开了全省集中打击赌博违法犯罪活动专项行动电 电话会议。会议的重点是“查处”六合彩、赌球赌马等赌博活动。')
Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/md/0251yy51045d6nknpkbn6dc80000gn/T/jieba.cache
Loading model cost 0.894 seconds.
Prefix dict has been built succesfully.
>>> result.percentage
[('normal.dat', 0.997), ('politics.dat', 0.002), ('gamble.dat', 0.0), ('sex.dat', 0.0)]
>>> result.word_list
[('赌博', 8.5881312727226), ('活动', 6.401543938544878), ('会议', 6.091963362021649), ('违法犯罪', 4.234845736802978), ('警方', 3.536827626008435), ('打击', 3.2491455535566542), ('行动', 2.8561029654470476), ('查处', 2.3860993362013083), ('重点', 2.126816738271229), ('召开', 1.8628511924367634), ('专项', 1.1697040118768172), ('电视电话会议', 1.1697040118768172), ('全省', 0.47655683131687354), ('集中', -0.6220554573512382), ('六合彩', -2.29603189092291)]
Классификатор считает, что входное предложение с вероятностью 99,7% является нормальным предложением, 0,2% — политически чувствительным, а оставшиеся 0,1% — двумя другими категориями Слова, оказывающие наибольшее влияние на суждение классификатора:
赌博,活动,会议,违法犯罪
фильтрация по ключевым словам фильтрация по ключевым словам
Судя по категории входных предложений, самый простой и оригинальный способ — использовать фильтрацию по ключевым словам, введите предложение:
Бонус будет зачислен на ваш счет после первого депозита. Live Крупье, Mark Six, Ставки на мяч Добро пожаловать в новую игру Fantan!
так какЖивой дилер,Марк ШестьЭти два слова обычно встречаются только в предложениях, связанных с азартными играми. С помощью фильтрации ключевых слов мы можем добавить их в черный список категорий азартных игр.
Этот метод прост в реализации, но имеет очевидные недостатки. Например, прямо сейчас встретите входное предложение:
Полиция провела телеконференцию, посвященную специальной кампании провинции, посвященной борьбе с незаконными и преступными азартными играми. В центре внимания встречи было «расследование и наказание» азартных игр, таких как Mark Six, ставки на футбол и лошадей.
Хотя входное предложение содержитМарк Шесть,Азартная играЭти два слова являются обычными предложениями, поэтому алгоритм фильтрации ключевых слов может ошибаться.
Вывод байесовской модели Вывод байесовской модели
Проблема фильтрации по ключевым словам заключается в том, что анализируются только несколько слов во входном предложении, а не анализируется все входное предложение.Когда люди оценивают входное предложение:
Полиция провела телеконференцию, посвященную специальной кампании провинции, посвященной борьбе с незаконными и преступными азартными играми. В центре внимания встречи было «расследование и наказание» азартных игр, таких как Mark Six, ставки на футбол и лошадей.
Синтетически анализируем каждое слово в предложении:
警方,召开,全省,集中打击,... 六合彩,赌球,赌马,...
Хотя он содержитМарк Шестьэто ключевое слово, нополиция,держал,сосредоточенная атакаЭти несколько слов указывают на то, что предложение, скорее всего, будет обычным предложением.
То же самое верно и для байесовской модели.По сравнению с фильтрацией по ключевым словам, которая фокусируется только на определенных словах во входном предложении, байесовская модель анализирует все допустимые слова во входном предложении и вычисляет различные категории каждого слова с помощью обучающих данных. вероятности, а затем объединить, чтобы получить наиболее вероятный результат. Математический вывод байесовской модели очень прост, и вам настоятельно рекомендуется успокоиться и вывести ее самостоятельно.
Здесь для простоты мы рассматриваем только возможность того, что предложение является «нормальным» или «азартным». Давайте сначала рассмотрим теорию вероятностей:
P (входное предложение) -> вероятность появления этого предложения в обучающих данных
P(азартные игры) -> вероятность того, что предложение категории азартных игр появится в обучающих данных.
P(азартные игры|входное предложение) -> вероятность того, что входное предложение относится к категории азартных игр (условная вероятность, которая также является значением, которое мы в конечном итоге запрашиваем)
Для той же фразы:
P(Азартные игры | Вводное предложение) + P(Обычный | Вводное предложение) = 100%
На рисунке выше перекрывающаяся часть в середине - это вероятность P (азартные игры, входное предложение) одновременного возникновения азартных игр и предложений. Видно, что:
P(азартные игры | входное предложение) = P(игры, входное предложение) / P(входное предложение) (1)
Так же:
P(входное предложение|азартная игра) = P(азартные игры, входное предложение) / P(азартные игры) (2)
Подставьте (2) в (1), чтобы получить
P(азартные игры | входное предложение) = P(входное предложение | азартные игры) * P(игры) / P(входное предложение) (3)
Дэн Дэн Денг, (3) является теоремой Байеса. Неважно, если вы не понимаете, просто остановитесь и прочитайте еще раз.Чтобы получить итоговое входное предложение вероятность азартной игры категории P (азартные игры | входное предложение), нужно знать 3 величины справа:
-
П (азартные игры)
Относится к проценту данных обучения, в которых предложения в категории азартных игр учитывают данные обучения.
-
P (вводное предложение)
Относится к вероятности того, что это входное предложение появится в обучающих данных. Наша конечная цель — определить, к какой категории относится входное предложение с большей вероятностью, то есть сравнить P (азартные игры | входное предложение) и P (нормальное | входное предложение), согласно теореме Байеса:
P(азартные игры | входное предложение) = P(входное предложение | азартные игры) * P(игры) / P(входное предложение) (4)
P(нормальный | входное предложение) = P(входное предложение | нормальный) * P(нормальный) / P(входное предложение) (5)
Поскольку (4) и (5) оба делятся на одно и то же P (входное предложение), правая часть (4) и (5) может быть умножена на P (предложение) одновременно, и только произведение сравниваются первые два значения справа от знака равенства размера.
P(игры | входное предложение) = P(входное предложение | азартные игры) * P(игры) P(обычное | входное предложение) = P(входное предложение | нормальное) * P(нормальное)
-
P(предложение | азартные игры)
Самое главное найти P (входное предложение | азартные игры), очень сложно напрямую найти вероятность того, что входное предложение появится в предложении категории азартных игр, потому что обучающие данные могут содержать не все предложения, и вполне вероятно, что входных предложений нет. Что это обозначает? Из одного и того же предложения могут устанавливаться разные перестановки и сочетания слов, например:
Бонус будет зачислен на ваш счет после первого депозита. Live Крупье, Mark Six, Ставки на мяч Добро пожаловать в новую игру Fantan!
может стать
Бонус будет зачислен на ваш счет после первого депозита. Лотерея, Ставки на мячи, Живой крупье Добро пожаловать в новую игру Fantan!
или
Добро пожаловать в новую игру Fantan, бонус будет зачислен на ваш счет после вашего первого депозита. Марк Шесть, Живой крупье, Ставка!
Слегка изменив положение слова — это новое предложение, добавить все переставленные предложения в обучающие данные невозможно, потому что их слишком много.Поэтому, когда мы сталкиваемся с входным предложением, вполне вероятно, что оно не появляется в обучающих данных, тогда вероятность, соответствующая P (входное предложение | категория), равна нулю, что, очевидно, не является реальным результатом. также приведет к сбою нашего классификатора, что мы должны делать в это время?Мы только что упомянули в алгоритме фильтрации ключевых слов, что люди будут делить предложение на разные слова для всестороннего анализа, так можем ли мы также рассматривать предложения как набор слов?
Полиция провела телеконференцию, посвященную специальной кампании провинции, посвященной борьбе с незаконными и преступными азартными играми. В центре внимания встречи было «расследование и наказание» азартных игр, таких как Mark Six, ставки на футбол и лошадей.
Полиция провела общепровинциальную... ставки на лошадей и другие азартные игры = полиция + холдинг + общепровинциальная...+азартные игры
который:
P(входное предложение|азартные игры) = (P(термин1) * P(термин2|термин1) * P(термин3|термин2))|игры) ≈ P(термин1)|P(игры) * P(термин 2)|P( Азартные игры) * P(Слово 3)|P(Азартные игры)
P(Полиция провела по всей провинции… ставки на лошадей и другие азартные игры.|Азартные игры) = P(Полиция|Азартные игры) * P(Холдинг|Азартные игры) * P(Провинция|Азартные игры) … * P(Ставки на лошадей|Азартные игры) * P (Азартные игры | Азартные игры)
Гораздо проще вычислить вероятность появления слова в обучающих данных, разложив P(входное предложение|игра) на произведение всех вероятностей P(слово|игра). В итоге мы получаемВероятности разных классов допустимых слов во входном предложении, в приведенном выше примере, хотяставки на лошадей,Азартная игра,азартные игрыЭти слова с высокой вероятностью относятся к категории азартных игр, но, рассматривая все слова во всем предложении, классификатор делает вывод, что это предложение с вероятностью 90% является нормальным предложением.
слова нормальный азартная игра полиция 0.8 0.2 держал 0.7 0.3 провинция 0.7 0.3 ставки на лошадей 0.4 0.6 Азартная игра 0.3 0.7 азартные игры 0.4 0.6 ———— ———— ———— Комплексная вероятность 0.9 0.1 Подводя краткий итог, чтобы вычислить вероятность того, что предложение относится к определенной категории, необходимо только вычислить произведение вероятности слов в действительной части предложения в этой категории.
Реализация байесовской модели Реализация байесовской модели
Чтобы рассчитать вероятность появления каждого слова в разных категориях, нам нужны обучающие данные для обучения: 1. Выберите обучающие данные, пометьте категорию 2. Токенизируйте все обучающие данные и сформируйте набор слов, содержащий все слова 3. Преобразуйте все обучающие данные в вектор длины набора наборов слов 4. Используя нижние обучающие данные для каждой категории, вычислите вероятность каждого слова в наборе наборов слов
выбрать данные для тренировки выбрать данные для тренировки
На самом деле существует много способов выбора обучающих данных.В простейшем случае мы можем искать предложения, соответствующие соответствующей категории, в Интернете.Если это проблема бинарной классификации, мы можем сделать половину данных в каждой категории. Но когда вы поймете принцип байесовской модели, вы обнаружите проблему, заключающуюся в том, чтобы поддерживать независимое распределение данных, если вы выберете обучающие данные следующим образом:
-
Категория азартных игр
В зависимости от преимуществ, которые вы выбрали выше, вы должны заполнить 16-кратную или 15-кратную общую сумму (депозит + бонус на первый депозит) в казино, прежде чем вы сможете подать заявку на снятие средств.
Бонус будет зачислен на ваш счет после первого депозита. Live Dealer Mark Six Добро пожаловать в новую игру Fantan!
-
нормальная категория
Linux — это набор Unix-подобных операционных систем, которые можно свободно использовать и свободно распространять, это многопользовательская, многозадачная, многопоточная и многопроцессорная операционная система, основанная на POSIX и UNIX.
Ричард Филлипс Фейнман, американский физик-теоретик, один из основоположников квантовой электродинамики, отец нанотехнологий.
Аналогичного явления в данных нормальной категории нет.Марк Шесть,играЭти два слова, если использовать эти данные только для обучения, то эти два слова окажут большое влияние на то, относится ли предложение к категории азартных игр, ноиграСамо по себе это слово не имеет прямого отношения к азартным играм, но оно ошибочно классифицируется как слово, относящееся к категории азартных игр.
Мы предоставляем самые последние и наиболее полные крупномасштабные загрузки отдельных игр, загрузки мини-автономных игр и большое количество руководств по отдельным играм.
Этот тип приговора также, вероятно, будет рассматриваться как категория азартных игр, что не входило в наши первоначальные намерения. Итак, когда мы собираемся сделать классификатор азартных игр/обычный, нам нужно добавить к данным обучения обычного класса что-то вроде:
Первая в Китае станция игрового портала, постоянно обновляемая 365 дней в году, здесь вы можете получать профессиональные новости об играх и полные игровые стратегии.
такой нормальный и сиграпредложения с ключевыми словами. В целом нормальные предложения имеют гораздо более высокую вероятность появления, чем предложения в категории азартных игр.Это также может быть отражено в доле обучающих данных.Количество нормальных предложений можно увеличить, но будьте осторожны.Accuracy_paradoxПроблема. мы вконтрольная работаКогда , данные можно скорректировать с помощью матрицы путаницы и слов с наибольшим весом ошибочно классифицированных тестовых данных. Для простоты мы выбираем здесь только 4 предложения в качестве обучающих данных:
-
Категория азартных игр:
В зависимости от преимуществ, которые вы выбрали выше, вы должны заполнить 16-кратную или 15-кратную общую сумму (депозит + бонус на первый депозит) в казино, прежде чем вы сможете подать заявку на снятие средств.
Бонус будет зачислен на ваш счет после первого депозита. Ставки на спорт с живыми дилерами Добро пожаловать в новую игру Fantan!
-
Нормальная категория:
Ричард Филлипс Фейнман, американский физик-теоретик, один из основоположников квантовой электродинамики, отец нанотехнологий.
Под постоянным преобразованием органов общественной безопасности в лотерее и частной лотереи азартные игры пошли под землей от первоначального общественного и полугосударственного государства.
Сумка слов набор словной сумки
Чтобы вычислить вероятность каждого слова в разных категориях, вам сначала понадобится набор слов, который содержит все неповторяющиеся слова (_vocab_list) в обучающих данных, обратитесь к функции _vocab_list:
def _get_vocab_list(self):
'''
Get a list contain all unique non stop words belongs to train_data
Set up:
self.vocab_list:
[
'What', 'lovely', 'day',
'like', 'gamble', 'love', 'dog', 'sunkist'
]
'''
vocab_set = set()
all_train_data = ''.join([v for _, v in self._train_data])
token = Token(text=all_train_data, lan=self.lan, split=self.split)
vocab_set = vocab_set | set(token.tokenizer)
self._vocab_list = list(vocab_set)
Мы используемзаикание причастие, разделите предложения обучающих данных на наборы слов, такие как первые данные:
В зависимости от преимуществ, которые вы выбрали выше, вы должны заполнить 16-кратную или 15-кратную общую сумму (депозит + бонус на первый депозит) в казино, прежде чем вы сможете подать заявку на снятие средств.
После сегментации слов вы получите:
['根据', '您', '所', '选择', '的', '上述', '礼遇', ',', '您', '必须', '在', '娱乐场', '完成', '总金额', '(', '存款', '+', '首存', '奖金', ')', '16', '倍', '或', '15', '倍', '流水', '之后', ',', '方可', '申请', '提款', '。']
Затем удалите слова, содержащиеся в stop_word.dat, список stop_word содержит общие слова перехода на китайском языке, такие как
如果,但是,并且,不只
Эти слова бесполезны для нашего классификатора, так как они появятся в любой категории. После удаления слов длины равной 1 и слов в stop_word_lst остается первое предложение:
['选择', '上述', '礼遇', '娱乐场', '总金额', '存款', '首存', '奖金', '16', '15', '流水', '申请', '提款']
Пройдя 4 предложения, окончательный набор слов (vocab_list) длиной 49 будет следующим: (Используемый здесь набор неупорядочен, поэтому порядок результатов, которые вы получаете, может быть другим)
['提款', '存入', '游戏', '最初', '六合彩', '娱乐场', '费曼', '奖金', '账户', '菲利普斯', '量子', '电动力学', '总金额', '上述', '活动', '状态', '物理学家', '公安机关', '荷官', '即可', '理论', '申请', '半公开', '选择', '15', '打击', '全新', '来到', '公开', '方可', '博彩', '完成', '理查德', '纳米技术', '不断', '存款', '之一', '创始人', '真人', '私彩', '持续', '根据', '必须', '16', '赌博', '欢迎', '体育', '转入地下', '首存', '流水', '美国', '礼遇']
Получив набор слов, снова используйте обучающие данные и преобразуйте каждые обучающие данные в одномерный вектор длины 49.
def _get_vocab_matrix(self):
'''
Convert strings to vector depends on vocal_list
'''
array_list = []
for k, data in self._train_data:
return_vec = np.zeros(len(self._vocab_list))
token = Token(text=data, lan=self.lan, split=self.split)
for i in token.tokenizer:
if i in self._vocab_list:
return_vec[self._vocab_list.index(i)] += 1
array_list.append(return_vec)
self._matrix_lst = array_list
В зависимости от преимуществ, которые вы выбрали выше, вы должны заполнить 16-кратную или 15-кратную общую сумму (депозит + бонус на первый депозит) в казино, прежде чем вы сможете подать заявку на снятие средств.
Соответственно трансформируется в:
# 长度为49
[1, 0, 0, 0, 1, 0, ..., 1, 0, 1]
Среди них 1 соответствует тому, сколько раз слова после сегментации данных появляются в наборе слов. Затем объедините все векторы обучающих данных в список _matrix_list.
[
[1, 0, 0, 0, 1, 0, ..., 1, 0, 1]
[0, 1, 1, 0, 0, 0, ..., 0, 0, 0]
...
]
** Чтобы рассчитать вероятность того, что каждое слово находится в другой категории, просто разделите количество вхождений слова на общее количество слов в этой категории,cherryМатричные операции Numpy используются по соображениям эффективности.
def _training(self):
'''
Native bayes training
'''
self._ps_vector = []
# 防止有词语在其他类别训练数据中没有出现过,最后的P(句子|类别)乘积就会为零,所以给每个词语一个初始的非常小的出现概率,设置vector默认值为1,cal对应为2
# vector: 默认值为1的一维数组
# cal: 默认的分母,计算该类别所有有效词语的总数
# num: 计算P(赌博), P(句子)
vector_list = [{
'vector': np.ones(len(self._matrix_lst[0])),
'cal': 2.0, 'num': 0.0} for i in range(len(self.CLASSIFY))]
for k, v in enumerate(self.train_data):
vector_list[v[0]]['num'] += 1
# vector加上对应句子的词向量,最后把整个向量除于cal,就得到每个词语在该类别的概率。
# [1, 0, 0, 0, 1, 0, ..., 1, 0, 1] (根据您所选择的...)
# [0, 1, 1, 0, 0, 0, ..., 0, 0, 0] (奖金将在您完成...)
# +
# [1, 1, 1, 1, 1, 1, ..., 1, 1, 1]
vector_list[v[0]]['vector'] += self._matrix_lst[k]
vector_list[v[0]]['cal'] += sum(self._matrix_lst[k])
for i in range(len(self.CLASSIFY)):
# 每个词语的概率为[2, 2, 2, 1, 2, 1, ..., 2, 1, 2]/cal
self._ps_vector.append((
np.log(vector_list[i]['vector']/vector_list[i]['cal']),
np.log(vector_list[i]['num']/len(self.train_data))))
После прохождения всех обучающих данных будет получен вектор вероятности каждого слова, соответствующего двум категориям (чтобы предотвратить десятичное переполнение python, вероятность здесь представляет собой значение, полученное после логарифмирования np.log() ):
赌博
([-2.80336038, -2.80336038, -2.80336038, -3.49650756, -3.49650756,
-2.80336038, -3.49650756, -2.39789527, -2.80336038, -3.49650756,
-3.49650756, -3.49650756, -2.80336038, -2.80336038, -3.49650756,
-3.49650756, -3.49650756, -3.49650756, -2.80336038, -2.80336038,
-3.49650756, -2.80336038, -3.49650756, -2.80336038, -2.80336038,
-3.49650756, -2.80336038, -2.80336038, -3.49650756, -2.80336038,
-2.80336038, -2.39789527, -3.49650756, -3.49650756, -3.49650756,
-2.80336038, -3.49650756, -3.49650756, -2.80336038, -3.49650756,
-3.49650756, -2.80336038, -2.80336038, -2.80336038, -3.49650756,
-2.80336038, -2.80336038, -3.49650756, -2.39789527, -2.80336038,
-3.49650756, -2.80336038]), 0.5)
正常
([-3.25809654, -3.25809654, -3.25809654, -2.56494936, -2.56494936,
-3.25809654, -2.56494936, -3.25809654, -3.25809654, -2.56494936,
-2.56494936, -2.56494936, -3.25809654, -3.25809654, -2.56494936,
-2.56494936, -2.56494936, -2.56494936, -3.25809654, -3.25809654,
-2.56494936, -3.25809654, -2.56494936, -3.25809654, -3.25809654,
-2.56494936, -3.25809654, -3.25809654, -2.56494936, -3.25809654,
-3.25809654, -3.25809654, -2.56494936, -2.56494936, -2.56494936,
-3.25809654, -2.56494936, -2.56494936, -3.25809654, -2.56494936,
-2.56494936, -3.25809654, -3.25809654, -3.25809654, -2.56494936,
-3.25809654, -3.25809654, -2.56494936, -3.25809654, -3.25809654,
-2.56494936, -3.25809654]), 0.5)
词袋集合
['提款', '存入', '游戏', '最初', '六合彩', '娱乐场', '费曼', '奖金', '账户', '菲利普斯', '量子', '电动力学', '总金额', '上述', '活动', '状态', '物理学家', '公安机关', '荷官', '即可', '理论', '申请', '半公开', '选择', '15', '打击', '全新', '来到', '公开', '方可', '博彩', '完成', '理查德', '纳米技术', '不断', '存款', '之一', '创始人', '真人', '私彩', '持续', '根据', '必须', '16', '赌博', '欢迎', '体育', '转入地下', '首存', '流水', '美国', '礼遇']
Глядя на вектор и набор слов соответственно, вы можете видеть, чтоснятие,депозит,играВероятность того, что эти слова азартные, больше, чем нормальная вероятность
#赌博 提款,存入,游戏
[-2.80336038, -2.80336038, -2.80336038]
#正常 提款,存入,游戏
[-3.25809654, -3.25809654, -3.25809654]
Категория судебного решения Категория судебного решения
После обучения данных и получения соответствующей вероятности слова судить о категории очень просто.Вам нужно только выполнить ту же сегментацию слов на входном предложении, а затем вычислить произведение вероятностей, соответствующих соответствующим словам.Тот, у кого самый большой продукт, является наиболее вероятным классом. Например, предложение, которое мы хотим оценить:
欢迎参加澳门在线娱乐城,这里有体育,百家乐,六合彩各类精彩游戏。
Точно так же, в соответствии с исходным набором сумок слов, сначала преобразуйте его в одномерный вектор.
# 词袋集合
['提款', '存入', '游戏', '最初', '六合彩', '娱乐场', '费曼', '奖金', '账户', '菲利普斯', '量子', '电动力学', '总金额', '上述', '活动', '状态', '物理学家', '公安机关', '荷官', '即可', '理论', '申请', '半公开', '选择', '15', '打击', '全新', '来到', '公开', '方可', '博彩', '完成', '理查德', '纳米技术', '不断', '存款', '之一', '创始人', '真人', '私彩', '持续', '根据', '必须', '16', '赌博', '欢迎', '体育', '转入地下', '首存', '流水', '美国', '礼遇']
# 一维向量
[0, 0, 1, 0, 1, ...]
Затем умножьте, суммируйте, суммируйте и добавьте соответствующие категории соответственно.
P(赌博|句子) = sum([0, 0, 1, 0, 1, ...] * [-2.80336038, -2.80336038, -2.80336038, ...]) + P(赌博)
P(正常|句子) = sum([0, 0, 1, 0, 1, ...] * [-3.25809654, -3.25809654, -3.25809654, ...])+ P(正常)
最终得到P(赌博|句子) > P(正常|句子),所以分类器判断这个句子是赌博类别。
Соответствующий код:
def _bayes_classify(self):
'''
Calculate the probability of different category
'''
possibility_vector = []
log_list = []
# self._ps_vector: ([-3.44, -3.56, -2.90], 0.4)
for i in self._ps_vector:
# 计算每个词语对应概率的乘积
final_vector = i[0] * self.word_vec
# 获取对分类器影响度最大的词语
word_index = np.nonzero(final_vector)
non_zero_word = np.array(self._vocab_list)[word_index]
# non_zero_vector: [-7.3, -8]
non_zero_vector = final_vector[word_index]
possibility_vector.append(non_zero_vector)
log_list.append(sum(final_vector) + i[1])
possibility_array = np.array(possibility_vector)
max_val = max(log_list)
for i, j in enumerate(log_list):
# 输出最大概率的类别
if j == max_val:
max_array = possibility_array[i, :]
left_array = np.delete(possibility_array, i, 0)
sub_array = np.zeros(max_array.shape)
# 通过曼哈顿举例,计算影响度最大的词语
for k in left_array:
sub_array += max_array - k
return self._update_category(log_list), \
sorted(
list(zip(non_zero_word, sub_array)),
key=lambda x: x[1], reverse=True)
тестовый тест
статистический анализ статистический анализ
Чтобы классифицировать предложение, окончательный результат будет иметь 4 категории:
категория | значение |
---|---|
Истинный положительный результат (TP) | Входное предложение является категорией азартных игр, и классификатор оценивает его как категорию азартных игр. |
ложноположительный результат (FP) | Входное предложение является нормальной категорией, и классификатор оценивает его как категорию азартных игр. |
Истинный отрицательный результат (TN) | Входное предложение является нормальной категорией, и классификатор оценивает его как нормальную категорию. |
ложноотрицательный (FN) | Входное предложение относится к категории азартных игр, и классификатор оценивает его как обычную категорию. |
Общие методы тестирования включают задержку, k-кратную перекрестную проверку и начальную загрузку. Здесь мы используем метод удержания. Тестовый сценарий по умолчанию выбирает 60 образцов из всех данных каждый раз. В качестве тестовых данных используются предложения, а остальные используются в качестве обучающих данных. Испытание повторяют 10 раз. запустить тестовый скрипт
>>> python runanalysis.py
This may takes some time, Go get a coffee :D.
Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/md/0251yy51045d6nknpkbn6dc80000gn/T/jieba.cache
Loading model cost 0.914 seconds.
Prefix dict has been built succesfully.
+Cherry---------------+------------+------------+
| Confusion matrix | gamble.dat | normal.dat |
+---------------------+------------+------------+
| (Real)gamble.dat | 249 | 0 |
| (Real)normal.dat | 13 | 338 |
| Error rate is 2.17% | | |
+---------------------+------------+------------+
Средняя частота ошибок выходных тестовых данных классификации составляет 2,17%, и мы можем проанализировать классификатор с помощью матрицы путаницы:
-
Вспомнить (вероятность найти предложения в категории азартных игр)
Истинные положительные результаты/(истинные положительные результаты + ложноотрицательные результаты) 249/249 = 100%
-
Точность (вероятность того, что предложение, отнесенное к категории азартных игр, действительно относится к категории азартных игр)
Истинные положительные результаты / (истинные положительные результаты + ложные положительные результаты) 249 / (249 + 13) = 95%
Если бизнес-требование состоит в том, чтобы найти как можно больше потенциальных положительных данных (например, первичный скрининг рака), то требуется высокая скорость отзыва, но, соответственно, высокая скорость отзыва снизит уровень точности. (Можно понять, что если все предложения оцениваются как категории азартных игр, то все предложения, которые действительно являются категориями азартных игр, действительно обнаруживаются, но уровень точности становится очень низким.) Точка, влияющая на уровень припоминания и уровень точности, — это обучение. соотношение количества данных в ежедневных предложениях, отношение предложений в игровой категории к предложениям в обычной категории может быть 1:50. То есть, если предложение дается наугад, не глядя на содержание, это на 98% нормально. Однако в некоторых случаях, например, много пользователей размещают рекламу в популярной области комментариев, поэтому соотношение становится 1:10 или 1:20, которое корректируется в зависимости от конкретного бизнеса.Обучающие данные также должны следовать этому соотношению, но при реализации мы должны найти большое количество независимо распределенных данных, чтобы следовать этому соотношению, сохраняя при этом высокую точность и полноту.
Алгоритм анализа Алгоритм анализа
вес ошибки вес ошибки
Если обучающие данные слишком малы и входное предложение содержит слова, которых нет в модели набора мешков слов, соответствующую вероятность слова нельзя получить.Если некоторые слова являются нейтральными словами, но появляются только в определенной категории, тогда классификатор также будет думать, что слово является ключевым словом. Во время тестирования мы можем выводить неправильно классифицированные входные предложения и наблюдать, каким словам неправильно присваиваются высокие веса. Например:
data is 每周为你推荐好吃的零食,和各种美食评测!还有萌萌的黄教授为你试验各种食物流言和爱冒险的老船长带你脑洞大开,用汽车做料理!
--------------------
percentage is [('gamble.dat', 0.955), ('normal.dat', 0.045)]
--------------------
word_list is [('推荐', 2.458695507975194), ('各种', 2.3555233250262599), ('每周', 1.3600832193070849), ('冒险', 0.95461811119892026), ('评测', 0.95461811119892026), ('美食', -0.43167624992097053), ('好吃', -1.3479669817951256), ('汽车', -1.5302885385890796)]
В этих ошибочно классифицированных данных можно увидетьрекомендовать,разныеЭтим двум словам присваивается высокий вес для категории азартных игр, что противоречит нашему здравому смыслу, тогда мы можем добавить обучающие данные обычной категории, чтобы включитьрекомендовать,разныеДанные этих двух слов уменьшат вес, или мы можем использовать алгоритм Adaboost для динамической регулировки веса, эта функция будет добавлена позже.
контекстуальный контекст контекстуальный контекст
Когда мы вычисляем P(входное предложение|категория), мы делим входное предложение на наборы слов,При этом предполагается, что контекстуальная связь между словами во входном предложении отсутствует,На самом деле это не совсем правильно, например:
警方召开了全省集中打击赌博违法犯罪活动...
Судя по контексту предложений здравого смысла,сосредоточенная атакаПоявляться вазартные игрыПредыдущая вероятность, чемдержалПоявляться вазартные игрыВероятность высока и раньше, но когда мы делим входное предложение на наборы слов, относимся к ним так, как если бы каждое слово распределялось независимо. Вот почему этот алгоритм называется Наивным Байесом, если у нас есть большой набор данных, рассчитайтеЕсли каждое слово соответствует значению вероятности появления других слов в модели мешка слов, точность обнаружения может быть повышена.
Следует отметить, что выбор обучающих данных и данных, которые должны быть классифицированы в конце, должны быть максимально связаны.Если обнаруживаемое предложение сильно отличается от обучающих данных, например, обнаруженное содержимое содержит большой количество английских слов, но обучающих данных нет, то классификация не может выполнить правильную классификацию. В то же время, если входное предложение слишком короткое, классификатор не может его хорошо классифицировать. Потому что на результаты классификации легко может повлиять одно-два слова в ней.
Обход классификатора Обход классификатора
Классификатор не может отличить повторяющийся контент или части бессмысленного текста, введите предложение:
вишни вишни вишни вишни
{{{{{{{{{{{}}}}}}}}}}}
Присоединяйтесь к игре 121 и добавьте QQ, чтобы увидеть аватарку, это очень тепло к тексту здания либеральных искусств.Вы можете спросить меня, на что смотреть.Может быть, я дам вам послушать клиента, ах, это слишком любить видеть.
Первые два являются спамом, но даже если мы добавим набор данных спама, трудно судить правильно. Последний короткий абзац - это предложение категории азартных игр, а также длинная строка предложений, которые следуют, является бессмысленной или обычной категорией. Классификатор всесторонние судит, что это правильное предложение.Чтобы решить эту проблему, мы можем использовать простой метод вычисления энтропии предложения, то есть степени беспорядка.Каждое предложение имеет разумную длину и разумную степень беспорядка, что это значит? Длина предложения имеет нормальное распределение, и вероятность очень длинных (без знаков препинания) или очень коротких предложений относительно невелика, в то же время слова в предложении обычно не повторяются много раз, а степень его беспорядка находится в пределах определенного диапазона. Когда мы видим первые два предложения, поскольку повторение слов в них очень велико, степень беспорядка в предложении очень низкая Как рассчитать степень беспорядка в предложении?
-
Давайте найдем два входных предложения в качестве примеров и сначала разделим входные предложения на слова.
Чирайли очень милая кошка
вишни вишни вишни вишни
[车厘子,非常,可爱,猫咪] [车厘子,车厘子,车厘子,车厘子]
-
Подсчитайте количество вхождений каждого слова, деленное на количество слов в предложении:
P(вишня) = P(очень) = P(милый) = P(кошка) =1⁄4Р (вишня) =4⁄4 = 1
Вычислив формулу энтропии, введите каждое значение вероятности и, наконец, разделите на количество слов в предложении.
H = -sum(p(x)log2p(x)) H1 = ((1/4 * -2) - (1/4 * -2) - (1/4 * -2) - (1/4 * -2)) / 4= -2 / 4 = -1/2 H2 = 0
Видно, что при одинаковой длине предложения энтропия первого предложения равна -2, а второго 0. Можно задать диапазон энтропии, если он меньше этого значения, то это означает, что предложение может быть мусорные данные.
резюме резюме
Поняв принцип байесовской классификации, вы можете решить, какую функцию сегментации слов использовать и какое стоп-слово использовать в соответствии с вашими бизнес-потребностями, вы можете настроить набор данных, подходящий для вашего бизнеса, и в то же время, в соответствии с выводом, неправильно классифицированным. данные и матрица путаницы, внесите соответствующие коррективы.Если у вас есть какие-либо вопросы, пожалуйста, оставьте сообщение.