Использование правила Байеса для создания моделирования
Ну что ж, пора оставить в покое мои музыкальные вкусы и вернуться к проблеме твитов о мандрилах. Каждая запись для нас представляет набор слов, то есть мы разбиваем каждый твит на слова (часто называемые жетонами – token) пробелами и пунктуацией. Есть два класса твитов: о приложении – твиты о Mandrill.com, и другие – все остальные твиты.
Нам важны эти две вероятности:
р(приложение | слово1, слово2, слово3, …)
р(другое | слово1, слово2, слово3, …)
Это вероятность того, что твит либо о приложении, либо о чем-то другом, при том, что мы видим слова «слово1», «слово2», «слово3» и т. д.
Стандартное применение наивной байесовской модели классификатора – это создание нового документа на основе того, к какому классу вероятнее всего относятся твиты, если рассматриваются слова, из которых они состоят. Другими словами, если
р(приложение | слово1, слово2, слово3, …) > р(другое | слово1, слово2, слово3, …)
то данный твит – о Mandrill.com.
Правило, использованное для решения этой задачи – по которому выбирается наиболее вероятный класс, опираясь на слова, – известно как правило апостериорного максимума (МАР).
Но как же вычислить эти две вероятности? Первый шаг – использование правила Байеса. С помощью него можно переписать условную вероятность приложения как
р(приложение | слово1, слово2, слово3, …) = р(приложение) р(слово1, слово2, слово3, …| приложение) / р(слово1, слово2, слово3, …)
Точно так же
р(другое | слово1, слово2, слово3, …)= р(другое) р(слово1, слово2,
слово3, … | другое) / р(слово1, слово2, слово3, …)
Но, заметьте, у обоих этих вычислений в делителе
р(слово1, слово2, слово3, …)
Такая конфигурация – просто вероятность того, что эти слова вообще встретятся в документе. Так как эта величина не меняется от класса к классу, вы можете сократить на нее неравенство МАР, еще и при том, что вас интересует только наибольшее значение из
р(приложение) р(слово1, слово2, слово3, …)
р(другое) р(слово1, слово2, слово3, …)
Но как подсчитать вероятность наличия набора слов, зная, что эта запись – про приложение или, наоборот, о чем-то другом?
И тут все действительно начинает становиться идиотским!
Предположим, вероятности наличия этих слов в документах не зависят одна от другой. Тогда получаем
р(приложение) р(слово1, слово2, слово3, …| приложение) = р(приложение) р(слово1 | приложение) р(слово2 |приложение) р(слово3 | приложение)…
р(другое) р(слово1, слово2, слово3, …| другое) = р(другое) р(слово1|другое) р(слово2 | другое) р(слово3 | другое)…
Предположение о независимости позволяет разбить эту совместную условную вероятность набора слов при известном классе на вероятности нахождения каждого слова в данном классе.
И что же в этом идиотского? Да то, что слова в документе зависят друг от друга!
Если вы классифицируете спам и у вас в документе два слова – «эректильная» и «дисфункция» – то это значит
р(эректильная, дисфункция | спам) = р(эректильная | спам) р(дисфункция | спам)
Ну это же идиотизм, не так ли? Это наивность, потому что если бы я вам сказал, что у меня есть письмо-спам со словом «дисфункция» и предложил бы отгадать предшествующее ему слово, вы бы почти наверняка сказали «эректильная». Это зависимость, которая откровенно игнорируется.
Самое смешное, что, несмотря на широкое практическое применение, этот идиотизм никого не волнует. Это из-за того, что правилу МАР все равно, что вы правильно рассчитали вероятности своих классов. Для него имеет значение лишь то, какое из неправильно рассчитанных значений вероятности больше. Принимая слова как независимые, мы вносим в этот расчет множество ошибок, но, по крайней мере, эта небрежность повсеместна. Неравенства, используемые в правиле МАР, обычно проявляются так же, как если бы вы применяли разностороннее понимание лингвистики в модели.
Высококлассные вероятности часто считаются равными
Напомню, что в случае с приложением Mandrill мы хотим классифицировать твиты, основываясь на том, которая величина больше:
р(приложение) р(слово1, слово2, слово3, …| приложение) = р(приложение) р(слово1 | приложение) р(слово2 |приложение) р(слово3 | приложение)…
р(другое) р(слово1, слово2, слово3, …| другое) = р(другое) р(слово1|другое) р(слово2 | другое) р(слово3 | другое)…
Так какова же вероятность р(приложение) и р(другое)? Вы можете войти в Twitter и увидеть, что р(приложение) на самом деле около 20 %. 80 % записей, содержащих слово «mandrill», совсем о другом. Несмотря на то, что сейчас это верно, со временем все может измениться, и я бы предпочел огромное количество твитов, классифицированных как твиты о приложении (но на самом деле таковыми не являющихся – ложноположительных), отфильтровке нескольких релевантных (ложноотрицательных), так что я оцениваю свои шансы примерно 50/50. Вы постоянно будете встречать это предположение в наивном байесовском классификаторе в реальном мире, особенно в фильтрации спама, где процент спама в почте все время меняется и измерить его в глобальных масштабах довольно сложно.
Но если мы примем и р(приложение), и р(другое) за равные 50 %, то во время сравнения двух величин с помощью правила МАР вы можете просто не обращать на них внимания. Таким образом, классифицируйте твит как относящийся к приложению, если
р(приложение) р(слово1|приложение) р(слово2 |приложение) р(слово3 | приложение)… >= р(слово1|другое) р(слово2 |другое) р(слово3 | другое)…
Но как вычислить вероятность слова в классе? К примеру, рассмотрим такую вероятность:
р(«блестеть» | приложение)
Для этого нужно взять тренировочный набор твитов о приложении, разбить их на слова, подсчитать эти слова и найти процент слов, являющихся словом «блестеть». Почти наверняка это будет 0, потому что большинство твитов о мандрилах, содержащее слово «блестеть» относятся к видеоигре.
Остановитесь на секунду и подумайте об этом. Чтобы построить модель наивного байесовского классификатора, вам нужно лишь отследить частоту использования слов, связанных и не связанных с приложением, за промежуток времени. А это несложно!
Еще немного деталей классификатора
Перед началом работы с Excel нужно понять, что делать с двумя практическими препятствиями применения наивного Байеса в Excel или любом другом языке программирования:
• редкие слова;
• исчезновение порядка (антипереполнение).
Что делать с редкими словами
Первая проблема – это проблема редких слов. Что, если в записи, которую вы собрались классифицировать, есть слово «Тубал-Каин»? Основываясь на данных из тренировочного набора, можно сделать вывод, что ни в одном из классов такого слова нет. Место, где такое часто происходит в твиттере – это сокращенные адреса страниц, так как каждая новая ссылка, помещенная в Twitter, должна иметь новый код, никогда не использованный ранее.
Вы можете предположить:
р(«Тубал-Каин» | приложение) = 0
Но тогда вы получите:
р(«Тубал-Каин» | приложение) р(слово2 | другое) р(слово3 | другое)… = 0
Тубал-Каин эффективно обнуляет все вычисление вероятности.
Предположим, что вы все же встречали слово «Тубал-Каин» однажды. Можно поступить так со всеми редкими словами.
Но постойте – это же несправедливо по отношению к словам, которые вам действительно однажды встречались! Ну ладно, прибавьте и к ним 1.
Но тогда это несправедливо для слов, которые встретились вам дважды. Ладно, добавьте 1 на каждый счет.
Это называется дополнительным сглаживанием и часто используется для приспособления неведомых ранее слов к модели наборов слов (bag of words).
Что делать с исчезновением порядка
Теперь, когда мы разобрались с редкими словами, перейдем к следующей проблеме – исчезновения порядка.
Многие из встречаемых слов – редкие, поэтому в итоге получаются очень маленькие вероятности. В нашем случае большинство слов имеет вероятности менее 0,001. И из-за предположения о независимости приходится еще и перемножать эти ничтожные вероятности друг с другом.
Что, если у вас есть запись из 15 слов, вероятность каждого из которых меньше 0,001? В итоге в неравенстве МАР вы получите микроскопическое значение вроде 1 × 10–45. На самом деле Excel вполне способен обработать настолько малую величину. Он начинает спотыкаться только на сотне-другой нулей после запятой. Так что для классификации твитов такая величина вполне может сойти. Но для более объемных документов (например, писем, новостных статей) маленькие величины могут нанести серьезный ущерб вычислениям.
Просто чтобы больше не думать об этом, давайте поищем способ не делать умножение в МАР напрямую:
р(слово1|приложение) р(слово2 |приложение) … >= р(слово1|другое) р(слово2 |другое) …
Эту проблему можно решить, используя функцию логарифма (натуральный логарифм в Excel задается формулой LN).
Вот вам забавный факт из математики. Допустим, у вас есть произведение:
0,2 × 0,8
Если вы прологарифмируете его, будет верно следующее:
ln(0,2 × 0,8) = ln(0,2) + ln(0,8)
Вычисляя натуральный логарифм любого числа между 0 и 1, вместо мизерного значения с кучей нулей после запятой вы получаете четкое отрицательное число. Так что вы можете взять натуральный логарифм от каждой вероятности и сложить их, чтобы получить максимум для последующего сравнения. Это дает значение, на которое не будет ругаться компьютер.
Если вы немного растерялись, не волнуйтесь. В Excel все станет ясно и понятно.