Всем привет, надеюсь у вас все хорошо. Сезон крикета T20 продолжается, и последние 4 месяца мы постоянно наблюдаем некоторые действительно невероятные матчи t20, поэтому я думаю, что это лучшее время, чтобы сделать и завершить проект машинного обучения на нем.
Сегодня в этом блоге мы будем делать предиктор счета. Наша модель будет предсказывать общий счет в конце иннинга, принимая во внимание некоторые факторы.
Весь код, написанный в этом блоге, находится в моем github- https://github.com/HarshMishra2002/cricket_score_pred
ссылка на используемый набор данных — https://www.kaggle.com/harshmishraandheri/t20i-cricket-matches-ball-by-ball-info-dataset
Давайте начнем Проект. Полный проект написан на языке python, а блокнот Jupiter используется в качестве IDE.
сначала мы импортируем набор данных и получим его обзор
Итак, это тот набор данных, который у нас есть. Нам нужно создать несколько столбцов и извлечь несколько, чтобы получить нужные данные. В конце концов мы хотим, чтобы наши данные имели столбцы:
отбивающая команда
команда по боулингу
город
текущий_счет
количество оставшихся мячей
калитки_левая
текущая_скорость_пробега
последние пять
Теперь у нас уже есть несколько столбцов, как мы хотим в нашем наборе данных. У нас уже есть данные о командах, играющих в мяч, и о командах по боулингу. у нас также есть столбец города, но он имеет некоторые нулевые значения, которые нам нужно выяснить, как с этим справиться. Для остальных все нам нужно проделать некоторые манипуляции.
Теперь мы начнем извлечение признаков из столбца города. Чтобы заполнить пустые значения, мы будем использовать столбец места проведения.
Здесь мы проверяем значения в столбце «место проведения», где столбец города имеет нулевые значения. Если мы внимательно посмотрим, первое слово в слове «место проведения» на самом деле является названием города, в котором существует место проведения, например. Дубай на Дубайском международном стадионе для крикета или Мельбурн на Мельбурн Крикет Граунд.
Таким образом, мы сохраняем все первое слово столбца места проведения в переменной с именем city, а затем используем ее для заполнения столбца city. Теперь в нашем наборе данных нет нулевых значений. Но все же осталось еще одно. Наш набор данных представляет собой набор данных «мяч за мячом», что означает, что если имеется 63000 строк, это означает, что было подано и сыграно много мячей.
Это показывает, что есть определенные города, в которых было сыграно очень мало доставок. Таким образом, мы можем игнорировать эти города и рассматривать только те, в которых есть не менее 600 доставок.
Теперь наша городская колонка завершена. Переходим к столбцу current_runs, который очень легко извлечь из столбца запусков. Простая функция cumsum() (используемая для нахождения совокупной суммы столбца) сделает всю работу за нас.
Теперь наша следующая цель — создать столбец «balls_left», для которого сначала мы создадим новые столбцы: «overs» и «balls», которые сообщают нам, сколько оверов было выполнено и сколько мячей в текущем овере было сыграно. соответственно. Код очень прост для этого.
Теперь, используя простую формулу, мы можем создать столбец «balls_bowled», в котором будет указано, сколько шаров было сыграно. Формула будет
balls_bowled = (овер * 6) + мячи
И теперь, наконец, мы можем создать желаемый столбец «balls_left», вычитая balls_bowled из 120, потому что всего в иннинге 120 мячей. иногда из-за дополнительных характеристик (широкий, без мяча…) количество мячей превышает 120, поэтому в таком случае мы можем просто указать значение 0.
Теперь, если мы посмотрим на столбец player_dismissed, он имеет либо значение 0, либо имя игрока, который вышел из этого конкретного мяча. Сначала мы заменим все имена на 1, а затем применим к ним функцию cumsum(), чтобы мы могли получить общее количество калиток, и мы вычтем его из 10, чтобы получить столбец «wickets_left».
Теперь мы создадим текущую колонку скорости выполнения, что очень легко сделать.
Теперь нам нужен столбец с общим количеством ранов, набранных за последние пять оверов. Очевидно, у нас будут нулевые значения в этом столбце для первых 5 оверов.
Теперь нам нужно создать последний столбец, который будет нашим целевым столбцом. Общее количество ранов, набранных в этом иннинге.
Теперь мы удалим все столбцы, которые не хотим иметь для нашей модели, и сохраним те, которые мы только что создали. Также мы перемешаем данные, чтобы избежать какой-либо предвзятости.
На этом мы заканчиваем часть проекта по извлечению функций. Итак, после большой работы у нас наконец-то есть точные данные, которые мы хотели в начале.
Итак, давайте теперь начнем с процесса построения модели. Для этого сначала мы разделим наш набор данных на набор для обучения и набор для тестирования, используя модуль train_test_split библиотеки sklearn.
Здесь требуются некоторые этапы предварительной обработки. Мы применим одно горячее кодирование к категориальным функциям (batting_team, bowling_team и city), затем создадим конвейер, который будет иметь нашу модель ml. Также мы применим масштабирование к нашим данным, чтобы все значения попадали в один диапазон.
Здесь четыре наши модели я буду использовать алгоритм xgboost. Конечно, вы можете использовать любой другой алгоритм регрессии и выбрать тот, который дает наилучший результат.
Итак, теперь наша модель готова, и пришло время проверить ее показатель r2 и посмотреть, как она работает.
Это невероятно. Оценка R2 0,98. Теперь, честно говоря, это заставляет меня беспокоиться о случае переобучения. Теперь я держу это открытым для всех вас, чтобы настроить гиперпараметры и посмотреть, как это повлияет на нашу модель.
Я использовал Streamlit для развертывания этой модели. Вот быстрая демонстрация
Это все с моей стороны на сегодня.
Надеюсь, вы, ребята, узнали что-то новое и вам понравился этот блог. Если вам это нравится, чем поделиться им с друзьями. Заботиться. Продолжай учиться.
Вы также можете связаться со мной через мою учетную запись Linkedin — https://www.linkedin.com/in/harsh-mishra-4b79031b3/