首先,选定的题目是Kobe Bryant Shot Selection。
其次,个人感觉python不太需要刻意去学一遍,有其他语言基础的我认为看看代码格式直接上手就行。
jupyter真的是太太太太太好用了。写python的必备利器,可视化的时候和看数据的时候各种方便。强推。
基本工具的话当然还是numpy、pandas、sklearn。这些反正都有文档,个人来讲不论什么时候文档都是最好用的入门资料。
https://www.kaggle.com/dixhom/data-analysis-for-beginners/notebook
开始写代码,首先准备好要用的module,把数据读好:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
raw = pd.read_csv(
'~/data/data.csv')
raw.head()
读好之后可以df.shape看一下数据规模。
常用的可视化工具就是plot、scatter、sns.pairplot这些,sns.pairplot真的是特别好用,这里奉上文档(用户指南)和效果图(时间匆忙随便截的请不要介意):
http://seaborn.pydata.org/generated/seaborn.pairplot.html
肯定要先在理解了数据基本含义的基础上去思考怎么处理。
这个例子里面要考虑时间的合并(分钟和秒)和分开(年月日分开)。
还要drop掉一些经过可视化证实无用的数据。
inp = raw
inp['remaining_time'] = inp.loc[:,'minutes_remaining'] * 60 + inp.loc[:,'seconds_remaining']
inp = inp.drop(['minutes_remaining','seconds_remaining'], axis = 1)
inp['game_year'] = inp['game_date'].str.split('-').str[0]
inp['game_mon'] = inp['game_date'].str.split('-').str[1]
inp['game_day'] = inp['game_date'].str.split('-').str[2]
#strim useless data
inp = inp.drop(['team_id','team_name','game_event_id', 'season', 'game_id','shot_zone_range',
'lat','lon','matchup','shot_id','combined_shot_type','game_date'], axis = 1)
在cources里面其实有数据预处理的简单教学例子,不过这里我还是通过skearn的文档直接学习了预处理,文档真的很好用啊!
https://scikit-learn.org/stable/modules/preprocessing.html
当然还有特征提取什么的,尽可以多探索探索文档目录来看自己要学什么用什么:
https://scikit-learn.org/stable/modules/feature_extraction.html
这里我发现这个预处理函数会把列名也处理掉了,所以就加了个列名还原的步骤:
#Characteristic numeralization
from sklearn import preprocessing
import re
enc = preprocessing.OrdinalEncoder()
categorical_vars = ['action_type', 'shot_zone_area','shot_zone_basic','opponent',
'game_year','game_mon','game_day','shot_type']
tmp = pd.DataFrame(enc.fit_transform(inp[categorical_vars]))
inp = pd.concat( [inp, tmp], 1 )
inp = inp.drop(categorical_vars, 1)
#列名还原
for index in range(len(categorical_vars)):
inp.rename(columns = { index : categorical_vars[index]}, inplace=True)
inp.head()
user guide:
https://scikit-learn.org/stable/modules/neural_networks_supervised.html
API:
https://scikit-learn.org/stable/modules/classes.html#module-sklearn.neural_network
我想直接看看大佬们对参数的理解,于是就去搜了一下参数。
https://blog.csdn.net/weixin_38278334/article/details/83023958
大佬们早已为我们准备好了一切。新手完全不用怕,理解了参数含义之后就直接上手调参做first try吧。
from sklearn.neural_network import MLPClassifier
clf1 = MLPClassifier(solver='adam', activation='tanh',alpha=1e-6,hidden_layer_sizes=(60,17),
max_iter=50,verbose=1,learning_rate_init=0.01,warm_start=1,random_state=0)
clf1.fit(train, train_y)
out1 = clf1.predict_proba(submission)
print(out1)
结果还是挺正常的,新手上路排在倒数但不至于垫底,很好,继续尝试。
虽然我觉得文档里神经网络那部分的描述和这个题目的要求更匹配一些,但是notebook里面大多都是用的随机森林。文档如下:
https://scikit-learn.org/stable/modules/ensemble.html
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html
看了基本文档可能还是不太会调参,没关系,我找了一篇带有参数推荐的博客,把推荐值试了试,菜鸟站在了大佬的肩膀上:
https://blog.csdn.net/VariableX/article/details/107190275?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import confusion_matrix
clf3 = RandomForestClassifier(max_features='sqrt',max_depth=10,verbose=1)
clf3.fit(train, train_y)
out3 = clf3.predict_proba(submission)
print(clf3)
结果确实比MLP好了一点,但是也都差不多就这样吧。
文档
https://scikit-learn.org/stable/modules/svm.html
https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC
参数
https://blog.csdn.net/transformed/article/details/90437821
from sklearn import svm
clf2 = svm.SVC(kernel='sigmoid',probability=True,max_iter = 50,verbose=True)
clf2.fit(train, train_y)
out2 = clf2.predict_proba(submission)
print(out2)
#输出结果
sub = pd.read_csv("~/data/sample_submission.csv")
sub['shot_made_flag'] = out2
sub.to_csv("~/data/submission2.csv", index=False)
最终支持向量机的结果是三者之中最好的,当然我调参是靠直觉调整的,所以不敢说支持向量机就是好。另外,其实这些得分排名都在50% Chance Benchmark之下了。不过对于新手来说,也是个还不错的入门基础中的基础啦!
文档真香。
不能光摸鱼,还得多学点深层的东西。