Главная Случайная страница


Полезное:

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


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






И пофантазируем

Немного обобщим

Вообще говоря, такие сверхспособности для алгоритма, который олицетворяет наш кусок кода, называются не просто обучением, а машинным обучением (machine learning). Обычно мы подразумеваем, что только нечто, наделенное интеллектом, способно обучаться. И, как неудивительно, дисциплина машинного обучения входит в куда более общую дисциплину искусственного интеллекта (artificial intelligence a.k.a. AI)


Как явствует из картинки, многие задачи AI основываются на алгоритмах машинного обучения. Остается только выбрать что-нибудь веселое и не менее весело решить.

И пофантазируем

Допустим тебя, %username%, наняли специалистом по машинному обучению в компанию, которая владеет сайтом IMDb. И говорят мол, вот хотим, чтобы аки у русских иванов на их Кинопоиске, рецензии пользователей помечались цветом зеленым али красным в зависимости от того позитивная или негативная рецензия. И тут вы как бы понимаете, что необходимо взять неприличных размеров базу с рецензиями и выдать на-гора алгоритм, который хорошенько обучится и все их множество разобьет на два непересекающихся подмножества (класса), да так, чтобы вероятность ошибки была минимальна.
Как и человек, наш алгоритм может учиться либо на своих ошибках (обучение без учителя, unsupervised learning), либо на чужом примере (обучение с учителем, supervised learning). Но, в данном случае, сам он различить позитив и негатив не может, т.к. его никогда не звали на вечеринки и он мало общался с другими людьми. Стало быть, нужно раздобыть выборку уже размеченных на классы рецензий (обучающую выборку), дабы осуществить обучение на готовых примерах (прецедентах).
Итого, мы хотим решить задачу анализа мнений (sentiment analysis), относящуюся к задачам обработки естественного языка (natural language processing), обучив некий классификатор, который для каждой новой рецензии будет говорить нам позитивная она или негативная. Теперь нужно выбрать классификатор и закодить все это дело.

В оправдание названия статьи

Вообще, в дикой природе водится огромное количество разных классификаторов. Самое простое, что мы могли бы здесь придумать — это отнести все статьи, например, к позитивным. Результат: обучаться не нужно, точность классификатора 50%, интересность 0%.
А вот если подумать… Как мы выбираем класс, к которому отнесем очередной объект? Мы выбираем его так, чтобы вероятность принадлежности объекта к этому классу была максимальна (капитан!), т.е.

где С это какой-то класс, а d — объект, в нашем случае это рецензия.
Таким образом, мы пытаемся максимизировать апостериорную вероятность принадлежности рецензии к позитивному или негативному классу.
Увидев условную вероятность, сразу напрашивается применить к ней теорему Байеса (с условными вероятностями вообще не так много чего можно сделать:)):

а т.к. мы это добро максимизируем и знаменатель от C не зависит, то можно далее рассматривать только числитель:


где P(d|C) — функция правдоподобия(ну уж так принято ее называть), P(C) — априорная вероятность. Итого задачу выбора класса можно представить в таком виде:

Вы, конечно, удивитесь, но классификаторы работающие по такому вот принципу максимизации апостериорной вероятности (Maximum a posteriori (MAP) estimation) называются байесовскими классификаторами (Bayes classifier). В определенных условиях, и это можно строго показать, байесовский классификатор является оптимальным, т.е. никакой другой классификатор его не превзойдет.
Все это классно, скажете вы, но откуда получать эти чудо-вероятности в реальной жизни? Ну с P(C) все просто: если у вас есть обучающая выборка, которая адекватно отображает распределение классов, можете оценить

где n — количество объектов, относящихся к классу С, N — размер выборки. С P(d|C) все чуть сложнее.
Для начала вспомним, что объектом классификации у нас является документ(рецензия), который в свою очередь состоит из каких-то слов. Тогда перепишем так:

где wi — i-ое слово в документе. Есть повод испугаться — восстановить по выборке такую вот n-мерную плотность задача совсем не тривиальная. Попробуем расписать еще, может что-то придет в голову. По определению условной вероятности:

Вот тут то мы и можем притвориться швабрами и сделать «наивное» предположением о том, что каждое отдельное слово независимо от других, т.е. слова рассыпаны в документе как попало (такая модель называется bag of words — мешок слов), тогда:

а уж восстановление n одномерных плотностей задача куда более простая, чем одной n-мерной. При этом по обучающей выборке можно оценить:

где m — количество слов w в классе С, М — количество слов(а точнее говоря, токенов) в классе С. Так мы получили:

