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

Весь код можно найти по следующей ссылке на Github:



Содержание

  1. Поиск данных
  2. Импорт
  3. Обработка данных
  4. Обучение
  5. Тестирование
  6. Резюме

Поиск данных

Я решил использовать данные с сайта Basketball-Reference.com для статистики игроков НБА 2019–2020: за игру. Вы можете найти данные на вкладке Времена года, а затем в разделе По G. Затем я экспортировал данные в виде файла .csv.

Импорт

Во-первых, давайте импортируем следующее:

  • pandas: библиотека с открытым исходным кодом, используемая для анализа и обработки данных специально для Python. Если вы не знакомы с pandas, обратитесь к https://pandas.pydata.org/ для получения дополнительной информации об установке pandas и ознакомлении с ней.
  • NumPy: библиотека Python, обычно используемая для работы с массивами и матрицами. Обратитесь к https://numpy.org/ для получения дополнительной информации.
  • train_test_split: используется для разделения набора данных на данные обучения и тестирования
  • KNeighborsClassifier: метод кластеризации с использованием K-Nearest Neighbor
  • RandomForestClassifier: метод классификации с использованием различных деревьев решений (следовательно, леса)
  • DecisionTreeClassifier: метод классификации, выполняемый путем разделения данных по определенному параметру.

Обработка данных

Сначала прочтите данные в файле .csv с помощью pandas. Для этой модели я решил использовать функции FG%, FT%, 3P%, TRB, AST и BLK, чтобы делать прогнозы для позиции, поскольку я думал, что они могут наиболее точно представить различия между пятью позициями.

Однако в этом списке игроков было несколько значений NaN для различных функций. Это могло произойти из-за того, что игрок не сделал никаких попыток (3P%, FG%, FT%). Я решил заменить значения NaN на медиану этого конкретного столбца, чтобы не сильно повлиять на результат или неточное предсказание модели.

Теперь мы готовы разделить данные на наборы для обучения и тестирования и обучить нашу модель!

Обучение

Наша импортированная функция train_test_split используется для разделения наших данных на две части - данные обучения и данные тестирования. Данные обучения (X_train, y_train) обычно составляют 75% строк данных, в данном случае 375 строк, а данные тестирования (X_test, y_test) - остальные 25%, в данном случае 125 строк.

Наконец, мы можем фактически обучать данные с помощью классификатора KNeighbors, классификатора случайного леса и классификатора дерева решений. Мы вызываем метод .fit, чтобы построить и обучить нашу модель с помощью обучающих данных.

Тестирование

Давайте протестируем нашу модель! Допустим, у нас был игрок НБА (он же Индиана Пэйсерс Сентер Майлз Тернер в 2020–2021 годах) со следующей статистикой:

  • FG%: 47.7%
  • FT%: 78.2%
  • 3P%: 33.5%
  • TRB: 6.5
  • AST: 1.0
  • BLK: 3,4

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

Мы также можем измерить точность наших трех моделей, используя функцию «среднего» NumPy, сравнивая прогнозы данных тестирования и фактические данные:

Вот точность на тестовом наборе:

  • Соседи: 0,50 или 50%
  • Случайный лес: 0,55 или 55%
  • Дерево принятия решений: 0,40 или 40%

Резюме

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