注册kaggle后当然是先熟悉了compete(一些题目)和cources(一些很好的零基础入门教程)。然后在一个题目中又有data(要处理的数据集)、notebooks(大佬们的题解)、discussion(顾名思义)、leaderboard(差不多就是rank)这几部分。
目录
- 前言
- 一、用什么写?
- 二、摸鱼历程
- 1.可视化
- 2.数据预处理
- 2.1.一些特定的预处理
- 2.2.sklearn的预处理函数
- 3.选择模型
- 3.1.MPL
- 3.2.RandomForest
- 3.3.SVM
- 总结
前言
首先,选定的题目是Kobe Bryant Shot Selection。
其次,个人感觉python不太需要刻意去学一遍,有其他语言基础的我认为看看代码格式直接上手就行。
看到数据集列名的那一瞬间,一个篮球白痴懵逼了, 然而她搜索了篮球规则和篮球场地之后,决定还是先做做看数据的可视化来熟悉数据吧。
一、用什么写?
jupyter真的是太太太太太好用了。写python的必备利器,可视化的时候和看数据的时候各种方便。强推。
基本工具的话当然还是numpy、pandas、sklearn。这些反正都有文档,个人来讲不论什么时候文档都是最好用的入门资料。
二、摸鱼历程
1.可视化
首先熟悉数据可以用unique和group看看内容。然后再去做可视化。 作为一条咸鱼,一开始不知道可视化成什么样、做哪些可视化合适,于是在notebook里面找了第一个和一个新手向的note,开始看大佬们的分析,下面放个易懂的新手教程:
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真的是特别好用,这里奉上文档(用户指南)和效果图(时间匆忙随便截的请不要介意):
2.数据预处理
2.1.一些特定的预处理
肯定要先在理解了数据基本含义的基础上去思考怎么处理。
这个例子里面要考虑时间的合并(分钟和秒)和分开(年月日分开)。
还要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)
2.2.sklearn的预处理函数
在cources里面其实有数据预处理的简单教学例子,不过这里我还是通过skearn的文档直接学习了预处理,文档真的很好用啊!
当然还有特征提取什么的,尽可以多探索探索文档目录来看自己要学什么用什么:
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()
3.选择模型
你想知道我从哪里选择模型嘛?从sklearn文档的目录里,我把列出的几种方法都看了一遍,第一天选择了tree、svm和mpl,做出来结果都是10+分,这明显有问题,第二天,我发现啊原来结果要概率而不是简单的分类决策。于是把决策树换成了随机森林,把.predict换成了.predict_proba。
3.1.MPL
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
我想直接看看大佬们对参数的理解,于是就去搜了一下参数。
大佬们早已为我们准备好了一切。新手完全不用怕,理解了参数含义之后就直接上手调参做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)
结果还是挺正常的,新手上路排在倒数但不至于垫底,很好,继续尝试。
3.2.RandomForest
虽然我觉得文档里神经网络那部分的描述和这个题目的要求更匹配一些,但是notebook里面大多都是用的随机森林。文档如下:
https://scikit-learn.org/stable/modules/ensemble.html https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html
看了基本文档可能还是不太会调参,没关系,我找了一篇带有参数推荐的博客,把推荐值试了试,菜鸟站在了大佬的肩膀上:
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好了一点,但是也都差不多就这样吧。
3.3.SVM
文档
https://scikit-learn.org/stable/modules/svm.html https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC
参数
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之下了。不过对于新手来说,也是个还不错的入门基础中的基础啦!
总结
文档真香。
不能光摸鱼,还得多学点深层的东西。