找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

機器學習資料整理【內有福利】 加入本站QQ交流群 本站落實實名發帖政策的通知
從20世紀60年代,由MIT的計算機教授組織了第一個面向本科生的Summer Project,經歷了20世紀50年代初到90年代,嘗試用創建?/div>
全球人工智能技術和計算機視覺技術領跑者,肇觀電子(NextVPU),日前正式發布世界?/div>
自語音識別技術進入深度學習時代,語音識別
數據堂自有版權的中國兒童手機采集語音數據產品共計3000小時。發音人均為6~12
TensorFlow官方文檔—中文版 鏈接:https://pan.ba
該教程將通過知識點講解+答疑指導相結合的方式,讓大家循序漸進的了解深度學習模型并通過實操演示掌握相關框架及TensorFlow工?/div>
本帖最后由 周天 于 2018-1-2
最最經典的凸
機器學習算法需要作用于數據,而數據的本質則決定了應
總體而言,這本書從基礎到研究前沿介紹了深度學習的核心概念與理論。我們不僅能了解到全連接、卷積和循環等基本深度神經網絡網絡,同時還
【主講嘉賓】 https://bbs.byr.cn/att/BBSOpenAPI/0/1560/41488 宋 宇 縱目科技無人駕駛事業部首席科學?/div>
1011
換個方式哈哈哈感覺到回個結核桿菌回個就
“N+”大會是面向全球 AR、VR、AI 等互聯網新技術領域的行業領袖及從業者的盛會。 旨在推動全球
  維塔利克˙布特林(Vitalik Buterin)將蒞臨“2018區塊鏈技術于場景落地峰會”做報告 764   布特林,一個誓言用區塊鏈顛覆真實經濟體系的俄羅斯小子,他打造的全新
優達學院面試技能三件套,包括找工作策略、模擬面試、拓展人脈三門課程
編者按:2017年是不平凡的一年(當然,事實上,每一年都是;P)?/div>
查看: 1127|回復: 0
打印 上一主題 下一主題

大數據競賽平臺——Kaggle 入門篇

[復制鏈接]

164

主題

306

帖子

1萬

積分

管理員

積分
15778
跳轉到指定樓層
樓主
發表于 2017-5-16 22:15:05 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
大數據競賽平臺——Kaggle 入門篇


from:http://blog.csdn.net/u012162613/article/details/41929171

這篇文章適合那些剛接觸Kaggle、想盡快熟悉Kaggle并且獨立完成一個競賽項目的網友,對于已經在Kaggle上參賽過的網友來說,大可不必耗費時間閱讀本文。本文分為兩部分介紹Kaggle,第一部分簡單介紹Kaggle,第二部分將展示解決一個競賽項目的全過程。如有錯誤,請指正!

1、Kaggle簡介Kaggle是一個數據分析的競賽平臺,網址:https://www.kaggle.com/


企業或者研究者可以將數據、問題描述、期望的指標發布到Kaggle上,以競賽的形式向廣大的數據科學家征集解決方
案,類似于KDD-CUP(國際知識發現和數據挖掘競賽)。Kaggle上的參賽者將數據下載下來,分析數據,然后運用機
器學習、數據挖掘等知識,建立算法模型,解決問題得出結果,最后將結果提交,如果提交的結果符合指標要求并且在參賽者中排名第一,將獲得比賽豐厚的獎金。更多內容可以參閱:大數據眾包平臺


下面我以圖文的形式介紹Kaggle:


進入Kaggle網站:




這是當前正在火熱進行的有獎比賽,有冠軍杯形狀的是“Featured”,譯為“號召”,召集數據科學高手去參賽。下面那個灰色的有試劑瓶形狀的是“Research”,獎金少一點。這兩個類別的比賽是有獎競賽,難度自然不小,作為入門者,應該先做練習賽:






左圖的比賽是“101”,右圖的是“Playground”,都是練習賽,適合入門。入門Kaggle最好的方法就是獨立完成101和playground這兩個級別的競賽項目。本文的第二部分將選101中的“Digit Recognition”作為講解。


點擊進入賽題“Digit Recognition”




這是一個識別數字0~9的練習賽,“Competition Details“是這個比賽的描述,說明參賽者需要解決的問題。”Get the Data“是數據下載,參賽者用這些數據來訓練自己的模型,得出結果,數據一般都是以csv格式給出:






其中,train.csv就是訓練樣本,test.csv就是測試樣本,由于這個是訓練賽,所以還提供了兩種解決方案,knn_benchmark.R和rf_benchmark.R,前者是用R語。言寫的knn算法程序,后者是用R語言寫的隨機森林算法程序,它們的結果分別是knn_benchmark.csv和rf_benchmark.csv。關于csv格式文件,我前一篇文章有詳述:【Python】csv模塊的使用


得出結果后,接下來就是提交結果”Make a submission“




要求提交的文件是csv格式的,假如你將結果保存在result.csv,那么點擊”Click or drop submission here“,選中result.csv文件上傳即可,系統將測試你提交的結果的準確率,然后排名。


另外,除了“Competition Details“、”Get the Data“、”Make a submission“,側邊欄的”Home“、”Information“、"Forum"等,也提供了關于競賽的一些相關信息,包括排名、規則、輔導......


【以上是第一部分,暫且寫這么多,有補充的以后再更】



2、競賽項目解題全過程(1)知識準備

首先,想解決上面的題目,還是需要一點ML算法的基礎的,另外就是要會用編程語言和相應的第三方庫來實現算法,常用的有:
Python以及對應的庫numpy、scipy、scikit-learn(實現了ML的一些算法,可以直接用)、theano(DeepLearning的算法包)。
R語言、weka
如果用到深度學習的算法,cuda、caffe也可以用
總之,使用什么編程語言、什么平臺、什么第三方庫都無所謂,無論你用什么方法,Kaggle只需要你線上提交結果,線下你如何實現算法是沒有限制的。


Ok,下面講解題過程,以”Digit Recognition“為例,數字識別這個問題我之前寫過兩篇文章,分別用kNN算法和Logistic算法去實現,有完整的代碼,有興趣可以閱讀:kNN算法實現數字識別Logistic回歸實現數字識別


(2)Digit Recognition解題過程

下面我將采用kNN算法來解決Kaggle上的這道Digit Recognition訓練題。上面提到,我之前用kNN算法實現過,這里我將直接copy之前的算法的核心代碼,核心代碼是關于kNN算法的主體實現,我不再贅述,我把重點放在處理數據上。
以下工程基于Python、numpy

  • 獲取數據


從”Get the Data“下載以下三個csv文件:


  • 分析train.csv數據


train.csv是訓練樣本集,大小42001*785,第一行是文字描述,所以實際的樣本數據大小是42000*785,其中第一列的每一個數字是它對應行的label,可以將第一列單獨取出來,得到42000*1的向量trainLabel,剩下的就是42000*784的特征向量集trainData,所以從train.csv可以獲取兩個矩陣trainLabel、trainData。
下面給出代碼,另外關于如何從csv文件中讀取數據,參閱:csv模塊的使用

[python] view plain copy


  • 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=array(l)  
  •     label=l[:,0]  
  •     data=l[:,1:]  
  •     return nomalizing(toInt(data)),toInt(label)  


這里還有兩個函數需要說明一下,toInt()函數,是將字符串轉換為整數,因為從csv文件讀取出來的,是字符串類型的,比如‘253’,而我們接下來運算需要的是整數類型的,因此要轉換,int(‘253’)=253。toInt()函數如下:
[python] view plain copy


  • def toInt(array):  
  •     array=mat(array)  
  •     m,n=shape(array)  
  •     newArray=zeros((m,n))  
  •     for i in xrange(m):  
  •         for j in xrange(n):  
  •                 newArray[i,j]=int(array[i,j])  
  •     return newArray  





nomalizing()函數做的工作是歸一化,因為train.csv里面提供的表示圖像的數據是0~255的,為了簡化運算,我們可以將其轉化為二值圖像,因此將所有非0的數字,即1~255都歸一化為1。nomalizing()函數如下:
[python] view plain copy


  • def nomalizing(array):  
  •     m,n=shape(array)  
  •     for i in xrange(m):  
  •         for j in xrange(n):  
  •             if array[i,j]!=0:  
  •                 array[i,j]=1  
  •     return array  






  • 分析test.csv數據

test.csv里的數據大小是28001*784,第一行是文字描述,因此實際的測試數據樣本是28000*784,與train.csv不同,沒有label,28000*784即28000個測試樣本,我們要做的工作就是為這28000個測試樣本找出正確的label。所以從test.csv我們可以得到測試樣本集testData,代碼如下:
[python] view plain copy


  • 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=array(l)  
  •     return nomalizing(toInt(data))   





  • 分析knn_benchmark.csv


