четверг, 10 января 2019 г.

Эло рейтинг в ориентировании. А так можно? Часть 2.

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

Для тех, кто остался, я продолжу. Первым в алгоритме подсчета идет определение вероятности победы (или ожидаемого результата) спортсменов исходя из разности их рейтинга. Здесь я использовал наиболее классический подход, где результат спортсмена считается нормально (Гауссово) распределенным относительно среднего уровня (за который принимается текущий уровень). При рейтингах R1 и R2, ожидаемые результаты вычисляются по формулам:
E1 = 1 / (1 + 10^((R2 - R1) / D))
E2 = 1 / (1 + 10^((R1 - R2) / D))
Важным свойством является то, что E1 + E2 = 1 (то есть суммарная вероятность победы обоих спортсменов равняется 100%). D - коэфициент, который и будет определять, как разница в рейтинге соответствует вероятности победы, но важно только его отношение к величинам коэфициентов стартов (о которых дальше). Я принял D = 300. Подставив это значение в формулы, получим, что разница в 100 очков рейтинга соответствует вероятностям 68% / 32%, 200 ~ 82% / 18%, 300 ~ 91% / 9%, 400 ~ 95% / 5%. Наличие физического смысла я считаю одной из приятных мелочей Эло рейтинга, ведь речь идет не только о функциях подсчета, но и о том, что, в конечном итоге, значат сами числа рейтинга спортсменов. Хотя, с практической точки зрения, наличие такой обратной связи может быть не так и велико.

Идем дальше подсчитав ожидаемые результаты E и сравним с ними реальные результаты С (0, 1 или 0.5) получаем некое значение B = С - E. Как я писал в первой части, для каждого спортсмена мы проводим сравнение с каждым из соперников, то есть для каждого спортсмена мы имеем N-1 значений B (где N - число участников старта). Тут возникает вопрос: что с этим всем делать дальше? Вариантов несколько:
  1. Взять среднее значение.
  2. Взять сумму.
  3. Что-то посередине между 1 и 2
Вариант 1 кажется слишком статичным, усреднение может давать для большинства спортсменов слишком маленькие изменение. Вариант 2 - другая крайность, слишком резкие изменения, особенно учитывая существенную вероятность схода (или снятия) даже для топовых спортсменов. Впрочем, это пока мои домыслы, которые я еще буду проверять дальше. А остановился я пока на формуле 
Вt = Sum(B) * log(4, N) / (N - 1)
То есть среднее значение умножается на логарифм количества участников по основанию 4. Четыре означает, что множитель будет равен 3, при числе участников 64, что на данный момент близко к практическому максимуму.

Остается умножить значение Вt на коэфициент значимости старта K и изменение рейтинга готово. Правда перед этим я ограничиваю -1 <= Вt <= 1 и ставлю его -1 или 1 его оно из этих границ вылезает. Это тоже одна из опций, означающая, что модуль изменения рейтинга никогда не может быть больше коэфициента старта. Основная цель - избежать резких падений при сходах высокорейтинговых спортсменов на старте с большим количеством участников. Теперь о коэфициентах стартов, соревнования я разбил на 4 уровня:
  1. K = 40. Мастерские старты и старты WRE.
  2. К = 30. Старты кубка БФО.
  3. К = 20. Чемпионаты и кубки областей, старты на соревнованиях с этапами кубка БФО.
  4. К = 10. Все остальное
Пункт 4, в моем понимании, еще одно преимущество такого рейтинга. Здесь нет необходимости выделять группу расчитываемых стартов, устанавливать лимит на количество зачетных стартов. Тот факт, что рейтинг изменяется в обе стороны, не дает очевидных преимуществ спортсменам бегающим больше (или меньше) стартов (хотя о некоторых возможных минусах - дальше).

Для подсчета рейтинга я собрал старты последних 5 лет, элитные группы у мужчин и женщин. В теории можно пойти дальше и расчитывать в один рейтинг все участвующие группы, но есть опасение, что пересечений между участниками разных групп будет слишком мало для стабилизации рейтинга и возможности достоверно отображать, например, разницу в уровне М16 и М60. Женские и мужские рейтинги, естественно, сичтаются отдельно и соотношение чисел между ними не говорит ни о чем. Источником служили протоколы на OBelarus.net и Orient.by, за исключением массовых открытых стартов вроде ЗС было посчитано практически все (хотя и ЗС не является каким-то ограничением, скорее экономией времени, при внесении текущего рейтинга я планирую учитывать все старты по максимуму, так в последнюю версию уже попали туры BNTU Open). Из расчета исключались спортсмены с пометкой в/к и иностранные спортсмены, хотя в отношении некоторых спортсменов мнения протоколов о гражданстве не сходились (Ласкаржевский Владислав - самый яркий пример), тут, в целях экономии времени, я просто доверял протоколам. Всего вышло около 540 стартов (считая отдельно мужчин и женщин). Начальный рейтинг каждого спортсмена устанавливается в 1500.

Само написание подсчет рейтинга уместилось в 15 минут работы и 20 строчек кода, что идет в слабое сравнение со всей подготовительной работой. Осталось нажать кнопку и получить примерно следующее (в списке присутствуют спортсмены, пробежавшие за последний год стартов с суммарным коэфициентом не менее 60, поля таблицы после рейтинга: старты за год, прогресс за год и суммарный коэфициент за год):




Пожалуй, вышло что-то похожее на правду. Что еще мне хотелось добавить - это часто используемые в рейтингах Эло особые правила для новичков. В нашем случае они будут выглядеть так:
  1. Для спортсмена новичка все коэфициенты К удвоены.
  2. Для спортсмена неновичка, при сравнении с новичком при расчете рейтинга, результат сравнения учитывается с весом 0.5 при расчете среднего значения (соответственно и в формуле Вt = Sum(B) * log(4, N) / (N - 1), N - это взвешенное количество участников).
Остается еще решить, кого считать новичком. Учитывая разные коэфициенты стартов, простое количество будет работать не слишком хорошо. Я ввел подсчет суммы коэфициентов стартов, спортсмен, у которого эта сумма <= 200 - новичок (с точки зрения системы его рейтинг вызывает меньше доверия и его нужно побыстрее привести к нужным значениям).

Говоря о новичках, стоит понимать, что рейтинг стартует с начала 2014 года, все спортсмены на отметке 1500. Происходит некий "большой взрыв" - спортсмены резко начинают разлетаться в разные стороны исходя из своих результатов. Дальше эта растягивание рейтинга должно начать быстро замедляться, рано или поздно рейтинг должен прийти к некоему балансу, соответствующему реальной силе спортсменов, но вопрос, как понять, что рейтинг уже прошел фазу инициализации, остается открытым.

Впрочем, чем долго рассуждать и угадывать, проще взять и проверить:


Рейтинг растянулся, при этом не пережив слишком существенных изменений - это достаточно позитивно. Тут мне захотелось проверить, насколько время начала рейтинга влияет на его значение сейчас, и я добавил еще 2 года стартов, на этот раз ограничившись стартами кубка БФО. Результат (полные таблицы ниже) - не слишком-то влияет, просто рейтинг еще слегка растянулся. В целом - это то что от рейтинга и ожидалось - давние результаты должны быть практически незаметны сейчас, но тут получить ожидаемый результат приятно.

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


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




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

Отправить комментарий