Вы находитесь на странице: 1из 72

Санкт-Петербургский политехнический университет

Петра Великого
Институт компьютерных наук и технологий
Высшая школа программной инженерии

Работа допущена к защите


И. О. директора ВШПИ
П.Д. Дробинцев
« » 2017 г.

ВЫПУСКНАЯ РАБОТА БАКАЛАВРА


Тема: "Разработка системы анализа данных и прогнозирования
результатов заездов на ипподроме "

Направление: 09.03.01 – Информатика и вычислительная техника

Выполнил студент гр. 23504/30 Топоров А. И.

Руководитель
старший преподаватель Коликова Т. В.

Санкт-Петербург

2017
САНКТ-ПЕТЕРБУРГСКИЙ ПОЛИТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ ПЕТРА ВЕЛИКОГО
Институт компьютерных наук и технологий
Высшая школа программной инженерии
Утверждаю

И. О. директора ВШПИ

П. Д. Дробинцев

« » 2017г

ЗАДАНИЕ

к работе на соискание степени бакалавра

студенту группы 23504/30 Топорову Артему Игоревичу

1. Тема проекта
Разработка системы анализа данных и прогнозирования
результатов заездов на ипподроме
2. Срок сдачи студентом оконченного проекта
3. Исходные данные к проекту
Языки программирования: Python
Средства разработки: IDLEX (Python IDE)
Целевая платформа: Microsoft Windows, Linux
4. Содержание расчетно-пояснительной записки
4.1. Обоснование актуальности
4.2. Проектирование архитектуры нейронной сети
4.3. Программная реализация приложения для сбора данных
(web-scrapper)
4.4. Программная реализация обучения и тестирования
нейронной сети на основе собранных данных
4.5. Программная реализация приложения прогнозирования
результатов зазедов
4.6. Проверка работоспособности разработанной системы в
целом на основе тесовых данных
5. Перечень графического материала (с точным указанием
обязательных чертежей)
6. Консультанты по проекту (с указанием относящихся к ним
разделов проекта)
7. Дата выдачи задания ____________
Руководитель старший преподаватель ВШПИ Коликова
Татьяна Всеволодовна
Задание принял к исполнению (дата)

Подпись студента
Реферат
С. 73. Рис. 21. Табл. 5.
В данной работе реализована система, позволяющее
прогнозировать результаты скачек на ипподроме. Система
состоит из четырех основных частей: сборщика данных,
конвертора данных, искусственной нейронной сети и
пользовательского приложения.
Пользователь может отслеживать прогнозы результатов
заездов посредством приложения на персональном компьютере,
а также переобучать нейронную сеть на новых данных.
Оглавление
Введение ............................................................................................ 7
1. Анализ предметной области ........................................................ 9
1.1. Скачки ..........................................................................................................9
1.2. Искусственная нейронная сеть.................................................................11
1.3. Классификация нейронных сетей ............................................................21
1.4. Цели и задачи .............................................................................................24
2. Проектирование системы приложений ..................................... 24
2.1. Выбор данных для прогнозирования .......................................................26
2.2. Подготовка данных для обучения нейронной сети ................................27
2.3. Обучение нейронной сети ........................................................................27
2.4. Интерфейс ..................................................................................................30
2.3. Общая структура приложения..................................................................30
3. Разработка системы приложений .............................................. 32
3.1. Сбор данных ..............................................................................................32
3.2. Преобразование данных ...........................................................................42
3.3. Нормализация данных ..............................................................................44
3.4. Обучение и тестирование нейронной сети..............................................52
3.5. Интерфейс пользовательского приложения ............................................65
Заключение ...................................................................................... 72
Список литературы ......................................................................... 73

5
Введение
Формирование коэффициентов во всех букмекерских
конторах происходит с учётом двух основных факторов –
вероятности исхода события и маржи букмекерской конторы. Что
касается первого фактора, с ним всё очевидно — коэффициенты
имеют обратную зависимость от вероятности. То есть чем более
вероятный исход, тем ниже на него коэффициент, и наоборот. В
случае фаворита и аутсайдера встречи более высокий
коэффициент всегда на аутсайдера, а более низкий – на фаворита.
По ходу события коэффициенты меняются по тем же принципам.
Чем вероятнее будет становиться исход события, тем ниже будет
опускать коэффициент букмекерская контора.
Ещё одним очень важным фактором, оказывающим влияние на
формирование коэффициентов, является маржа букмекерской
конторы. Маржа – это процент, который берёт себе букмекерская
контора. Другими словами, это чистый заработок БК, который не
зависит от исхода события: выиграл игрок или проиграл.
Поставив на тот или иной коэффициент, считайте, что Вы уже
заплатили маржу букмекерской конторе, так как маржа учтена
именно в нём.
Число различных исходов для события, имеет большое
значение в определении окончательного размера маржи. Если
есть много вариантов, дисбаланс в распределении ставок будет

7
больше. Когда на практике распределение отклоняется от
теоретического, более сбалансированного, то риск для
букмекерской конторы выше. Все это, приводит к более высоким
процентам маржи.
Для получения максимальной прибыли, необходимо как
можно точнее предсказать результат заезда.
Существует два основных метода прогнозирования.
экспертные методы прогнозирования.
Самый распространенный метод из группы экспертных методов
— метод Дельфи. Суть метода заключается в сборе мнений
различных экспертов и их обобщение в единую оценку.
Методы теории вероятности и статистики основываются на
результатах прошлых матчей.
Прогнозирование временных рядов с помощью нейронных
сетей позволяет объединить оба метода и найти закономерности
множества любых факторов, связанных с объектом
исследования.

8
1. Анализ предметной области.
1.1. Скачки
Лошадиные скачки (Horse Races) это состязание лошадей на
скорость и время. В русском языке часто можно встретить
определение конным скачкам как спорт. Но лошадиные скачки и
конный спорт – это совершенно разные вещи. За рубежом скачки
никогда не называют спортом, а просто говорят – гонки (Races).

В России и большей части СНГ скачки долгое время были


