【Python数学建模】nba预测,基于退役球员数据预测现役球员入选名人堂的可能性

模型目的:

本模型将基于逻辑回归模型,对历史和现役的nba球员数据进行建模,以是否进入名人堂作为模型预测的目标值进行预测,构建评分卡。以退役的nba球员数据和作为训练集来进行模型拟合,来预测现役球员中,谁进入名人堂的可能性更高。本模型最后产出为现役球员在当前的统计数据下入选名人堂的分数。

以下为建模部分


一. 环境准备:

1.1 编程语言:

Python 3.7.0

1.2 主要依赖的第三方包:

pandas, toad, scorecardpy, nba_api

1.3 数据准备:

数据来源:

nba_api: nba_api is an API Client for www.nba.com. This package intends to make theAPIs ofNBA.comeasily accessible and provide extensive documentation about them.

本模型将使用python第三方包nba_api中的api数据,初始建模指标主要包含以下四个部分的数据:

  1. 球员常规赛各项总数据。包含:总上场时间、总得分、总投篮次数、总投篮命中数等共计21个指标;

  1. 球员季后赛各项总数据。包含:总上场时间、总得分、总投篮次数、总投篮命中数等共计21个指标;

  1. 球员历史荣誉。包含:一阵次数、二阵次数、mvp次数等共计29个指标。其中,“Hall of Fame Inductee”(是否入选名人堂)为我们这次建模的y值,入选为1,不入选为0。

  1. 球队历史荣誉。包含:球队总冠军,如果某一球员在某一球员夺冠赛季中有过效力,则为拥有总冠军,共计1个指标。

所有数据通过球员id进行数据关联,本模型将使用所有nba历史及现役的且在nba有过常规赛和季后赛数据的球员作为建模样本,共计2800位球员,即2800条建模数据。

其中,将退役球员作为训练集,共计2465位球员,在这2465位球员中,有123位球员已入选名人堂,占比4.9%。本模型不设测试集,将使用在训练集上拟合的模型直接对剩余的335位球员进行预测,返回评分情况。

图1 常规赛数据

图2 个人荣誉数据

图3 模型KS和AUC值

数据获取时间为2023.03.14


二. 数据处理与特征筛选:

主要包含以下内容:

  1. 剔除缺失值高于0.9的特征(不是所有的球员都有个人荣誉信息);

  1. 剔除iv值低于0.05的特征;

  1. 剔除相关性大于0.75的特征;

  1. 对剩余的数据的缺失值进行缺失值填充;

  1. 剔除部分远古球员缺失的特征(如周最佳次数、月最佳次数等);

完成该部分后,模型还剩余35个特征。


三. 特征变换:

将上面已处理完的特征进行woe转换,将特征情况转换为woe值。本部分将使用scorecardpy的woe_bin方法进行分箱,分箱方法为卡方分箱。

此处为了使得总冠军次数等特征变得更有区分度,将对部分特征进行手动切分分箱点,提高分箱的区分性。

图4 分箱节点调整


四. 模型拟合:

使用逻辑回归建模,将转换后的建模数据进行模型拟合,得到拟合的模型,并对335条现役球员的数据进行预测,得出预测分。

图5 评分分箱情况


五. 模型评估:

本模型训练集的ks值为85,auc值为96。

图6 模型KS和AUC值

时间仓促,跑完之后一看数据感觉还行,就没有进行多余的优化了,主要还有以下几个部分可以进行优化:

  1. 建模数据可以进一步完善。如引入球员场均数据、per36数据、高阶数据等;

  1. 划分训练集和测试集。主要用来观察模型是否过拟合,但鉴于本模型正样本比较少,且效果还行,就没有划分测试集了。本模型可能会存在一定的过拟合。

  1. 调参。模型参数调整与不同样本浓度的设定。

  1. 多种模型的拟合预测和对比。本模型直接选用了逻辑回归模型,但亦可以选用xgb、决策树等算法进行多模型之间的比较。

  1. 建模步骤并未完整。woe转换后应再进行一次变量相关性处理。

  1. Y值的滞后性。由于球员退役后需要一定的时间才能进入到名人堂,故近期退役的球员可能够得上名人堂的入选,但由于时间还没够,暂没有入选(如文斯卡特),该部分少量数据亦会影响模型本身的效果。

图7 模型所预测的现役入选名人堂前三十球员

写在后面:

本文是一个技术帖,不希望各球星粉丝进行battle,有什么意见和想法的可以在下面进行讨论。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
首先,我们需要准备数据集。可以从NBA官网或其他数据源中获取NBA球员数据,包括球员的身高、体重、得分、助攻、篮板等数据,并将其存储在一个CSV文件中。 接下来,我们需要进行数据预处理。首先,将数据集分为训练集和测试集。然后,我们需要对数据进行归一化处理,以确保每个特征都具有相同的重要性。可以使用scikit-learn库中的MinMaxScaler进行归一化处理。 接着,我们可以使用scikit-learn库中的朴素贝叶斯分类器进行分类。在本例中,我们将使用高斯朴素贝叶斯分类器,因为我们的特征是连续值。 最后,我们可以使用训练集训练分类器,并使用测试集评估其性能。我们可以使用scikit-learn库中的accuracy_score函数计算分类器的准确性。 以下是实现代码的一个示例: ```python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler from sklearn.naive_bayes import GaussianNB from sklearn.metrics import accuracy_score # 读取数据集 data = pd.read_csv('nba_players.csv') # 将数据集分为训练集和测试集 train_data, test_data, train_labels, test_labels = train_test_split(data.drop(['Player', 'Pos'], axis=1), data['Pos'], test_size=0.2) # 归一化处理 scaler = MinMaxScaler() train_data = scaler.fit_transform(train_data) test_data = scaler.transform(test_data) # 训练分类器 classifier = GaussianNB() classifier.fit(train_data, train_labels) # 测试分类器 predictions = classifier.predict(test_data) accuracy = accuracy_score(test_labels, predictions) print('Accuracy:', accuracy) ``` 这个例子展示了如何使用贝叶斯分类器来预测NBA球员的位置。在这种情况下,我们使用了高斯朴素贝叶斯分类器,并使用身高、体重、得分、助攻和篮板作为特征来进行分类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

moyuweiqing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值