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

Историю Tableau, содержащую визуализации, связанные с этим проектом, можно найти здесь.

Блокнот ipython, содержащий код для этого проекта, можно найти здесь.

Мы использовали данные, взятые с сайта basketball-reference.com. Мы включили собранную статистику регулярного сезона и плей-офф, матчи всех звезд и различные награды. Мы также использовали те же критерии, что и Basketball-reference.com, чтобы решить, каких игроков будет использовать наша модель для обучения. Мы учитываем только игроков, которые провели большую часть своей профессиональной карьеры в НБА и набрали не менее 50 акций выигрышей за карьеру.

Построение модели

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

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

Мы также удаляем игроков, которые еще не имеют права участвовать в голосовании. Зал требует, чтобы игроки были на пенсии не менее 3 лет, прежде чем они будут рассмотрены.

Затем мы вручную выбираем некоторые функции, которые, по нашему мнению, заслуживают внимания. Мы определили 26 функций, которые могут быть предиктивными. С большим набором данных мы можем начать с полного набора функций. Но с этим небольшим набором данных (141 обучающее наблюдение) слишком много переменных затруднит обучение наших моделей.

Мы также создаем функцию с именем print_metrics для вывода функций точности и потерь для наших моделей.

Мы используем показатель Брайера в качестве нашей метрики. Мы используем эту метрику, потому что она сильно наказывает большие ошибки, и мы не хотим, чтобы наши окончательные вероятности были очень далеки от истины.

Логистическая регрессия

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

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

Вывод:

6 selected features
['Count_mvp', 'All_stars', 'Championships', 'box_plus_minus', 'value_over_replacement_player', 'ppg'] 

Training Accuracy:  0.8272251308900523 
Validation Accuracy:  0.9 
Out of Bag Accuracy:   
Training Loss:  0.10711748964899732 
Validation Loss:  0.0705776399962272

Когда мы печатаем коэффициенты нашей оптимальной модели логистической регрессии, мы получаем следующее.

                               Coefficients
Count_mvp                          1.569915
All_stars                          2.117843
Championships                      1.551612
box_plus_minus                     1.191951
value_over_replacement_player     -1.241967
ppg                                0.437403

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

Когда мы это делаем, мы получаем следующие коэффициенты.

Training Accuracy:  0.8272251308900523 
Validation Accuracy:  0.9 
Out of Bag Accuracy:   
Training Loss:  0.1148539455765552 
Validation Loss:  0.07083869752849309

                Coefficients
Count_mvp           1.681519
All_stars           2.267450
Championships       1.590180
box_plus_minus      0.114319
ppg                 0.228630

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

Случайный лес

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

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

Вывод:

5 selected features
['All_stars', 'Championships', 'player_efficiency_rating', 'win_shares', 'ppg']
Training Accuracy:  0.9790575916230366 
Validation Accuracy:  0.8666666666666667 
Out of Bag Accuracy:  0.8743455497382199 
Training Loss:  0.029356830069540672 
Validation Loss:  0.08266228037366541

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

Вывод очков за игру и чемпионаты:

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

Объединение оценок

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

Вывод:

Training Accuracy:  0.9476439790575916 
Validation Accuracy:  0.9666666666666667 
Training Loss:  0.06099515571971145 
Validation Loss:  0.03333333333333333

Эта модель, кажется, работает лучше, чем отдельные модели. Так что мы оставим это как нашу окончательную модель.

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

Последний шаг — протестировать модель на нашем тестовом наборе.

Вывод:

Ensemble: 
0.8571428571428571 0.1364061293309076

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

Визуализация модели

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

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

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

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

Спасибо за чтение!