最近寫了Kaggle的一個playground項目——預測科比投籃是否命中https://www.kaggle.com/c/kobe...,主要使用python的pandas和sklearn包。 這裏和你們分享一下。python
首先就是進入Kaggle官網https://www.kaggle.com/,Kaggle是一個專門數據競賽的網站。常常會有一些有獎的競賽,固然入門也能夠選101和playground的有趣的例子進行練習。官網給出的經典例子就是預測Titanic乘客的生存機率。git
固然第一步就是註冊。github
註冊後就能夠直接選擇本身想參加的競賽了,本文都以預測科比投籃命中爲例。註冊以後咱們點擊上方的Competions,也就是圖中上方第一個紅框來進入競賽選擇頁面。接着點擊下圖第二個紅框ALL來顯示全部的競賽。而後咱們能夠選第三個紅框,裏面有getting started(101)和playground。都是難度稍低的競賽很適合練習。算法
競賽選擇頁面c#
其中在gettind started裏面的項目應該都是有tutorials的,都會有相關的數據處理和模型選擇的教程。https://www.kaggle.com/c/tita... 想作數據處理的也能夠先看這個例子。咱們仍以預測科比投籃爲例,從all的playground裏找到(https://www.kaggle.com/c/kobe... 。機器學習
進去以後大概就是這個樣子的,咱們點擊Data,進入數據頁面,上面data.csv.zip是總的數據,包括訓練集和測試集。下面的sample_submission....是提交結果的demo。工具
這裏給以前沒接觸過機器學習的同窗講解一下什麼是訓練集和測試集,瞭解機器學習的請跳過這三段。訓練集是用來訓練你的機器學習模型的。就好比我給了你一堆貓和狗的圖片,而且我給每張圖片都標記上了這張圖是‘貓’仍是‘狗’。而咱們的目的是爲了解決若是給你不少(好比1億張)新的貓或狗的圖片,並且沒有標記究竟是貓仍是狗,你必定懶得去作(對,我不相信有人能這麼有毅力!!!)會想讓機器解決。但機器學習,你也要教它一些事實,好比長得像圖片A的就是狗,長得像圖片B的就是貓。也就是把圖片和正確的標記給機器,讓機器可以根據你給他的這些數據來學習到一個判別方法,而給它的‘圖片和正確的標記’就是訓練集。學習
給了訓練集以後機器是學習了,但它學的好很差呢?這就須要用到測試集,測試集也包含圖片和正確的標記。這就比如咱們學生時代的考試,你要去考考機器,看它學的怎麼樣,從而才知道你訓練的好很差。但測試集不能和訓練集重複,防止它死記硬背,就像當年考數學,老師會把題修改一下讓你作同樣。測試
因此咱們通常會將獲得的全部標記好的圖片(包含對應正確標記)分爲兩組大體9比1的樣子,分別是訓練集和測試集。來對機器進行訓練和測試。網站
回到正軌,解壓上面下載的文件,打開csv文件。咱們會看到——
除了表頭,一共有30697行,並且有數字有字符串,看得頭都大了,怎麼辦!
還好咱們有電腦,有python,有別人寫好的工具包pandas!
第一步,咱們進入python,在命令行輸入python
第二步,導入pandas
>>import pandas as pd
若是報錯,說明你沒安裝pandas,去安裝吧
第三步,載入csv文件並查看數據,下面的文件名寫你本身的文件路徑
>>data = pd.read_csv('data/data.csv') >>print data.info()
打印結果以下,能夠看出顯示了csv文件的各列名稱,數量,是否全空,類型(這裏不是數字都是object),還有一些統計信息等等。
其中shot_made_flag就是投進與否,也就是結果/標籤/分類。1表示投進,0表示沒進。
第4步,咱們能夠查看數值類數據的一些分佈狀況,這裏只是部分。
>>print data.describe()
第5步,查看非數值類數據分佈
>>print data.describe(include=['O'])
可是這樣咱們仍是不知道這些離散值有哪幾類,好比shot_type到底一共有哪幾種呢?像這樣。
>>print set(data['shot_type'].tolist())
打印結果:set(['3PT Field Goal', '2PT Field Goal'])
若是你還想看每類下面的統計數字。再像這樣。
>>> print data['shot_type'].value_counts() 2PT Field Goal 24271 3PT Field Goal 6426 Name: shot_type, dtype: int64
總之,pandas的功能超乎你想象。
不過只能看數據分佈是不夠的,機器如今仍是隻能識別數字,因此上面的object類型的數據,咱們仍是要轉換成數字。這裏咱們用最簡單的映射辦法來實現,映射按照次數來實現,好比上面的‘shot_type’,咱們按照出現的次數從0向上排,好比這裏2分球咱們認爲是0,3分球認爲是1。
除了這些問題以外,咱們還發現有些數據是沒有用處的,好比team_id、team_name都是湖人,沒什麼用,還有就是shot_distant和loc_x、loc_y實際上是有重複信息的。因此咱們進行了篩選和處理了一部分,這一步在數據處理術語叫數據預處理。從而獲得一個新的數據表pretreated_data(pandas的DataFrame格式)。代碼地址https://github.com/Cauchyzhou... 。
預處理後的數據
接着咱們還要拆分數據到訓練集和測試集,注意保存的路徑也要根據本身的實際狀況來。
PS:這裏的測試集沒有結果/標籤,是由於咱們的測試是直接將預測的結果傳到網站上,網站會返回一個預測結果與真實結果的偏差。
>>notnull = pretreated_data['target'].notnull() >>isnull = ~ notnull >>train_set = pretreated_data[notnull] >>predict_set = pretreated_data[isnull] >>train_set.to_csv('data/train_set.csv') >>predict_set.to_csv('data/predict_set.csv')
到這裏,數據預處理基本就結束了。
接着咱們就要用訓練集,訓練了,咱們這裏使用傳統的機器學習方法,而傳統方法,最好的就是用sklearn這個工具包,全名scikit-learn。官網地址:http://scikit-learn.org/stable/
這個包有多粗暴呢,就是粗暴到你能夠不瞭解任何算法細節,直接調用就行了(固然仍是推薦理解一下算法,畢竟沒有最好的算法,只有最合適的算法)
這裏咱們就用最簡單的決策樹來預測結果。
>>from sklearn import tree >>import pandas as pd >>data = pd.read_csv('data/train_set.csv') >>X = data.drop('target',axis=1) #去掉結果/標籤列 >>Y = data['target'] #訓練集的結果 >>clf = tree.DecisionTreeClassifier() >>clf.fit(X,Y)
通過上面幾句話,咱們就得到了訓練好的模型clf。接着咱們就能夠用這個模型來預測測試集的結果了。
>>predict = pd.read_csv('data/predict_set.csv') >>X_ = predict.drop('target',axis=1) >>out = clf.predict(X)
這樣就預測好了,是否是很粗暴!接下來保存結果。
>>OutDf = pd.DataFrame(index= predict['shot_id'].values,columns=['shot_made_flag']) >>OutDf['shot_made_flag'] = out >>OutDf.to_csv('DT_out.csv')
好了,這樣咱們總體的一個機器學習的簡單項目就完成,但咱們仍是要看一下效果。咱們生成的csv文件是這樣式的~第一列是shot_id,第二列是shot_made_flag
咱們須要在線提交,這裏保存的結果格式是點擊紅框(這裏可能不太同樣,由於我曾經提交過,不是第一次提交)
而後咱們就會進入到這個頁面,找到綠色背景的數字1那裏,咱們把本身的csv文件拖進去,就會出現2那裏的損失得分,越小越好,由於我用的是最簡單的決策樹,只能處理線性問題,顯然這個問題並非線性的,因此得分不好。
由於這個競賽已經結束了,因此不會有排名,只能進到3Leaderboard根據本身的得分來得出本身的排名。
按照123步查看本身訓練的模型結果
這樣,咱們的一個總體的kaggle競賽的流程就結束了,沒想到碼博客仍是挺累的,並且簡書修改博客居然會致使從新上傳圖片。寫了2個半小時,改了半個小時格式。寫的仍是比較倉促,但願你們多提意見。