запрещены, так как попадали под закон об азартных играх.
Сегодня скачки называют гонками, играми, спортом и, наверное,
это связано с уровнем связи со скачками. Для кого-то это будет
игра, для кого-то работа, для кого-то спорт.
Самую большую популярность этот вид игрового бизнеса
приобрел в Великобритании. Даже сейчас в Англии ежегодный
оборот денег, прошедших через букмекерские конторы на
ипподромах, составляет 15 млрд долларов. Охота на лошадях и
спорт всегда были самым любим развлечением англичан, а
скачки лошадей просто возведены в ранг культа. В современном
мире у любителей конных скачек появилось много
последователей в Европе и по всему миру. Германия, Франция,
Канада, Бразилия, Аргентина, а также Япония, Австралия и
Новая Зеландия проводят международные состязания на своих

9
ипподромах. В России также увеличивается интерес к конному
спорту.
В скачках принимают участие специально выращенные и
обученные чистокровные породы верховых лошадей. В
рысистых бегах с упряжкой участвуют породы рысаков. Но у
каждой лошади есть свои возможности и таланты. Для создания
равных возможностей в скачках им создают специальные
условия с помощью дополнительной весовой нагрузки.
Скачки проводят на короткие спринтерские дистанции, от 5
фарлонгов, и на длинные, стайерские – более, чем на 4,5 мили.
Миля (mile), сокращённо обозначается, как «m», а фарлонг
(furlong) – буквой «f». 1 фарлонг равен 1/8 части мили или 220
ярдов, что составляет чуть больше 200 м.
Результат, с которым лошадь придёт к финишу, во многом
зависит от её спортивной гоночной формы. Понятие «Форма
лошади» — довольно ёмкое. Оно включает в себя много
показателей, среди которых есть: вес лошади, результаты
предыдущих гонок, время, прошедшее с предыдущих скачек, вид
забега, покрытия скаковой дорожки, дистанции прошлых скачек
и многие другие данные.

10
1.2. Искусственная нейронная сеть
Нейронная сеть — это последовательность нейронов,
соединенных между собой синапсами. Структура нейронной сети
пришла в мир программирования прямиком из биологии.
Благодаря такой структуре, машина обретает способность
анализировать и даже запоминать различную информацию.
Нейронные сети также способны не только анализировать
входящую информацию, но и воспроизводить ее из своей памяти.
Другими словами, нейросеть это машинная интерпретация мозга
человека, в котором находятся миллионы нейронов, передающих
информацию в виде электрических импульсов.
Нейронные сети используются для решения сложных задач,
которые требуют аналитических вычислений подобных тем, что
делает человеческий мозг. Самыми распространенными
применениями нейронных сетей является:
Классификация — распределение данных по параметрам.
Например, на вход дается набор людей и нужно решить, кому из
них давать кредит, а кому нет. Эту работу может сделать
нейронная сеть, анализируя такую информацию как: возраст,
платежеспособность, кредитная история и тд.
Предсказание — возможность предсказывать следующий
шаг. Например, рост или падение акций, основываясь на
ситуации на фондовом рынке.

11
Распознавание — в настоящее время, самое широкое
применение нейронных сетей. Используется в Google, когда вы
ищете фото или в камерах телефонов, когда оно определяет
положение вашего лица и выделяет его и многое другое.
Что такое нейрон?

Рис. 1 Искусственная нейронная сеть

Нейрон — это вычислительная единица, которая получает


информацию, производит над ней простые вычисления и
передает ее дальше. Они делятся на три основных типа: входной

12
(синий), скрытый (красный) и выходной (зеленый). Также есть
нейрон смещения и контекстный нейрон о которых мы
поговорим в следующей статье. В том случае, когда нейросеть
состоит из большого количества нейронов, вводят термин слоя.
Соответственно, есть входной слой, который получает
информацию, n скрытых слоев (обычно их не больше 3), которые
ее обрабатывают и выходной слой, который выводит результат.
У каждого из нейронов есть 2 основных параметра: входные
данные (input data) и выходные данные (output data). В случае
входного нейрона: input=output. В остальных, в поле input
попадает суммарная информация всех нейронов с предыдущего
слоя, после чего, она нормализуется, с помощью функции
активации (пока что просто представим ее f(x)) и попадает в поле
output.

13
Рис. 2 Искусственный нейрон

Важно помнить, что нейроны оперируют числами в диапазоне


[0,1] или [-1,1]. А как же, вы спросите, тогда обрабатывать числа,
которые выходят из данного диапазона? На данном этапе, самый
простой ответ — это разделить 1 на это число. Этот процесс
называется нормализацией, и он очень часто используется в
нейронных сетях. Подробнее об этом чуть позже.

14
Синапс.

Рис. 3 Связи между нейронами

Синапс — это связь между двумя нейронами. У синапсов есть


1 параметр — вес. Благодаря ему, входная информация
изменяется, когда передается от одного нейрона к другому.
Допустим, есть 3 нейрона, которые передают информацию
следующему. Тогда у нас есть 3 веса, соответствующие каждому
из этих нейронов. У того нейрона, у которого вес будет больше,
та информация и будет доминирующей в следующем нейроне
(пример — смешение цветов). На самом деле, совокупность весов
нейронной сети или матрица весов — это своеобразный мозг всей

15
системы. Именно благодаря этим весам, входная информация
обрабатывается и превращается в результат.
Важно помнить, что во время инициализации нейронной сети,
веса расставляются в случайном порядке.

Как работает нейронная сеть?

Рис. 4 Расчет выходной информации

16
В данном примере изображена часть нейронной сети, где
буквами I обозначены входные нейроны, буквой H — скрытый
нейрон, а буквой w — веса. Из формулы видно, что входная
информация — это сумма всех входных данных, умноженных на
соответствующие им веса. Тогда дадим на вход 1 и 0. Пусть
w1=0.4 и w2 = 0.7 Входные данные нейрона Н1 будут
следующими: 1*0.4+0*0.7=0.4. Теперь, когда у нас есть входные
данные, мы можем получить выходные данные, подставив
входное значение в функцию активации (подробнее о ней далее).
Теперь, когда у нас есть выходные данные, мы передаем их
дальше. И так, мы повторяем для всех слоев, пока не дойдем до
выходного нейрона. Запустив такую сеть в первый раз, мы
увидим, что ответ далек от правильно, потому что сеть не
натренирована. Чтобы улучшить результаты мы будем ее
тренировать. Но прежде чем узнать, как это делать, давайте
введем несколько терминов и свойств нейронной сети.
Итак, приведем некоторые преимущества и достоинства
нейронных сетей перед традиционными вычислительными
системами.
1. Решение задач при неизвестных закономерностях
Используя способность обучения на множестве примеров,
нейронная сеть способная решать задачи, в которых неизвестны

17
закономерности развития ситуации и зависимости между
входными и выходными данными. Традиционные
математические методы и экспертные системы в таких случаях
пасуют.
2. Устойчивость к шумам во входных данных
Возможность работы при наличии большого числа
неинформативных, шумовых входных сигналов. Нет
необходимости делать их предварительный отсев, нейронная сеть
сама определит их малопригодность для решения задачи и
отбросит их.
3. Адаптирование к изменениям окружающей среды
Нейронные сети обладают способностью адаптироваться к
изменениям окружающей среды. В частности, нейронные сети,
обученные действовать в определенной среде, могут быть легко
переучены для работы в условиях незначительных колебаний
параметров среды. Более того, для работы в нестационарной
среде (где статистика изменяется с течением времени) могут быть
созданы нейронные сети, переучивающиеся в реальном времени.
Чем выше адаптивные способности системы, тем более
устойчивой будет ее работа в нестационарной среде. При этом
следует заметить, что адаптивность не всегда ведет к
устойчивости; иногда она приводит к совершенно
противоположному результату. Например, адаптивная система с

18
параметрами, быстро изменяющимися во времени, может также
быстро реагировать и на посторонние возбуждения, что вызовет
потерю производительности. Для того чтобы использовать все
достоинства адаптивности, основные параметры системы
должны быть достаточно стабильными, чтобы можно было не
учитывать внешние помехи, и достаточно гибкими, чтобы
обеспечить реакцию на существенные изменения среды.
4. Потенциальное сверхвысокое быстродействие
Нейронные сети обладают потенциальным сверхвысоким
быстродействием за счет использования массового параллелизма
обработки информации.
5. Отказоустойчивость при аппаратной реализации нейронной
сети
Нейронные сети потенциально отказоустойчивы. Это значит,
что при неблагоприятных условиях их производительность
падает незначительно. Например, если поврежден какой-то
нейрон или его связи, извлечение запомненной информации
затрудняется. Однако, принимая в расчет распределенный
характер хранения информации в нейронной сети, можно
утверждать, что только серьезные повреждения структуры
нейронной сети существенно повлияют на ее работоспособность.
Поэтому снижение качества работы нейронной сети происходит
медленно.

19
Итак, рассмотрим некоторые свойства нейронных сетей.
1. Обучение
Искусственные нейронные сети могут менять свое поведение
в зависимости от внешней среды. Этот фактор в большей
степени, чем любой другой, ответствен за тот интерес, который
они вызывают. После предъявления входных сигналов
(возможно, вместе с требуемыми выходами) они
самонастраиваются, чтобы обеспечивать требуемую реакцию.
Было разработано множество обучающих алгоритмов, каждый со
своими сильными и слабыми сторонами. Все еще существуют
проблемы относительно того, чему сеть может обучиться и как
обучение должно проводиться.
2. Обобщение
Отклик сети после обучения может быть до некоторой степени
нечувствителен к небольшим изменениям входных сигналов. Эта
внутренне присущая способность видеть образ сквозь шум и
искажения жизненно важна для распознавания образов в
реальном мире. Она позволяет преодолеть требование строгой
точности, предъявляемое обычным компьютером, и открывает
путь к системе, которая может иметь дело с тем несовершенным
миром, в котором мы живем. Важно отметить, что искусственная
нейронная сеть делает обобщения автоматически благодаря
своей структуре, а не с помощью использования «человеческого

20
интеллекта» в форме специально написанных компьютерных
программ.
3. Абстрагирование
Некоторые из искусственных нейронных сетей обладают
способностью извлекать сущность из входных сигналов.
Например, сеть может быть обучена на последовательности
искаженных версий буквы «А». После соответствующего
обучения предъявление такого искаженного примера приведет к
тому, что сеть породит букву совершенной формы (в данном
случае букву «А»). В некотором смысле она научится порождать
то, что никогда не видела. Способность извлекать идеальные
прототипы является у людей весьма ценным качеством.
4. Применимость
Искусственные нейронные сети не являются панацеей. Они,
очевидно, не годятся для выполнения таких задач, как
начисление заработной платы, однако они незаменимы в
большом классе других задач, с которыми плохо или вообще не
справляются обычные вычислительные системы.

1.3. Классификация нейронных сетей


Можно провести следующую классификацию нейронных
сетей:

21
Рис. 5 Классификация нейронных сетей

22
Характер обучения
Классификация нейронных сетей по характеру обучения делит
их на:
нейронные сети, использующие обучение с учителем;
нейронные сети, использующие обучение без учителя.
Рассмотрим это подробнее.
Нейронные сети, использующие обучение с учителем.
Обучение с учителем предполагает, что для каждого входного
вектора существует целевой вектор, представляющий собой
требуемый выход. Вместе они называются обучающей парой.
Обычно сеть обучается на некотором числе таких обучающих
пар. Предъявляется выходной вектор, вычисляется выход сети и
сравнивается с соответствующим целевым вектором. Далее веса
изменяются в соответствии с алгоритмом, стремящимся
минимизировать ошибку. Векторы обучающего множества
предъявляются последовательно, вычисляются ошибки и веса
подстраиваются для каждого вектора до тех пор, пока ошибка по
всему обучающему массиву не достигнет приемлемого уровня.
Нейронные сети, использующие обучение без учителя.
Обучение без учителя является намного более правдоподобной
моделью обучения с точки зрения биологических корней
искусственных нейронных сетей. Развитая Кохоненом и многими
другими, она не нуждается в целевом векторе для выходов и,

