Персептрон на Python

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


Всем доброго времени суток. Сегодня разберём саму идею персептрона и улучшим его реализацию, приведенную в книге Себастьяна Рашки : "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

Комментарии: