预测NBA全明星

以下内容为zhenglit原创,供大家学习研究,转载请声明来源。

一、背景和数据
NBA每年都会举办一次全明星赛,用于回馈球迷和社会。每一个篮球明星都是经过一定的票选选出来的,虽然选法不尽相同,但总体上一个原则:越优秀的运动员越可能被选上。怎么定义优秀?一般从运动员的得分、防守、球队胜利等方面来评价(当然还有可能基于运动员当年的市场火热程度/是不是招黑等),每个投票者(球迷或教练)心里都会有一个标准。因此可以根据运动员赛季的表现来预测谁可以被选上NBA全明星。以下数据给出了12-13、13-14、14-15、15-16、16-17五个赛季的球员的所有赛场相关数据,用前四个赛季作为训练集,第五个赛季作为测试集,来建立一个NBA全明星候选人预测模型。

#下表:数据集字段名,名称含义可根据英文字母识别。

idplayer_nameseasonteamappearancesstarter_apearancesappearances_time
field_goal_percentageshots_madeshots_trythree_pointer_percentagethree_shots_madethree_shots_tryfree_throws_percentage
free_throw_madefree_throws_tryreboundsoffensive_reboundsdefensive_reboundsassistssteals
blocksturnoversfoulsscoreswinslosesis_allstar

数据:https://pan.baidu.com/s/1PfHl3o-PlBMgzblSv3wrHw 提取码: 16cg

二、相关代码

1、数据预处理

data <- read.csv("nba_playerdata.csv") #读取数据
data_clean <- na.omit(data) #删除NA行
data_train <- data_clean[which(data_clean$season != "16-17"),] #构造训练集
length(data_train$id) #1643行
data_test <- data_clean[which(data_clean$season == "16-17"),]#构造测试集
length(data_test$id) #439行
data_train <- subset(data_train,select = -c(id,player_name,season,team)) #剔除训练集非特征属性
length(data_train) #24个特征
data_test <- subset(data_test,select = -c(id,player_name,season,team)) #剔除测试集非特征属性
length(data_test) #24个特征

2、模型建立与预测

pre=glm(is_allstar~.,data=data_train,family=binomial(link="logit")) #进行模型训练,用的是逻辑回归模型
summary(pre)
predict=predict.glm(pre,type="response",newdata=data_test) #用训练好的模型进行预测,得出每一个case的概率
pre_allstar <- ifelse(predict > 0.8,1,0) #以0.5为门槛进行0-1变换
sum(pre_allstar)  #0.8的门槛能预测出17个全明星,但每年两只球队共有24个全明星
pre_allstar <- ifelse(predict > 0.6,1,0) #不断尝试圈出24个全明星
sum(pre_allstar)  #0.6的门槛圈出24个明星
pre_result <- data_clean[which(data_clean$season == "16-17"),] 
pre_result$predict <- predict
pre_result$pre_allstar <- pre_allstar
write.csv(pre_result,"pre_result.csv")  #读出预测结果
pre_allstar_case <- pre_result[which(pre_result$pre_allstar == 1),]
pre_allstar_case$player_name # 打印出预测的全明星名单
real_allstar_case <- pre_result[which(pre_result$is_allstar == 1),]
real_allstar_case$player_name #打印出实际的全明星名单

3、模型评估

accuracy <- 1-sum(abs(pre_result$pre_allstar-pre_result$is_allstar))/length(pre_result$is_allstar)
accuracy #模型准确度为0.968
recall <- sum(real_allstar_case$pre_allstar)/sum(real_allstar_case$is_allstar)
recall <- #模型召回率为0.708
library(pROC)
modelroc <- roc(data_test$is_allstar,predict)
plot(modelroc, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),grid.col=c("green", "red"), max.auc.polygon=TRUE,auc.polygon.col="skyblue", print.thres=TRUE)
# 画出ROC曲线,AUC=0.988

三、结果与评价

我比较了一下实际名单和预测名单,如果纯粹按照模型结果来看,16-17赛季肯巴-沃克、卡梅罗-安东尼、凯尔-洛瑞、马克-加索尔、保罗-米尔萨普、德安德鲁-乔丹、德雷蒙德-格林这7位不应该入选全明星,能进全明星可能是由于当时的舆论及个人魅力(当然这一点是入选全明星的重要参考),比如格林借助勇士风光入选,小乔丹社交平台拉票,安东尼过往明星效应延续等等。如果纯从技术和球队战绩角度(这也是模型的视角)来看,取代这7个人的应该是:达米安-利拉德、卡尔-安东尼-唐斯、C.J.麦科勒姆、布雷克-格里芬、凯文-乐福、克里斯-保罗、拉马库斯-阿尔德里奇,利拉德、麦科勒姆、阿尔德里奇都是我非常喜欢的球员(我觉得至少这三个应该入选),这一年利拉德没进全明星也引起了很大的争议。

四、后续

1、在这类的预测模型中应该加入市场和舆论因素,我考虑从社交平台挖掘一些球迷情绪数据并且结构化,作为特征变量。

2、类似的模型也可以做MVP候选人的预测,甚至做MVP选票得分的预测,后续会考虑做类似的回归模型。

3、我将不断尝试采用其他更好的模型来进行预测和评估,并且在2021年全明星赛前用前两个赛季预测当年的全明星队伍。

4、实际评选的时候东部会选出12个,西部会选出12个,还要讲究各个位置的配比,因此可以需要对训练集测试集进行取子集,然后多次建立模型,本文还没有考虑的这么复杂。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值