23
следовательно, не требует сравнения с предопределенными
идеальными ответами. Обучающее множество состоит лишь из
входных векторов. Обучающий алгоритм подстраивает веса сети
так, чтобы получались согласованные выходные векторы, т. е.
чтобы предъявление достаточно близких входных векторов
давало одинаковые выходы. Процесс обучения, следовательно,
выделяет статистические свойства обучающего множества и
группирует сходные векторы в классы.
Настройка весов.
сети с фиксированными связями – весовые коэффициенты
нейронной сети выбираются сразу, исходя из условий задачи;
сети с динамическими связями – для них в процессе обучения
происходит настройка синаптических весов.
Тип входной информации:
аналоговая – входная информация представлена в форме
действительных чисел;
двоичная – вся входная информация в таких сетях
представляется в виде нулей и единиц.

1.4. Цели и задачи


В общем случае, задача прогнозирования временных рядов с
помощью ИНС сводится к следующей последовательности
этапов:

24
 сбор данных для обучения (этап, считающийся одним из
наиболее сложных);
 подготовка и нормализация данных (приведение к виду ВР);
 выбор топологии ИНС (на этом этапе принимается решение о
количестве слоев и наличии обратной связи);
 эмпирический (путем эксперимента) подбор характеристик
ИНС;
 эмпирический подбор параметров обучения;
 обучение ИНС;
 проверка обучения на адекватность поставленной задаче;
 корректировка параметров с учетом предыдущего шага,
окончательное обучение;
 вербализация ИНС (минимизированное описание с
использованием нескольких алгебраических или логических
функций) с целью дальнейшего использования.

25
2. Проектирование системы приложений
2.1. Выбор данных для прогнозирования
Для анализа скачек необходима любая информация хотя бы
косвенно связанная со скачками.

Было проанализировано множество сайтов с информацией о


результатах скачек. В результате был выбран сайт с наиболее
емкой информацией https://www.racingpost.com/.

Рис. 6 Стартовая страницы сайта racingpost.com

Сайт предоставляет информацию о:

- именах лошадей;

26
- именах жокеев;

- именах тренеров;

- рейтинге лошадей;

- стране в которой происходят скачки;

- названии трека;

- стране лошади;

- рейтинге лошади.

Сайт предоставляет информацию о скачках начиная с 1988г.

2.2. Подготовка данных для обучения нейронной сети

При подготовке данных для обучения нейронной сети


необходимо обращать внимание на следующие существенные
моменты.

Количество наблюдений в наборе данных. Следует учитывать


тот фактор, что чем больше размерность данных, тем больше
времени потребуется для обучения сети.

27
Работа с выбросами. Следует определить наличие выбросов и
оценить необходимость их присутствия в выборке.

Обучающая выборка должна быть представительной


(репрезентативной).

Обучающая выборка не должна содержать противоречий, так


как нейронная сеть однозначно сопоставляет выходные
значения входным.

Нейронная сеть работает только с числовыми входными


данными, поэтому важным этапом при подготовке данных
является преобразование и кодирование данных.

При использовании на вход нейронной сети следует подавать


значения из того диапазона, на котором она обучалась.
Например, если при обучении нейронной сети на один из ее
входов подавались значения от 0 до 10, то при ее применении на
вход следует подавать значения из этого же диапазона или
близлежащие.

Существует понятие нормализации данных. Целью


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

28
значения должны быть распределены в определенном
диапазоне.

Достоинствами этого метода является в первую очередь слабая


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

2.3. Выбор параметров обучение нейронной сети


Необходимо подобрать оптимальные параметры для наилучшего
обучения нейронной сети:

-типы слоев сети;


- количество нейронов в каждом слое;
- количество эпох обучения;
- размер выборки (количества строк) после которого
меняются веса;
- значения dropout ( “метод исключения”);
- алгоритм оптимизации.
После обучения нейронной сети, необходимо проверить качество
прогнозирования результатов скачек.

29
Если результаты не устроят, обучить нейронную сеть на большей
или меньшей выборке, изменить архитектуру нейронной сети.

2.4. Интерфейс
После корректного обучения нейронной сети, необходимо
создать приложение, для удобства работы пользователя.

Приложение позволит выбирать предстоящие заезды и


прогнозировать их результаты. А также обновлять базу данных
новыми результатами заездов и переобучать на них ИНС.

2.5. Общая структура приложения

Рис. 7 Структурная схема приложения

30
Исходное приложение уже будет содержать данные о скачках за
последние 5 лет и обученную на них нейронную сеть.

Новая информация будет поступать с сайта и выводиться в


приложении, а также поступать на нейронную сеть через
конвертор для последующего прогнозирования.

31
3. Разработка системы приложений
3.1. Сбор данных
Сайт racingpost.com предоставляет все необходимые
данные для прогнозирования, но их необходимо собрать в
структурированную таблицу.
Для этого потребуется:

 выгрузить и сохранить html-страницы


 распарсить html в удобный для дальнейшего анализа
формат (csv, json, pandas dataframe etc.)

Для выгрузки страниц воспользуемся библиотекой


requests для HTTP запросов и ответов, так же необходимо
указать данные User Agent.

User Agent — это клиентское приложение, использующее


определённый сетевой протокол. Термин обычно используется
для приложений, осуществляющих доступ к веб-сайтам, таким
как браузеры, поисковые роботы , мобильные телефоны и
другие устройства.

Для парсинга воспользуемся библиотекой Beautiful Soup.

32
Beautiful Soup - это библиотека для синтаксического разбора
файлов HTML/XML, написанный на языке программирования
Python, который может преобразовать даже неправильную
разметку в дерево синтаксического разбора. Он поддерживает
простые и естественные способы навигации, поиска и
модификации дерева синтаксического разбора. В большинстве
случаев он поможет программисту сэкономить часы и дни
работы.

Встречающиеся проблемы при сборе данных.

Исключение. Есть части веб-сайта, которые вы не хотите


обходить. Либо потому что вам не интересно, или потому что вы
хотите быть хорошим посетителем и соблюдать описанное в
файле robots.txt. robots.txt это файл, описывающий предпочтения
владельца сайта относительно того, какие роботы могут
посещать какие области сайта.

Глубина - на какое количество кликов от стартовой страницы вы


хотите погрузиться?