前面已經提到,由于digit recognition是訓練賽,所以這個文件是官方給出的參考結果,本來可以不理這個文件的,但是我下面為了對比自己的訓練結果,所以也把knn_benchmark.csv這個文件讀取出來,這個文件里的數據是28001*2,第一行是文字說明,可以去掉,第一列表示圖片序號1~28000,第二列是圖片對應的數字。從knn_benchmark.csv可以得到28000*1的測試結果矩陣testResult,代碼:
[python] view plain copy


  • def loadTestResult():  
  •     l=[]  
  •     with open('knn_benchmark.csv') as file:  
  •          lines=csv.reader(file)  
  •          for line in lines:  
  •              l.append(line)  
  •      #28001*2  
  •     l.remove(l[0])  
  •     label=array(l)  
  •     return toInt(label[:,1])  




到這里,數據分析和處理已經完成,我們獲得的矩陣有:trainData、trainLabel、testData、testResult



  • 算法設計
這里我們采用kNN算法來分類,核心代碼:

[python] view plain copy


  • def classify(inX, dataSet, labels, k):  
  •     inX=mat(inX)  
  •     dataSet=mat(dataSet)  
  •     labels=mat(labels)  
  •     dataSetSize = dataSet.shape[0]                    
  •     diffMat = tile(inX, (dataSetSize,1)) - dataSet     
  •     sqDiffMat = array(diffMat)**2  
  •     sqDistances = sqDiffMat.sum(axis=1)                    
  •     distances = sqDistances**0.5  
  •     sortedDistIndicies = distances.argsort()              
  •     classCount={}                                       
  •     for i in range(k):  
  •         voteIlabel = labels[0,sortedDistIndicies]  
  •         classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1  
  •     sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)  
  •     return sortedClassCount[0][0]  



關于這個函數,參考:kNN算法實現數字識別


簡單說明一下,inX就是輸入的單個樣本,是一個特征向量。dataSet是訓練樣本,對應上面的trainData,labels對應trainLabel,k是knn算法選定的k,一般選擇0~20之間的數字。這個函數將返回inX的label,即圖片inX對應的數字。
對于測試集里28000個樣本,調用28000次這個函數即可。


  • 保存結果
kaggle上要求提交的文件格式是csv,上面我們得到了28000個測試樣本的label,必須將其保存成csv格式文件才可以提交,關于csv,參考:【Python】csv模塊的使用

代碼:
[python] view plain copy


  • def saveResult(result):  
  •     with open('result.csv','wb') as myFile:      
  •         myWriter=csv.writer(myFile)  
  •         for i in result:  
  •             tmp=[]  
  •             tmp.append(i)  
  •             myWriter.writerow(tmp)  




  • 綜合各函數
上面各個函數已經做完了所有需要做的工作,現在需要寫一個函數將它們組合起來解決digit recognition這個題目。我們寫一個handwritingClassTest函數,運行這個函數,就可以得到訓練結果result.csv。



[python] view plain copy


  • def handwritingClassTest():  
  •     trainData,trainLabel=loadTrainData()  
  •     testData=loadTestData()  
  •     testLabel=loadTestResult()  
  •     m,n=shape(testData)  
  •     errorCount=0  
  •     resultList=[]  
  •     for i in range(m):  
  •          classifierResult = classify(testData, trainData, trainLabel, 5)  
  •          resultList.append(classifierResult)  
  •          print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, testLabel[0,i])  
  •          if (classifierResult != testLabel[0,i]): errorCount += 1.0  
  •     print "\nthe total number of errors is: %d" % errorCount  
  •     print "\nthe total error rate is: %f" % (errorCount/float(m))  
  •     saveResult(resultList)  



運行這個函數,可以得到result.csv文件:





2 0 9 9 3 7 0 3.......就是每個圖片對應的數字。與參考結果knn_benchmark.csv比較一下:





28000個樣本中有1004個與kknn_benchmark.csv中的不一樣。錯誤率為3.5%,這個效果并不好,原因是我并未將所有訓練樣本都拿來訓練,因為太花時間,我只取一半的訓練樣本來訓練,即上面的結果對應的代碼是:


[python] view plain copy


  • classifierResult = classify(testData, trainData[0:20000], trainLabel[0:20000], 5)  


訓練一半的樣本,程序跑了將近70分鐘(在個人PC上)。



  • 提交結果
將result.csv整理成kknn_benchmark.csv那種格式,即加入第一行文字說明,加入第一列的圖片序號,然后make a submission,結果準確率96.5%:











下載工程代碼:github地址

回復 論壇版權

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

宸ュ晢钀ヤ笟鎵х収鐢靛瓙璁稿彲璇? />
                             </a>
                             <span class=| QQ|申請友鏈|小黑屋|手机版|人工智能A7論壇(aqinet.cn) ( 滬ICP備15039134號-1 ) 人工智能A7論壇壇友會

GMT+8, 2019-7-7 14:09 , Processed in 0.060601 second(s), 46 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表
四圣兽救援彩金