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

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

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

Как и раньше, вот как подойти к этому руководству:

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

Во второй части серии мы разберемся с классификацией — вторым строительным блоком в попытке новичка понять машинное обучение.

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

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

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

Кроме этого, это просто классификация. Теперь существует несколько моделей классификации, которые можно построить. Вот некоторые:

  • Логистическая регрессия (не судите о книге по обложке!)
  • K Ближайшие соседи
  • Классификация машин опорных векторов
  • Ядро SVM
  • Наивная байесовская классификация
  • Классификация дерева решений
  • Случайная классификация леса

Для этой модели мы собираемся использовать наивную байесовскую модель. Почему этот?

Давайте углубимся в особенности того, что входит в эту модель.

В наивной байесовской модели вся система классификации работает на основе теоремы теории вероятностей, которая называется Теорема Байеса.

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

Вам, наверное, интересно, что, черт возьми, это вообще значит?!

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

Допустим, у нас есть пул из 100 игроков, 40 из которых играют в Ла Лиге, а 60 — в Премьер-лиге. Допустим, тогда из всех 100 игроков 20 игроков являются нападающими (просто пойдите со мной).

Из этих 20 нападающих 15 — из Премьер-лиги, а 5 — из Ла Лиги.

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

Глядя на цифры, это легко. Ответ 15/60 (игрок нападающий из ПЛ / игрок из ПЛ).

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

  • P(B): это вероятность того, что игрок из PL — 60%
  • P(A): это вероятность того, что игрок является нападающим — 20 %.
  • P(B | A): это называется условной вероятностью, и вы читаете это следующим образом: «Какова вероятность того, что я получу B, ПРИ УСЛОВИИ, что у меня есть A». Итак, какова вероятность того, что игрок из ЛП, если у нас есть нападающий? Мы знаем, что из 20 нападающих 15 из ЛП. Таким образом, мы получаем 75%.
  • P(A | B): Это похоже на то, что мы только что сделали, но это не то же самое! Это звучит так: «Какова вероятность того, что я получу А, ПРИНИМАЯ ВО ВНИМАНИЕ, что у меня есть Б». Итак, какова вероятность того, что игрок является нападающим, учитывая, что у нас есть игрок из ЛП? Это то, что мы хотим знать.

Применим формулу:

P(A | B) = (0.75 * 0.20) / (0.60) = 0.25 = 25%

Итак, в основном Байес допускает строгий метод определения вероятностей. Как мы можем использовать это в классификации?

Итак, что мы пытаемся сделать в классификации? Давайте вернемся к тому, что мы определили как классификацию:

получив некоторую информацию об определенных объектах, мы пытаемся классифицировать — пометить — эти объекты.

Разве это не то же самое, что найти вероятность принадлежности объекта метке на основе некоторой информации об этом объекте?

Если мы сделаем это для обеих двух меток, мы сможем сравнить вероятности, заданные теоремой Байеса, и та, которая имеет более высокую вероятность, будет меткой, которую мы должны присвоить объекту.

И это то, что пытается сделать наивная байесовская модель.

Измерение точности

Хорошо, теперь предположим, что мы создали классификационную модель. Как определить его точность?

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

Но это ловушка!

Чтобы понять, как это сделать, мы создадим так называемую матрицу путаницы (поверьте мне, это не сбивает с толку).

Проще говоря, мы сравниваем наши предсказанные метки с нашими фактическими метками. Мы видим, где мы сделали все правильно и где мы сделали это правильно.

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

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

Здесь наш показатель точности: 140/200 или 70%

Что, если мы сможем повысить уровень точности, но ухудшим модель? Звучит невозможно, да? Что, если мы просто присвоим ВСЕМ значение 0. Вот что произойдет:

Теперь наша точность составляет 150/200 или 75%.

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

Когда мы строим нашу матрицу путаницы, обратите внимание на это:

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

Естественно, верхнее левое число будет больше нижнего правого числа, но следите за тем, чтобы нижнее правое число не равнялось нулю!

С этим покончено, давайте перейдем к набору данных и коду!

Построение нашей модели классификации

Я собрал наборы данных по сезонам АПЛ и Ла Лиги 2020/21 — это наш тренировочный набор данных. Кроме того, я собрал набор данных сезона 2019/20 Дортмунда, чтобы помочь нам построить эту модель — это наш тестовый набор данных.

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

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

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

Вот ссылка на блокнот Python: Код для модели

Вот ссылка на тренировочный набор данных: TrainingDataset

Вот ссылка на тестовый набор данных: TestDataset

Вот несколько инструкций по запуску:

  • Загрузите набор данных и сохраните его где-нибудь (помните, где вы его храните!)
  • Сделайте копию Блокнота, чтобы вы могли редактировать и импортировать данные!
  • Щелкните этот параметр папки:

  • Нажмите «Загрузить»:

  • Здесь найдите набор данных на своем компьютере/ноутбуке и загрузите его. (Примечание: этот набор данных будет существовать только для этого Блокнота, пока он у вас открыт. Если вы закроете Блокнот и перезапустите его, вам придется повторно загрузить набор данных!)
  • Теперь вы можете либо запустить все ячейки сразу, либо запустить их по одной, если внесете какие-то изменения.

  • Нажатие Run-All запускает все ячейки. Нажатие скобок (появится кнопка воспроизведения) запустит только эту ячейку.

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

Немного интерактивности:

Эта серия должна быть интерактивной, так как же создавать свои собственные модели/улучшать/изменять вещи?

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

Во-первых, нужно изменить тип модели классификации, которую вы используете:

Попробуйте реализовать простейшую модель классификации — логистическую регрессию:

from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()
classifier.fit(X_train, y_train)

Попробуйте классифицировать позиции, отличные от левых защитников! (Вот где настоящее веселье!)

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

Вот некоторые из позиций, которые может предложить мой тренировочный набор данных:

DC, DL, DR, MC, FW, AMC, MR, DMC, ML

Выберите один, а затем, прежде чем разбивать набор данных на обучение/тестирование, измените этот фрагмент кода:

dataset = pd.read_csv('TrainingDataset.csv',encoding='latin-1')
dataset['identifier']= np.where(dataset['pos']=="INSERT POSITION PICKED", 1, 0)
X = dataset.iloc[:, 1:-2].values
y = dataset.iloc[:, -2].values

Оттуда запустите модель, как и раньше! Посмотрите на различия, посмотрите, работает ли наша исходная модель на разных позициях, посмотрите, работает ли логистическая регрессия лучше на разных позициях — исследуйте! Некоторые позиции не дают хороших результатов (в основном очень нишевые позиции, такие как AMC и т. д.), но другие, такие как DC и DL, дают точные результаты!

Помните, что это базовая модель, основанная на самых основных статистических данных. Посмотрите, может ли добавление данных из FBref улучшить нашу классификацию!

Пожалуйста, не стесняйтесь обращаться ко мне в Твиттере, если у вас есть какие-либо вопросы. Оставляйте комментарии как улучшить!