Одновременная загрузка - с одной стороны, скачивание страниц


одной за другой может занять много времени. С другой
стороны, скачивание 100 страниц одновременно может привести
к вашей блокировке на сайте. Вам нужно найти верный баланс.

Пауза между страницами для облегчения нагрузки, что мы


генерируем на сервере - мы можем захотеть сделать паузу
между скачиванием страниц с одного и того же сервера.

33
Стартовые страницы Какой-то способ описать больше одной
стартовой страницы.

Циклы Избежание повторяющихся загрузок одних и тех же


страниц.

Условия использования некоторые веб-сайты могут иметь


официальные документы, описывающие, что вы уполномочены
скачивать и что вы можете с этим потом делать. К примеру,
показ аналогичного контента на другом сайте, как это было на
оригинальном сайте, обычно не то, что вам стоит делать.

Чтобы получить html страницы с информацией о заездах


необходимо знать ссылки на все страницы нужных нам дат.

Во время сбора данных сайт обновлялся, в результате


чего изменились разметки страниц и ссылки на них, поэтому
было написано два парсера.

До обновления сайта ссылка имела вид:

http://www.racingpost.com/horses/result_home.sd?race_id=667339

и отличалась только по идентификатору “race_id”.

Парсинг страниц результатов происходил в цикле,


соответственно необходимо было обозначить границы цикла.
Так же необходимо было предусмотреть то, что на сайте будут

34
постоянно появляться новые результаты и их надо будет
подгружать в таблицу.

Сайт www.racingpost.com предоставляет информацию о заездах


начиная с 1988 года, но так как сбор данных занимает довольно
много времени и информация о более старых заездах не
полноценна и возможно уже не актуальна, сбор данных будет
начинаться с результатов 2012 года.

Ссылку на информацию о первом заезде 2012 года можно найти,


воспользовавшись календарем на сайте. Таким образом,
известна первая ссылка для варианта первичного сбора данных.

Для варианта добавления новых данных берется id последней


строки в таблице и увеличивается на единицу.

Для получения последнего id в цикле, сгенерирована ссылка с


помощью текущей даты, тем самым можно получить html код
страницы с результатами за сегодняшний день, в котором
имеется ссылка на информацию о последнем заезде.

Получив первый и последний id можно сгенерировать все


ссылки на результаты за нужный нам период.

После обновления сайта ссылка на информацию о заезде имеет


вид:

35
https://www.racingpost.com/results/38/newmarket/2013-09-
28/584825

и отличается уже не только по id, но и по дате, названию трассы.

Так как предыдущий метод не подойдет, необходимо


сгенерировать ссылки на страницы, которые предоставляют
краткую информацию о всех заездах за конкретную дату и
ссылки на страницы содержащие подробную информацию об
этих заездах.

Ссылка на информацию за конкретную дату имеет вид:

https://www.racingpost.com/results/2013-09-28/time-order

Для получения всех ссылок на информацию о заездах,


необходимо изменять только значение даты и извлекать ссылки
с полученных html страниц.

36
Рис. 8 Предоставление информации о всех заездах за конкретную дату

Изучив html код страницы результатов данных, с помощью


библиотеки Beautiful Soup извлекаем нужные нам данных и
сохраняем в таблицу.

37
Рис. 9 Предоставление подробной информации и конкретном заезде

Таблица имеет следующие столбцы:


'Race id' – идентификатор заезда,
'Country' – страна в которой происходит заезд,
'Track' – название трека в котором происходит заезд,
'Day' – день заезда,
'Month' – месяц заезда,
'Year' – год заезда,
'Horse' – имя лошади,
'Country horse' – страна происхождения лошади,
'Age' – возраст лошади,
'WGT' – вес лошади,

38
'Trainer' – имя тренера,
'Jockey' – имя жокея,
'OR' – рейтинг лошади,
'Position' – позиция лошади на финише.
Данные сохраняются в таблицу формата csv.

39
Таб. 1 Данные с сайта racingpost.com

40
Таким образом у нас имеется информация о заездах за
последние 5 лет в виде таблицы, теперь необходимо подготовить
её для обучения искусственной нейронной сети.

Рис. 10 Структура сборщика данных

41
3.2. Преобразование данных
Конвертор необходим для преобразования данных в удобный
для нейросети вид.
Для более точного анализа рассмотрим заезды каждых стран
отдельно. Страны с небольшим числом заездов, такие как
Бельгия, Индия, Венгрия и другие, можно не анализировать.
Будем анализировать заезды стран, в которых лошадиные
скачки наиболее популярны и часты, такие как Великобритания,
Ирландия, Франция.
Так как нейронная сеть работает только с числовыми данными,
нужно перевести все нечисловые данные в цифровые.
Посчитаем среднее значение позиции для каждой лошади,
возраста, жокея, тренера, страны происхождения лошади и
рейтинга и инвертируем его.
Сначала, необходимо узнать сколько раз каждая категория
занимала конкретные места.

42
Таб. 2 Рейтинги по возрасту лошадей за весь период

43
Так как максимальное количество участников в забеге 30,
значение 1 месту будет равно 30, а 30 -1.
Все нечисловые результаты лошадей заменим на 0:
DNF – Did Not Finish – не пришла к финишу,
BD – Brought Down – лошадь сбита другими лошадьми,
F – Fell – падение лошади,
U— лошадь сбросила жокея,
PU – Hulled Up – остановка лошади во время гонки,
HR – Hit Rails – удар лошади во время гонки о заграждение,
R – Refuzed – лошадь остановилась перед препятствием,
SU – Slipped Up – лошадь поскользнулась,
RTR – Refuzed To Race – отказ лошади выбежать из стартовой
кабины,
DQ – Disqualified – дисквалификация лошади,
UR – Unseated Rider –падение жокея с лошади.
Но для более точного, нам потребуется изучить более короткие
периоды времени по отдельности. Возьмем выборку по месяцам
и посчитаем средние значения позиций.

3.3. Нормализация данных


Необходимость нормализации выборок данных обусловлена
самой природой используемых переменных нейросетевых
моделей. Будучи разными по физическому смыслу, они зачастую

44
могут сильно различаться между собой по абсолютным
величинам. Так, например, выборка может содержать и
концентрацию, измеряемую в десятых или сотых долях
процентов, и давление в сотнях тысяч паскаль. Нормализация
данных позволяет привести все используемые числовые значения
переменных к одинаковой области их изменения, благодаря чему
появляется возможность свести их вместе в одной нейросетевой
модели.

Чтобы выполнить нормализацию данных, нужно точно знать


пределы изменения значений соответствующих переменных
(минимальное и максимальное теоретически возможные
значения). Тогда им и будут соответствовать границы интервала
нормализации. Когда точно установить пределы изменения
переменных невозможно, они задаются с учетом минимальных и
максимальных значений в имеющейся выборке данных.

Наиболее распространенный способ нормализации входных и


выходных переменных – линейная нормализация.

Примем следующие обозначения:

– xik, yjk – i-е входное и j-е выходное значения k-го примера


исходной выборки в традиционных единицах измерения,
принятых в решаемой задаче;

45
– – соответствующие им нормализованные входное и
выходное значения;

– N – количество примеров обучающей выборки.

Тогда переход от традиционных единиц измерения к


нормализованным и обратно с использованием метода линейной
нормализации осуществляется с использованием следующих
расчетных соотношений:

– при нормализации и денормализации в пределах [0, 1]:

; (1)

где

46
Таб. 3 Рейтинги тренеров за месяц после нормализации

trainer raiting
W J Burke 0.6814910025706941
Muredach Kelly 0.7120634920634921
Sir Mark Prescott Bt 0.85
Mrs Jeanette Riordan 0.7962962962962963
M F Morris 0.6948379351740697
J F Tormey 0.15555555555555556
J Reilly 0.5333333333333333
T J Nagle Jr 0.6781725888324873
Ian Williams 0.6777777777777778
C Moore 0.5857142857142857
T J Canavan 0.0
Mark Fahey 0.7560077519379845
Niall O'Callaghan 0.6309523809523809
James J Hartnett 0.7375
Sean P Hennessy 0.736231884057971
G T Lynch 0.5815891472868217
George Young 0.7666666666666667
James Keegan 0.6305555555555555
I McCaghy 0.34444444444444444
David Dennis 0.6333333333333333
G Hayes 0.7287037037037037
Sean O'Brien 0.7154929577464789

47
Переконвертируем основную таблицу в числовой формат
согласно таблице с рейтингом за прошлый месяц, т.е. вместо
данных запишем их значения рейтинга. Записываем рейтинг за
прошлый месяц, а не за весь период чтобы анализировать только
свежие данные. Ведь у каждой лошади, тренера, жокея есть
взлеты и падения, а нам надо понять в какой форме они находятся
именно сейчас. Если лошадь пробежала хорошо год назад
абсолютно не значит, что сейчас она покажет хороший результат.

Таб. 4 Общий вид таблицы после нормализации

Теоретически мы можем закончить на этом преобразование


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

48
Проблема заключается в том, что в гонких участвуют
примерно от 5 до 30 лошадей. Необходимо определиться с
размером массива. Есть несколько вариантов:
1) Определить массив минимальным
размером, в таком случае обрезать часть
участников, оставляя только наиболее
вероятных победителей.
2) Определить массив максимальным
размером, заполняя недостающие значения
нулями.
3) Определить массив максимальным
размером, заполняя недостающие значения
повторно участниками данной гонки.
1 вариант подразумевает рассчитать предварительную
вероятность всех участников на победу и оставить сильнейших,
но в случае ошибки расчётов возможный победитель по попадет
в выборку для дальнейшего анализа нейросетью.
2 вариант исключает проблемы предыдущего варианта, т.к.
будут анализироваться все участники, но может возникнут другая
проблема. Проблема заключается в обучении нейронной сети, а
именно в грамотном распределении весов входов сети. Большое
количество участников встречается не так часто, соответственно
веса на последних входах будут обучаться реже, чем на первых

49
(будут подаваться нули). Поэтому в этом варианте тоже придется
рассчитывать предварительную вероятность на победу и
сортировать исходя из этой вероятности, чтобы наиболее
вероятные победители были в начале массива (попадали на
наиболее обученные входы сети).
3 вариант предполагает циклически повторяющееся
заполнение массива. Тем самым все входа будут обучаться
одинаково и в выборку будут попадать все участники. После
получения результата нейронной сети будет лишь необходимо
убрать повторяющиеся строки.
После реализации 3 варианта мы получили таблицу, где
каждая ее строка это все данные о конкретной гонке имеющей
свой уникальный id.
Теперь информация о каждой гонке имеет одинаковый
числовой формат и размерность.
Но забегая вперед, анализ показал, что ИНС плохо справляется
с выходным массивом, будет лучше, если на выходе будет одно
значение.
Тогда для анализа каждого участника в конкретном заезде,
необходимо иметь информацию о других участниках.
Необходимо пересчитать рейтинги, опять же применим
линейную нормализацию, только возьмем не все значения как
ранее, а выборки по каждому заезду.

50
Таб. 5 Значения после нормализации по каждому заезду

Например, в заезде с id № 538522 при пересчете получаем


значения от 0 до 1, где 1 максимальный рейтинг лошади в заезде,
так же пересчитываются рейтинги возраста, жокеев, тренеров,
рейтинга сайта и веса.

Таким образом при одинаковых значениях в выборке после


нормализации рейтинги будут равны нулю и не будут влиять на
результат.

51
Рис. 11 Структура конвертора данных

Зная все рейтинги по всем параметрам можно было бы уже


прогнозировать дальнейшие результаты, но проблема в том, что
мы не знаем какие показатели важнее других. Сложно определить
какой показатель более решающий: лошадь, возраст лошади,
жокей или тренер.

Необходимо правильно расставить веса на эти показатели,


этим и займется нейронная сеть.

52
3.4. Обучение и тестирование нейронной сети
Обучение нейронной сети сводиться к выбору ряда
параметров:
- типы слоев сети;
- количество нейронов в каждом слое;
- количество эпох обучения;
- размер выборки (количества строк) после которого
меняются веса;
- значения dropout ( “метод исключения”);
- алгоритм оптимизации.

53
Рис. 12 Многослойный персептрон

54
Самая известная и очень старая архитектура, в которой идут
подряд несколько слоев нейронов — входной, один или
несколько скрытых слоев, и выходной слой. Почти всегда
обучается методом обратного распространения ошибки — что
автоматически означает, что мы должны предоставить для
обучения набор пар «входной вектор — правильный выход».

Тогда входной вектор отправится на вход сети,


последовательно будут рассчитаны состояния всех
промежуточных нейронов, и на выходе образуется выходной
вектор, который мы и сравним с правильным. Расхождение даст
нам ошибку, которую можно распространить обратно по связям
сети, вычислить вклад в итоговую ошибку каждого нейрона, и
скорректировать его веса, чтобы ее исправить. Повторив эту
процедуру много тысяч раз, возможно выйдет обучить сеть.
Сеть такого типа обычно очень хорошо справляется с задачами,
где:
1. ответ действительно зависит только от того, что мы даем на
вход сети, и никак не зависит от истории входов (т.е. это не
динамический процесс, или, по крайней мере, мы дали на вход
исчерпывающую информацию об этом процессе в форме,
пригодной для обработки сетью).
2. ответ не зависит/слабо зависит от высоких степеней и/или

55
произведений параметров — функции этого типа сеть строить
почти не умеет.
3. в наличии есть достаточно много примеров (желательно иметь
не менее сотни примеров на каждую связь сети), или у вас есть
большой опыт борьбы с эффектом специализации. Это связано с
тем, что, имея много коэффициентов, сеть может банально
запомнить много конкретных примеров, и выдавать на них
отличный результат — но ее прогнозы не будут иметь ничего
общего с реальностью в случае, если дать на вход примеры не из
обучающей выборки.

Архитектура нейронной сети

У нашей нейронной сети будет 2 скрытых слоя. Задача


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

Первый скрытый слой

56
Рис. 13 Слой ввода и первый скрытый слой

57
Также надо определить, сколько узлов будет содержать
первый скрытый слой. Они называются признаками или
нейронами, на изображении сверху каждый представлен синим
кругом.

В слое ввода один узел соответствует значению из набора


данных.

Каждый узел (нейрон) умножается на вес, т.е. имеет значение


веса. В ходе обучения нейронная сеть регулирует эти показатели,
чтобы произвести правильные выходные данные. Сеть также
добавляет смещение.

Далее в нашей архитектуре данные передаются функции


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

Существует много видов функции активации. Используем


усеченное линейное преобразование (ReLu). Эта функция
определяется следующим образом:

f(x) = max(0,x) [вывод равен x или 0 (ноль), в зависимости


от того, что больше]

Примеры: если x = −1, то f(x) = 0 (ноль); если x = 0,7, то f(x) =


0,7.

Второй скрытый слой

58
Второй скрытый слой делает то же самое, что и первый,
но теперь входными данными являются выходные данные
первого слоя:

Рис. 14 Первый и второй скрытые слои

59
Слой вывода.
И, наконец, мы добираемся до последнего пункта — слоя
вывода. Чтобы получить его результаты, будем
использовать категории. На выходе будут вероятности,
обозначающие на сколько данных участник принадлежит к той
или иной категории.
Экспериментируем с параметрами обучения
Мы попытаемся улучшить качество обучения сети путем
изменения параметров: количество эпох обучения, количество
нейронов на слое, алгоритм оптимизации, размер пакета,
значение dropout. Для этого проведем серию экспериментов, в
каждом из которых будем менять один из параметров, и
анализировать, как изменилось качество работы сети.
Количество эпох обучения. Оценим влияние количества эпох
обучения на качество обучения сети. Количество эпох задается в
аргументе epochs метода model.fit:
model.fit(X_train, y_train, batch_size=64, epochs=100,
validation_data=(X_test, y_test), verbose=2)
Попробуем обучать сеть в течение 100, 500 и 1000 эпох.
Определим, когда начинается переобучение. Выберем
количество эпох, при котором самая высокая точность работы
сети на тестовых данных.