а вот уже такой классификатор называется наивным байесовским (naive Bayes classifier).
Пару слов о валидности наивного предположения о независимости. Такое предположение редко бывает верным, в данном случае оно, например, явно неверно. Но, как показывает практика, наивные байесовские классификаторы показывают на удивление хорошие результаты во многих задачах, в том числе в тех, где предположение о независимости, строго говоря, не выполняется.
Достоинствами наивного байесовского классификатора являются нечувствительность к размерам обучающей выборки, высокая скорость обучения и устойчивость к так называемому переобучению (overfitting — явление, при котором алгоритм очень хорошо работает на тренировочной выборке и плохо на тестовой). Поэтому их применяют либо когда исходных данных очень мало, либо когда таких данных очень много, и на первое место выходит скорость обучения.Недостатки: не самая лучшая точность, особенно если нарушается предположение о независимости.


Developers, developers, developers


А теперь для тех кто уже отчаялся увидеть код. В качестве обучающей выборкивзята коллекция рецензий IMDb, подготовленная университетом Cornell.
Самые интересные методы add_example и classify. Первый, соответственно, занимается обучением, восстанавливая нужные плотности вероятностей, второй — применяет полученную модель.
Пара особенностей реализации. Т.к. вероятности могут быть числами весьма маленькими, а мы все равно занимаемся максимизацией, то можно без зазрения совести все прологарифмировать:

— это объясняет происходящее в classify.
Для наиболее полного использования имеющихся данных применена перекрестная проверка (k-fold cross-validation): имеющиеся в наличии данные разбиваются на k частей, затем на k−1 частях данных производится обучение модели, а оставшаяся часть данных используется для тестирования. Процедура повторяется k раз, в итоге каждая из k частей данных используется для тестирования. Результирующая эффективность классификатора вычисляется просто как среднее.

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


Реализованы два варианта обучения:

 

· на чистой выборке $pythonNaiveBayes.py <путь\до\обучающей\выборки>

· на выборке с отфильтрованными стоп-словами (часто встречающиеся слова, аля the, is и т.п.) $pythonNaiveBayes.py -f <путь\до\обучающей\выборки>


Что же из всего этого получилось?

$python NaiveBayes.py../data/imdb1
[INFO] Performing 10-fold cross-validation on data set:../data/imdb1
[INFO] Fold 0 Accuracy: 0.765000
[INFO] Fold 1 Accuracy: 0.825000
[INFO] Fold 2 Accuracy: 0.810000
[INFO] Fold 3 Accuracy: 0.800000
[INFO] Fold 4 Accuracy: 0.815000
[INFO] Fold 5 Accuracy: 0.810000
[INFO] Fold 6 Accuracy: 0.825000
[INFO] Fold 7 Accuracy: 0.825000
[INFO] Fold 8 Accuracy: 0.765000
[INFO] Fold 9 Accuracy: 0.820000
[INFO] Accuracy: 0.806000

$python NaiveBayes.py -f../data/imdb1
[INFO] Performing 10-fold cross-validation on data set:../data/imdb1
[INFO] Fold 0 Accuracy: 0.770000
[INFO] Fold 1 Accuracy: 0.815000
[INFO] Fold 2 Accuracy: 0.810000
[INFO] Fold 3 Accuracy: 0.825000
[INFO] Fold 4 Accuracy: 0.810000
[INFO] Fold 5 Accuracy: 0.800000
[INFO] Fold 6 Accuracy: 0.815000
[INFO] Fold 7 Accuracy: 0.830000
[INFO] Fold 8 Accuracy: 0.760000
[INFO] Fold 9 Accuracy: 0.815000
[INFO] Accuracy: 0.805000
Оставляю читателю на подумать, почему фильтрация стоп-слов так повлияла на результат (ну т.е. почему почти вообще никак не повлияла).

Заключение


Классификаторы, в том числе наивный байесовский, применяются во многих областях помимо анализа мнений: фильтрация спама, распознавание речи, кредитный скоринг, биометрическая идентификация и т.д.
Кроме наивного байесовского существует еще множество других классификаторов: перцептроны, деревья решений, классификаторы, основанные на методе опорных векторов(SVM), ядерные классификаторы (кernel сlassifiers) и т.д. А ведь кроме обучения с учителем есть еще обучение без учителя, обучение с подкреплением (reinforcement learning), обучение ранжированию (learning to rank) и многое другое… но это уже совсем другая история:)

Автор Станислав Ступников

 


<== предыдущая | следующая ==>
Супрематизм, конструктивизм (К. Малевич, В. Татлин, А. Родченко) | Глава 1. Снова отказ. Надоело. И что она только о себе думает?

Date: 2015-09-19; view: 309; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.008 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию