"НА ​​ЦЕЛИ"

Что делать, если ваш проект терпит неудачу

Не паникуйте - чаще всего это можно исправить

Возможно, вы уже знаете это чувство.

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

А затем, за пару недель до крайнего срока вашего проекта, вы тренируете свою первую модель. И это полный отстой.

Как и второй. И третье.

Давайте проясним: я не говорю о моделях с точностью 80%, когда вы надеялись на 90%. Я говорю о моделях, которые функционально бесполезны. Я говорю о моделях с отрицательным скорректированным R-квадратом.

Что, черт возьми, ты делаешь?

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

Напоминаем, что проект, над которым я работал во время этой серии 'On Target', обманчиво прост: можем ли мы предсказать, какие игроки будут задействованы в забитых головах в футболе Премьер-лиги? матчей, исходя из их исторических результатов?

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

Затем у меня было 83 функции, состоящие из нескольких различных наборов показателей, чтобы помочь понять, будет ли игрок участвовать в достижении цели:

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

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

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

Этот подход был применен к серии различных алгоритмов, подходящих для двоичной классификации (логистическая регрессия, деревья решений, случайные леса, SVM, XGBoost и т. Д.)

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

Куда пойти отсюда?

Подходят ли данные для моделей?

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

Точно так же, если данные несбалансированы (как этот набор данных, примерно в 8: 1), нам нужно смягчить это, сказав алгоритмам взвешивать свои результаты по классам (большинство из них имеют такую ​​функциональность) или создав синтетические данные с помощью алгоритма SMOTE.

Вы используете лучшие показатели оценки?

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

Рассмотрим следующую матрицу путаницы:

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

Точность определяется как:

(A + D) / (A + B + C + D)

Другими словами, какая доля из всех сделанных прогнозов верна?

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

Давайте рассмотрим наше первоначальное намерение и постараемся понять это. Я хочу предсказать, кто забьет голы, чтобы я мог выбрать этих игроков для своей команды Fantasy Premier League. И есть очень ограниченное количество игроков, которые могут быть в моей команде одновременно - максимум семь атакующих игроков из сотен доступных.

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

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

A / (A + C)

Этот подход также позволил мне поиграть с порогом для предсказания положительного случая. Вместо стандартных 50% я мог бы сделать модель более разборчивой - предсказывать положительный случай только в том случае, если вы уверены на 60% или 70%. Конечно, это уменьшает общее количество положительных случаев, но должно сохранить те случаи, которые являются лучшими ставками (и, таким образом, помогают повысить точность).

Не могли бы вы использовать другую целевую переменную?

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

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

Оказывается, все немного сложнее. Возьмем, к примеру, Джамаля Льюиса, защитника худшего из «Норвич Сити», которого выбрали всего 0,2% менеджеров Премьер-лиги Fantasy. Он не бил в створ более трех месяцев и играл против одной из лучших защит в лиге.

Затем он пошел и сделал следующее:

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

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

Определив различные типы возможных ударов (где на поле они были сделаны, были ли они нанесены ногой или головой, был ли им напрямую ассистирован другой игрок или нет, и т. Д.), Мы можем увидеть коэффициент реализации голов. каждый (ожидаемые голы, или XG). Мы также можем посмотреть на рост конверсии голов, если бросок попадал в створ.

Затем мы можем посмотреть на различные броски, которые делает игрок в игре, суммировать «XG» каждого сделанного им броска в зависимости от типа каждого броска и создать общий показатель «Ожидаемые цели» для игрока в этой игре.

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

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

XG и XGI - полезные метрики: они хорошо описывают игроков, которые обычно участвуют в достижении целей. Они также сглаживают некоторые случайные крайние случаи (например, неожиданный удар Джамаля Льюиса против Лестер-Сити), которые в противном случае запутали бы модель во время обучения.

Учитывая, что XG и XGI являются непрерывными переменными, упражнение стало проблемой регрессии, а не классификацией.

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

Используя скорректированный R-Squared (поскольку у нас много функций), мы можем увидеть, что модели в лучшем случае объясняют только 15–20% дисперсии ожидаемых целей / ожидаемого достижения цели. Мы также можем видеть значительную разницу между обучающим набором и тестовым набором R-Squared - я все еще страдал от переобучения, несмотря на процесс перекрестной проверки.

Понять, почему что-то не работает

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

Разобраться в причинах такого результата важно по ряду причин (не в последнюю очередь потому, что это дает вам хорошее представление о том, что делать дальше, если вам дается дополнительное время или вам нужно передать проект кому-то другому. ).

Как бы то ни было, я думаю, что мое моделирование пострадало от следующего:

  • У меня было очень мало времени, чтобы повторить и адаптировать набор функций. Характеристики часто сильно коррелировали друг с другом - некоторые, такие как «выстрелы в створ», буквально являются подмножествами других («общее количество выстрелов»). Это полностью исключило использование параметрических моделей.
  • Анализ данных за весь сезон 19/20 привел к получению около 4000 строк данных - неплохо, но не удивительно. Для подтверждения этого можно было собрать данные из предыдущих сезонов.
  • Первоначальная цель проекта - предсказать что-либо конкретное в футбольных матчах - принципиально очень сложно. Даже несмотря на то, что показатель «Ожидаемые цели» немного сгладил бы случайность, результативность игрока может сильно колебаться от игры к игре, казалось бы, без особой причины.
  • И, как заметил мой партнер, если бы кто-то мог сделать это самостоятельно всего за два месяца, то рынки ставок на спорт рухнули бы много лет назад.

Не позволяйте своим усилиям пропадать зря!

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

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

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

Эти интерактивные информационные панели доступны на моем сайте. Поиграйте и посмотрите, что вы думаете!

Пусть кто-нибудь еще попробует ...

Это непросто - люди любят забирать себе славу, и в одиночку «взломать» Fantasy Premier League было очень заманчивой перспективой. Но наука о данных по самой своей природе часто является совместным занятием. И каким бы хорошим специалистом в области данных вы ни были, все равно найдутся тысячи людей лучше. Итак, в этом духе я хотел бы пригласить вас посмотреть, сможете ли вы добиться лучших результатов - я почти уверен, что вы могли бы.

Вы можете найти репозиторий GitHub здесь.

Я с нетерпением жду того, что вы придумаете…

Это последний пост в моей серии блогов On Target, в которой я попытаюсь создать инструменты для фэнтези-премьер-лиги Moneyballing. Я хотел бы услышать любые комментарии о блоге или о любых концепциях, которые затрагивает статья. Не стесняйтесь оставлять сообщение ниже или обращаться ко мне через LinkedIn.