60
Результаты показали, что переобучение начинается примерно
с 300 эпохи, а для точного обучения вполне хватает 150 эпох.
Количество нейронов в слое Dense.
Оценим влияние количества нейронов в Dense слое сети на
качество обучения. Количество нейронов задается при
добавлении слоя в модель:
model.add(Dense(XXX, input_dim=7, init='uniform')
Используем количество нейронов 50, 200, 300, 400. Выберем
количество нейронов в слое, при котором обеспечивается самая
высокая точность обучения. Проанализируем влияния
количества нейронов в слое на время обучения сети.
При малом количестве нейронов время обучения значительно
быстрее, примерно в 2, но результаты прогнозирования не
меняются.
Вывод программы при слое в 200 нейронов:
Epoch 4/150
4s - loss: 1.3911 - acc: 0.5151 - val_loss: 1.3824 - val_acc: 0.6446
Epoch 5/150
4s - loss: 1.3898 - acc: 0.5157 - val_loss: 1.3825 - val_acc: 0.6434
При слое в 400 нейронов:
Epoch 2/150
10s - loss: 1.3960 - acc: 0.5130 - val_loss: 1.3823 - val_acc: 0.6433
Epoch 3/150

61
10s - loss: 1.3926 - acc: 0.5152 - val_loss: 1.3885 - val_acc: 06415
При добавлении второго слоя:
14s - loss: 0.9808 - acc: 0.6103 - val_loss: 0.8213 - val_acc: 0.6532
Epoch 2/15
14s - loss: 0.8030 - acc: 0.6654 - val_loss: 0.7732 - val_acc: 0.6906
Epoch 3/15
14s - loss: 0.7860 - acc: 0.6781 - val_loss: 0.7679 - val_acc: 0.6932
Здесь loss - функция ошибки, acc - точность на обучающей
выборке, val_loss и val_acc - на тестовой выборке.
Видим, что точность на тестовой выборке получилась val_acc:
0.6932, то есть, 69.32%.

Результаты показали, что самая высокая точность обучения


при слое в 200 и выше нейронов, но обучение в 200 происходит
быстрее.
Алгоритм оптимизации. Выясним, как влияет алгоритм
оптимизации на качество обучения. В базовой версии программы
используется эффективный алгоритм оптимизации Adam.
Попробуем заменить его на стандартный алгоритм
стохастического градиентного спуска (Stochastic gradient descent,
SGD). Для этого поменяем значение параметра optimizer при
компиляции модели:
model.compile(loss='binary_crossentropy',

62
optimizer='SGD',
metrics=['accuracy'])
Однако алгоритм стохастического градиентного спуска
работает немного хуже, чем Adam.
Размер выборки.
Подберем размер batch_size.
По одному примеру - медленная сходимость, и алгоритм "не
видит" хороших минимумов,
По всем примерам сразу - трудоемко, и сходимость к
локальному минимуму и склонность к переобучению.
Обработка mini-batch - промежуточный вариант, который
называется градиентным стохастическим спуском.
Вывод программы при выборке по 100 примеров
обеспечивается наилучшее обучение с оптимальным временем
обучения:
Epoch 1/150
15s - loss: 0.7937 - acc: 0.6742 - val_loss: 0.7492 - val_acc: 0.7038
Epoch 2/150
15s - loss: 0.7727 - acc: 0.6841 - val_loss: 0.7505 - val_acc: 0.6996
Epoch 3/150
15s - loss: 0.7698 - acc: 0.6858 - val_loss: 0.7488 - val_acc: 0.7028

63
Переобучение (overfitting) — одна из проблем глубоких
нейронных сетей (Deep Neural Networks, DNN), состоящая в
следующем: модель хорошо объясняет только примеры из
обучающей выборки, адаптируясь к обучающим примерам,
вместо того чтобы учиться классифицировать примеры, не
участвовавшие в обучении (теряя способность к обобщению). За
последние годы было предложено множество решений проблемы
переобучения, но одно из них превзошло все остальные,
благодаря своей простоте и прекрасным практическим
результатам; это решение — Dropout (в русскоязычных
источниках — “метод прореживания”, “метод исключения” или
просто “дропаут”).
В итоге мы сформировали нейронную сеть с оптимальными
параметрами.
Вывод параметров программы:

_____________________________________________________
____________
Layer (type) Output Shape Param #
===============================================
==================
dense_1 (Dense) (None, 200) 1600

64
_____________________________________________________
____________
dropout_1 (Dropout) (None, 200) 0
_____________________________________________________
____________
dense_2 (Dense) (None, 100) 20100
_____________________________________________________
____________
dense_3 (Dense) (None, 11) 1111
===============================================
==================
Total params: 22,811.0
Trainable params: 22,811.0
Non-trainable params: 0.0

3.4. Интерфейс пользовательского приложения


Для удобной работы конечного пользователя с программой
необходимо создать интерфейс.

Приложение должно:

-выводить информацию о предстоящих заездах,

65
-прогнозировать результаты выбранных заездов и выводить
их,

- обновлять таблицу с данными до текущей даты и переобучать


на них нейронную сеть.

Так как все функции реализующие задачи, изложенные выше,


уже написаны, остается реализовать интерфейс с помощью
PyQT5.

При нажатии кнопки “Выбор даты” появляется всплывающее


окно с календарем, выбор даты осуществляется двойным
нажатием на нужную дату.

Рис. 15 Календарь для выбора даты

66
После выбора даты происходит отображение данных о заездах
выбранной даты. Данные перенаправляются с сайта и
отображаются в виде таблице.

Рис. 16 Данные о заездах на выбранную дату на сайте

67
Рис. 17 Данные о заездах на выбранную дату в приложении

При двойном нажатии на выбранный заезд данные о заезде с


сайта конвертируются и поступают на ИНС, сеть прогнозирует
результат, и он отображается в виде таблицы как вероятности
занять то или иное место для каждой лошади.

68
Рис. 18 Список участников в предстоящем заезде на сайте

Рис. 19 Список участников и их вероятности на позиции

Обновление данных происходить после нажатия кнопки


“Обновить” на основной панели. Сначала происходит проверка
69
на наличие новых данных в сети, если данные появились, то они
загружаются и конвертируются, нейронная сеть переобучается
согласно вновь поступившим данным

Рис. 20 Обновление данных

70
Рис. 21 Общий вид приложения

71
Заключение
В ходе выполнения бакалаврской работы был проведен обзор
литературы по сбору и анализу данных, нормализации данных и
методам обучения нейронных сетей, проанализированы их
сильные и слабые стороны. Была собрана информация о скачках
за последние пять лет, в результате была сформирована таблицы
из 150279 строк с информацией о 140246 заездах. Информация
была переведена в удобный для ИНС формат. Для реализации
нейронной сети был выбран тип многослойного персептрона.
Оказалось, что результаты прогнозов, при правильно
выбранном диапазоне предыдущих результатов и их
нормализации, значительно лучше предсказывают исход заезда.
Выяснились влияния параметров нейронной сети на конечный
результат. Таким образом были подобраны наилучшие
параметры для выбранной архитектуры нейронной сети.
В дальнейшем планируется улучшить качество работы
приложения за счет изменения и добавления входных данных,
таких как дистанция и тип покрытия трассы, участвовал ли ранее
жокей на этой лошади и другое.

72
Список литературы
1. Митчелл Р. «Скрапинг веб-сайтов с помощю Python» ДМК
Пресс, 2016 год, 280 стр., пер. с англ. А. В. Груздев
2. Дронов В., Прохоренок Н. «Python 3 и PyQt 5. Разработка
приложений.» БХВ-Петербург, 2016 год.
3. Ф. Уоссермен, Нейрокомпьютерная техника: Теория и
практика, 1992 год.
4. С. Хайкин, Нейронные сети: Полный курс, 2006 год.
5. С. Хайкин, Нейронные сети: Полный курс. Второе
издание, 2008 год.
6. Raschka S. «Python Machine Learning», 2015 год.
7. Барский А.Б. Нейронные сети: распознавание,
управление, принятие решений,2004 год.
8. Wes McKinney «Python for Data Analysis: Data Wrangling
with Pandas, NumPy, and IPython», O'Reilly Media, 2012
год,470 стр.

73