2017年3月12日 星期日

機器學習(9)--大數據競賽平台Kaggle入門,練習手寫數字辨識

     我們這次利用多層感知器MLP所作的手寫數字辨識,來練習大數據競賽平台Kaggle的投稿方式。在Kaggle上有多項有獎金的項目正在進行,這些項目想必難度很高。另外也有提供入門的練習項目是沒有獎金的,但是有提供了相關數據可以下載,也有人分享了他們實作該競賽項目的方法,這些可以供我們練習及參考。
     接下來我們就練習從Kaggle下載它所提供的手寫數字數據,利用MLP辨識完後把結果上傳回Kaggle平台,它就會馬上幫我們算出辨識準確率及在該項目的排名。

     這邊直接省略註冊步驟,註冊是免費的而且可以直接使用Facebook 或是google+帳號即可,故我們直接從如何下載手寫數字數據開始。
進入Kaggle平台網頁上方選擇[Competitions],底下往下拉即可以看到目前正在進行的競賽項目。
Kaggle平台連結:https://www.kaggle.com/competitions

     如下圖,它有幾種分類,Featured 及Research都是有獎金的,至於新手入門可以從Playground及Getting Started 做起。我們在這邊直接選擇最下方Digit Recognizer 進去。




選擇[data]頁面即可下載它所提供的數據,是以.csv的檔案格式呈現,在這裡train.csv為提供的訓練
資料, test.csv為測試資料,sample_submission.csv則是我們將test.csv辨識完,要上傳的結果樣本,檔名不限但格式必須是.csv檔。在辨識完成後,將該結果選擇右邊按鈕[Submit Predictios]即可上傳。



下載train.csv後用excel打開如下<圖一>可以看到,共有42001x785資料包含第一行為Label,第2-785行為數字特徵值,跟MNIST 784灰階圖pixel值同義,而訓練數據有42000筆加上第一列欄位的ID標示,故真正樣本是從第二列開始算起, 而test.csv 有28001筆資料,第一列仍然有 ID標示,
故真正數據也是從第二列開始,至於test.csv則沒有Label標籤行,這是我們需要作辨識後產生的結果。

<圖1>train.csv


     底下是我辨識完後產生的result.csv ,這就是上傳的結果檔,注意第一列仍然要有ID註釋,而第一行ImageId只是序號,真正的預測結果是放在第二行,這格式必須如同sample_submission.csv,這樣才不會出錯。




有關多層感知器MLP的手寫數字辨識基本範例,可以先參考底下連結是用MNIST數據集所作的一個範例:
機器學習(8)--實作多層感知器(Multilayer Perceptron,MLP)手寫數字辨識


    根據上述的MLP的手寫數字辨識範例,底下多增加了載入Kaggle數據的程式
底下程式片段分別為載入train,test資料及儲存識別test數據後的結果。最後產生的result.csv
將它上傳至Kaggle即可。Kaggle會自動算出準確率及排名。
def loadTrainData():
def loadTestData():
def saveResult(result):

def loadTrainData():  
 l=[]  
 with open('train.csv') as file:  
   lines=csv.reader(file)  
   for line in lines:  
    l.append(line) #42001*785 
 l.remove(l[0]) 
 l=np.array(l) 
 label=l[:,0]  
 data=l[:,1:]  
 return toInt(data),toInt(label) 
 #return nomalizing(toInt(data)),toInt(label)  
 
def loadTestData():  
 l=[]  
 with open('test.csv') as file: 
   lines=csv.reader(file)  
   for line in lines:  
    l.append(line) #28001*784  
 l.remove(l[0]) 
 data=np.array(l)  
 return toInt(data)
 #return nomalizing(toInt(data))   

def saveResult(result):
 with open ('result.csv', mode='w',newline="\n") as write_file:
  writer = csv.writer(write_file)
  writer.writerow(["ImageId","Label"])
  for i in range(len(result)):
   writer.writerow([i+1,result[i]])


在完整的範例程式裡,我利用Kaggle提供的train 數據集做完訓練後,仍然用了標準的MNIST數據集分別當作測試數據進行了預測試,最後再進行Kaggle提供的test 數據集作預測產生了result.csv檔上傳。

底下即是上傳result.csv後,Kaggle算出來的結果。準確率0.96357,排名1027。
可以重複再多上傳幾次不同的結果,至於使用什麼方法或工具,如KNN,SVM,或是keras,Tensorflow都無所謂,它只看最後上傳的result.csv檔。



<完整範例程式>可從我底下的Github下載

https://github.com/Ashing00/Multilayer-Perceptron/blob/master/MLP2.py



加入阿布拉機的3D列印與機器人的FB專頁
https://www.facebook.com/arbu00/


<參考資料>書名:Python機器學習,作者:Sebastian Raschka

<其他相關文章>
人工神經網路(1)--使用Python實作perceptron(感知器)
人工神經網路(2)--使用Python實作後向傳遞神經網路演算法(Backprogation artificial neature network)
深度學習(1)-如何在windows安裝Theano +Keras +Tensorflow並使用GPU加速訓練神經網路
機器學習(1)--使用OPENCV KNN實作手寫辨識
機器學習(2)--使用OPENCV SVM實作手寫辨識
演算法(1)--蒙地卡羅法求圓周率及橢圓面積(Monte carlo)
機器學習(3)--適應線性神經元與梯度下降法(Adaline neuron and Gradient descent)
機器學習(4)--資料標準常態化與隨機梯度下降法( standardization & Stochastic Gradient descent)
機器學習(5)--邏輯斯迴歸,過度適合與正規化( Logistic regression,overfitting and regularization)
機器學習(6)--主成分分析(Principal component analysis,PCA)
機器學習(7)--利用核主成分分析(Kernel PCA)處理非線性對應
機器學習(8)--實作多層感知器(Multilayer Perceptron,MLP)手寫數字辨識