Персептрон на Python |
||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2019-03-02 20:17 Всем доброго времени суток. Сегодня разберём саму идею персептрона и улучшим его реализацию, приведенную в книге Себастьяна Рашки : "Python и машинное обучение". Подписываемся на телеграмм-канал, там есть и ожидается много чего интересного. Теория Сам алгоритм персептрона мы уже видели - это линейная функция, которая представляет собой взвешенную сумму коэффициентов. У нас уже была статья на эту тему, найти её можно по ссылке. Для тех, кому не хочется никуда переходить, вкратце расскажем. Формула линейной функции: y = w[0] * x[0] + w[1] * x[1] + .... w[p] * x[p] + b Здесь w[0 .. p] - коэффициенты(веса) модели, b - сдвиг, x[0..p] - входные данные. Обучаться наша модель будет на правиле обновления весов: ?w[i] = n*(y[i] - y^[i]) * x[i] Здесь: ?w[i] - изменение конкретного веса n - темп обучения(параметр, который принадлежит диапазону (0, 1)) y[i] - правильная метка класса y^[i] - метка, спрогнозированная моделью x[i] - входной признак Например, если наша модель выдает правильную метку, то изменение веса будет равняться: ?w[i] = 0*n*x[i] = 0. Возможно сейчас это выглядит сложно, но в программной реализации всё будет намного легче. Реализация Себастьяна Рашки и её улучшение Поскольку сейчас нам постоянно нужна будет работа с кодом, ссылку на файл оставляю здесь. Изначально класс модели выглядел так: Примечание. Если вы скачивали книгу в .pdf формате с моего телеграмм-канала, то не копируйте код оттуда, может возникнуть множество проблем. Массив errors_ будет хранить кол-во ошибочных классификаций на каждой итерации. Однако здесь можно заметить несколько улучшений, которые стоило бы реализовать. 1) Сделать проверку на значение eta в методе __init__(). 2) Реализовать проверку на то, прошла ли модель обучение. Атрибут будет представлять из себя булевое значение. 3) Если модель не прошла обучение, вызвать особое исключение. Реализация своего исключения до смеха проста: Получаем промежуточный результат: 4) Подогнать имена полей класса под интерфейс sklearn. В линейном классификаторе веса хранятся в атрибуте coef_, а сдвиг в поле intercept_. Действительно, я не вижу смысла хранить сдвиг в первом элементе массива, ведь получение среза это лишняя операция, и от неё надо избавляться. 5) Обычно мы используем для проверки правильности предсказаний модели метод score(). Реализуется он просто: создается массив предсказаний, вычисляется его "разница" с верными предсказаниями, и возвращается отношения кол-ва правильных ответов к общей длине наблюдений. 6) Т.к. тестировать мы будем нашу модель на стандартном наборе Iris, добавим возможность мультиклассовой классификации(в данном случае будем просто делить интервал на три решения). Итоговый результат: Примечание. В реализации Рашки были указаные docstrings к классу и методам. Для удобства они были удалены. Тестирование Проводить тестирование нашей модели мы будем параллельно с тестами линейного классификатора из sklearn. Для начала подготовим наши данные(стандартная ситуация, в объяснении, по моему мнению, не нуждается). Затем инициализируем множество экземпляром класса нашей модели с разными параметрами: Как мы видим, из представленных комбинаций гиперпараметров, лучшей связкой является темп обучение, который равен 0.1 и 15 итераций. Теперь проведём такой же "опыт" над линейным классификатором sklearn. Как мы видим, при увеличении параметра С точность модели растёт. Т.к. набор данных очень прост, не удивительно, что нам удалось достигнуть точности, равной единице. Однако нам удалось достигнуть точности в 94%, и это не предел! Тщательно подобрав параметры, можно получить точность намного выше. Мини-задание. Вы можете поэкспериментировать с параметрами персептрона и вычислить наилучшую комбинацию гиперпараметров. Визуализация Куда же без наших любимых графиков? Помните атрибут errors_ нашего класса? Давайте построим зависимость кол-ва ошибок модели на каждой итерации от кол-ва самих итераций. Здесь рядового пользователя могут смутить два момента: plt.xticks - устанавливает надписи над обозначенными значениями x. plt.grid - просто строит полупрозрачную сетку. Получаем такой график: Видим аномальное уменьшение кол-ва ошибок на второй итерации. Мини-задание. Попробуйте построить 9 таких же графиков для тех параметров, которые мы перебирали выше. Заключение Сегодня мы разобрали реализацию персептрона на языке Python и его тестирование. Вы также можете добавить в персептрон функцию активации, а также провести нормализацию данных, что непременно даст результат. По ходу статьи вы могли заметить мини-задания, выполнение которых даст вам большее понимание материала. Источник: m.vk.com Комментарии: |
|