Пять основных позиций в баскетболе довольно просты: разыгрывающий, атакующий защитник, легкий нападающий, мощный нападающий и центр. В этой статье мы будем изучать данные и использовать различные модели машинного обучения для прогнозирования позиций игроков НБА.
Весь код можно найти по следующей ссылке на Github:
Содержание
- Поиск данных
- Импорт
- Обработка данных
- Обучение
- Тестирование
- Резюме
Поиск данных
Я решил использовать данные с сайта 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% в его прогнозах для данных тестирования.