kaggle 机器学习案例 NBA final project
当前位置:以往案例 > >kaggle 机器学习案例 NBA final project
2020-08-28

kaggle 机器学习案例 Groups will formulate a hypotheses, collect data, use techniques taught in class to study the data patterns or to predict future outcomes.

Description:

Groups will formulate a hypotheses, collect data, use techniques taught in class to study the data patterns or to predict future outcomes. Students are required to submit their code and present the project in class.

kaggle 机器学习案例kaggle 机器学习案例
Requirements:

The collected data must have 10,000 rows at minimum
Allthe machine learning algorithms taught in the class must be used


Notes:

不要用像Irisdata、credit card default data或IMDB movie rating这种满大街的datasets,用kaggle 的NBA数据集。–nba:
https://www.kaggle.com/pablote/nba-enhanced-stats
https://www.kaggle.com/drgilermo/nba-players-stats#Seasons_Stats.csvnba:
Code最后要在Anacoda的环境下运行
Code注释用英文
Project要fun和innovative,不能太boring(老师要求的)
Algo不仅限于教过的,但教过的一定都要用到
PPT不用做,但发一个word文档告诉我这份project的内容,包括:
每部分代码在做什么
各个algo的过程和结果,各个algo结果的区别,用不同的algo分别可能会遇到什么问题,最终哪个algo的结果更优秀,等等
因为需要上台present,然后老师还会提问,请尽可能详细地描述和解释,不懂的我会继续问。



结果不包括代码:

结合代码的文字说明:数据集处理在build_data.ipynb,实验在run_model.ipynb

处理好的数据集是final_data.csv

所有algos使用sklearn实现



Set up
Conda environment: python=3.6, numpy, jupyter, sci-kit learn, pandas, matplotlib(if needed)

Task:regression task,给定NBA球员在某一年中的数据和年龄/身高体重/位置等信息,预测该球员还剩下几年的职业生涯(本来想做的是给球员的全面明星赛前和全明星赛后的数据,预测下赛季的数据,后来处理完发现能够满足这个条件的数据只有2000左右条,所以换了个想法)



数据集
Collected from: https://www.kaggle.com/drgilermo/nba-players-stats

根据这个数据集重新处理,得到我们的数据集:

选择的features:

Age: 年龄(which I think is the most importance)
Year: 当前年份
物理数据:
height: height

weight: weight

Position:
原本数据集中的pos是字符串,表示为“C”,“PF”等,但是这种字符串类型不能输入到algo里面去,所以我们对这个feature做one-hot编码:

新插入五个特征Pos_C, Pos_PF, Pos_SF, Pos_SG, Pos_PG,如果一个数据的position中有哪个位置,就把这个五个Pos_前缀的特征中对应的哪个置为1,否则置为0

Basic data feature:
G: games played

GS: games started首发场数

MP: Minutes Played

FG: Field Goals

FGA: Field Goal Attempts

3P: 3-Point Field Goals

3PA:3-Point Field Goal Attempts

2P:2-Point Field Goals

2PA:2-Point Field Goal Attempts

FT:Free Throws

FTA:Free Throw Attempts

ORB:Offensive Rebounds

DRB:Defensive Rebounds

TRB:Total Rebounds

AST: Assists

STL: Steals

BLK:Blocks

TOV: Turnovers

PF: Turnovers

PTS: Points

High order data feature:
PER: Player Efficiency Rating

TS%:True Shooting %

TRB%: Total Rebound Percentage

AST%: Assist Percentage

STL%: Steal Percentage

BLK%: Block Percentage

TOV%: turnover Percentage

USG%: Usage Percentage

WS/48: Win Shares Per 48 Minutes

回归目标:

year_left: 从数据中的那一年计算,球员的职业生涯还有多少年



实验
Regression algos:

linear regression, Lasso, Ridge,

RANSAC(on linear regression),

decision tree regressor,

support vector regressor(rbf kernel, linear kernel, polynomial kernel),

multilayer perceptron regressor(MLP regressor)



各个algo实现的细节:



Linear regression:没什么



Lasso:

Lasso 有个hyperparameter: alpha,这个alpha我们通过在训练集上用5-fold cross validation找到最优值,就是计算每个alpha在5-fold cross validation上的mean squared error分数,选分数最小的那个。

Lasso 的object function不是convex,不可以直接解方程得到coefficient的closed-form solution,所以只能用迭代优化的思想,由于数据集的原因,迭代很难收敛,因此Lasso会跑的相对久一点,解决方法可以通过调低learning rate,或者调低相邻两次iteration的loss变化的threshhold,使得algo对于convergence的tolerance变高。



Ridge:

Ridge也有一个alpha要调,采用跟lasso一样的调优方法。Ridge的loss是convex的,可以直接求closed form solution



RANSAC:

RANSAC就是用迭代的思想,每次拿一下data points给algo fit,然后判断这些points 是不是inlier,从而提高模型的鲁棒性。我们在linear regression上应用RANSAC。RANSAC的有一个可以调的hyperparameter就是inlier占所有数据集的比例。我们采用和lasso一样的思想,用5-fold CV找到最优的比例。



Decision tree regressor:

Decision tree regressor 可以调节的hyperparameter是max tree depth,决策树的最大深度,还是采用5-fold CV的思想调参



Rbf-kernel svr:

选用三个kernelized SVR 来做试验是由于在实验前面三个linear model的时候发现Performance不是很好,所以我怀疑data distribution是non-linear,所以想用kernel function 把data points映射的一个high-demensional但是线性的空间.

Rbf-kernel: https://en.wikipedia.org/wiki/Radial_basis_function_kernel

实验时没遇到什么问题



Linear-kernel svr:

Linear-kernel: https://en.wikipedia.org/wiki/Kernel_method

在没有对数据进行standardizaiton的时候,linear-kernel svr要很长时间才能收敛,而且实验效果也不好(效果附后)



Poly-kernel svr:

Polynomial-kernel: https://en.wikipedia.org/wiki/Polynomial_kernel

在没有对数据进行standardizaiton的时候,polinomial-kernel svr要很长时间才能收敛,而且实验效果也不好(效果附后)



MLP regressor:没什么



实验一&二:

实验一是在raw data上实验上述所有algo的性能,实验二对raw data进行了standardizaiton,具体就是求出训练集的均值u和标准差s,然后对训练集和测试集的每个x,做x_scale = (x – u)/s,然后在standardization后的数据上跑各个algo:

实验一,二各个algo在test set上的mean squared error:

Raw data Scaled data
Linear regression 10.5552 10.5552
Lasso 10.6073 10.5824
Ridge 10.5566 10.5537
RANSAC 10.7147 10.7241
Decision tree regressor 10.8330 10.8330
Rbf-SVR 18.6447 9.6757
Linear-SVR 69.2191 10.9789
Poly-SVR 1.0166*10^22 10.9278
MLP regressor 12.4102 10.4888
结果分析:

预想中lasso和ridge应该能解决linear regression 会over-fitting的问题,但是在这个数据集中,经过hyperparameter finetuning 的lasso和ridge比linear regression的效果还差。
Linear regression,Lasso, ridge,RANSAC这些linear的algorithm在这个数据集上的表现都不是很好,说明data point的分布不是线性可分割的
三个kernelizedSVR在raw data上的表现不是很好,并且需要运行很长的时间,但是standardization解决了这个问题,standardization对三个kernelized SVR的性能提升了很多,特别是rbf-kernelized SVR,表现也超过了前面所有的线性algorithm,说明kernelize可以解决数据线性不可分割的问题
Standardization对于多个algo都有或多或少的提升,说明这个提高算法性能的一个必要手段
虽然MLP regressor的实验结果不是最好,但是我认为这并不是MLP性能上的不足,因为实验结果显示,MLP在training set上的mean squared error低至4.5752,远超其他的algo,这说明MLP,或者说deep learning 拟合数据的能力很强,但是也很容易遇到over fitting。


实验三:特征选择(基础数据VS高阶数据)

在实验一&二中,我们看到实验结果并不是很令人满意,除了算法本身有over-fitting,hyperparameter finetuning的技术上需要解决的问题外,我认为更应该关注数据本身,因此实验三中我将采取一些特征的组合,在实验二中表现最好的rbf-kernelized SVR上进行实验,找出一些比较好的特征组合。并且我们通过这个实验,也将看到球员的那些数据最能说明球员剩下的职业生涯长度,以终结各大体育论坛上“基础数据党”和“高阶数据党”的争论。

实验的特征组合如下:

physical data: Age, weight, height
physical data and position :Age, weight, height, Pos_C, Pos_PF, Pos_SF, Pos_SG, Pos_PG
basic data: Age, G, GS, MP, FG, FGA, 3P, 3PA, 2P, 2PA, FT, FTA, ORB, DRB, TRB, AST, STL, BLK, TOV, PTS
high order data: Age, PER, TS%, TRB%, AST%, STL%, BLK%, TOV%, USG%, WS/48
basic + high order: Age, G, GS, MP, FG, FGA, 3P, 3PA, 2P, 2PA, FT, FTA, ORB, DRB, TRB, AST, STL, BLK, TOV, PTS, TS%, TRB%, AST%, STL%, BLK%, TOV%, USG%, WS/48
basic + position: Age, G, GS, MP, FG, FGA, 3P, 3PA, 2P, 2PA, FT, FTA, ORB, DRB, TRB, AST, STL, BLK, TOV, PTS, Pos_C, Pos_PF, Pos_SF, Pos_SG, Pos_PG
high order + position: Age, TS%, TRB%, AST%, STL%, BLK%, TOV%, USG%, WS/48, Pos_C, Pos_PF, Pos_SF, Pos_SG, Pos_PG


实验结果如下(指标mean squared error):

Physical only 16.9202
Physical+position 15.9974
Basic only 18.3330
High order only 14.8018
Basic+high order 18.6215
Basic+position 18.2678
High order+position 14.4444


通过实验结果,我们看到,高阶数据和球员的位置信息对实验结果的提升比较大,是分析球员表现时比较有用的特征,而基础数据带来的只是副作用,因此高阶数据党获胜。

实验三中进行的只是比较粗粒度的特征选择,如若要获得进行更精确的特征选择,我们可以使用递归的方法逐个消除特征,但是这样运算量过大。





在线提交订单