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.
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 |
通过实验结果,我们看到,高阶数据和球员的位置信息对实验结果的提升比较大,是分析球员表现时比较有用的特征,而基础数据带来的只是副作用,因此高阶数据党获胜。
实验三中进行的只是比较粗粒度的特征选择,如若要获得进行更精确的特征选择,我们可以使用递归的方法逐个消除特征,但是这样运算量过大。