科比·布莱恩特投篮概率
根据科比过往投篮纪录,预测他的下一次投篮是否得分
Link: https://www.kaggle.com/c/kobe-bryant-shot-selection
题目描述
科比·布莱恩特于2016年4月12日在洛杉矶狂砍60分,这意味着他的NBA生涯完美地落下了帷幕。自17岁进入NBA,他的表现赢得了职业生涯的最高赞誉。
通过科比过去20年来投篮是否命中的数据,你能够预测他的每一次投篮结果吗?
数据集包含了过去二十年科比在球赛中投篮的情况,你的目标是预测此次科比的投篮是否能进。
小提示
- 首先对数据进行一些可视化研究,分析出一些科比投篮的特征,比如投篮坐标,投篮距离及投篮区域等,将原始数据有效地结合起来
- 选择特征,用一些较强的分类器(如random forest或svm等)进行训练,结合Kfold交叉验证,不断尝试特征组合。
先修技能
- 整合、归类和预处理训练集
- 会使用Random Forest
- 了解Logarithmic Loss的使用场景
- 了解Kfold的使用方法
术语解释
- Random Forest(随机森林):指的是利用多棵树对样本进行训练并预测的一种分类器。在机器学习领域,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定
- KFold(K折交叉验证):在机器学习中,将数据集A分为训练集(training set)B和测试集(test set)C,在样本量不充足的情况下,为了充分利用数据集对算法效果进行测试,将数据集A随机分为k个包,每次将其中一个包作为测试集,剩下k-1个包作为训练集进行训练。
输入格式
数据分为训练数据和测试数据,分别保存在train.csv和test.csv两个文件中。
其中训练数据主要包括20557条纪录,其中投篮成功与否(shot_made_flag)是需要预测的信息,分别对应下列信息:
- 投篮动作(action_type)
- 结合投篮类型(combined_shot_type)
- 比赛事件id(game_event_id)
- 比赛场次id(game_id)
- 投篮经度(lat)
- 投篮位置x坐标(loc_x)
- 投篮位置y坐标(loc_y)
- 投篮纬度(lon)
- 分钟倒计时(minutes_remaining)
- 比赛小节(period)
- 是否是季后赛(playoffs)
- 赛季(season)
- 秒钟倒计时(seconds_remaining)
- 投篮距离(shot_distance)
- 投篮成功与否(shot_made_flag): 这就是需要预测的Label
- 投篮区类型(shot_type)
- 投篮区域(shot_zone_area)
- 基本投篮区(shot_zone_basic)
- 投篮区距离(shot_zone_range)
- 队伍id(team_id)
- 队伍名(team_name)
- 比赛日期(game_date)
- 比赛配对(matchup)
- 对手(opponent)
- 投篮事件id(shot_id)
测试数据主要包括5140条数据,其中不包含投篮成功与否(shot_made_flag)。
输出格式
shot_id,shot_made_flag
3,0.5
4,0.5
5,0.5
etc.
评价
对于提交的文件submission.csv,我们将使用Logarithmic Loss作为作为评价指标,公式如下:
$$ logloss = -\frac{1}{N}\sum{i=1}^{N}\sum{j=1}^{M}y{ij}logp{ij}
$$
其中N代表测试数据集中的纪录数量, $$y{ij}$$代表是否正确分类,$$logp{ij}$$代表预测出来的概率
数据
完整代码
https://github.com/kdj842969/DataDescriptionBook/blob/master/KobeShotSelection/model.py
https://www.kaggle.com/dixhom/data-analysis-for-beginners/notebook
测评配置环境
python
pip install numpy
pip install pandas
pip install scikit-learn
测评代码
import pandas as pd
from sklearn.metrics import log_loss
test = pd.read_csv("./correct_submission.csv").sort_values('shot_id')
pred = pd.read_csv("./predict_submission.csv").sort_values('shot_id')
loss = log_loss(test['shot_made_flag'], pred['shot_made_flag'])
# loss越小越好,最小为0