1. 程式人生 > >大資料競賽平臺——Kaggle 入門

大資料競賽平臺——Kaggle 入門

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

大資料競賽平臺——Kaggle 入門篇



這篇文章適合那些剛接觸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模組的使用


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()函式如下:

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()函式如下:

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,程式碼如下:

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,程式碼:

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演算法來分類,核心程式碼:
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[i]]        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模組的使用 程式碼:
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。


def handwritingClassTest():    trainData,trainLabel=loadTrainData()    testData=loadTestData()    testLabel=loadTestResult()    m,n=shape(testData)    errorCount=0    resultList=[]    for i in range(m):         classifierResult = classify(testData[i], 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%,這個效果並不好,原因是我並未將所有訓練樣本都拿來訓練,因為太花時間,我只取一半的訓練樣本來訓練,即上面的結果對應的程式碼是:


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

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


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




下載工程程式碼:github地址
【完】            

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述 你好! 這是你第一次使用 **Markdown編輯器** 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。

新的改變

我們對Markdown編輯器進行了一些功能拓展與語法支援,除了標準的Markdown編輯器功能,我們增加了如下幾點新功能,幫助你用它寫部落格:

  1. 全新的介面設計 ,將會帶來全新的寫作體驗;
  2. 在創作中心設定你喜愛的程式碼高亮樣式,Markdown 將程式碼片顯示選擇的高亮樣式 進行展示;
  3. 增加了 圖片拖拽 功能,你可以將本地的圖片直接拖拽到編輯區域直接展示;
  4. 全新的 KaTeX數學公式 語法;
  5. 增加了支援甘特圖的mermaid語法1 功能;
  6. 增加了 多螢幕編輯 Markdown文章功能;
  7. 增加了 焦點寫作模式、預覽模式、簡潔寫作模式、左右區域同步滾輪設定 等功能,功能按鈕位於編輯區域與預覽區域中間;
  8. 增加了 檢查列表 功能。

功能快捷鍵

撤銷:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜體:Ctrl/Command + I
標題:Ctrl/Command + Shift + H
無序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
檢查列表:Ctrl/Command + Shift + C
插入程式碼:Ctrl/Command + Shift + K
插入連結:Ctrl/Command + Shift + L
插入圖片:Ctrl/Command + Shift + G

合理的建立標題,有助於目錄的生成

直接輸入1次#,並按下space後,將生成1級標題。
輸入2次#,並按下space後,將生成2級標題。
以此類推,我們支援6級標題。有助於使用TOC語法後生成一個完美的目錄。

如何改變文字的樣式

強調文字 強調文字

加粗文字 加粗文字

標記文字

刪除文字

引用文字

H2O is是液體。

210 運算結果是 1024.

插入連結與圖片

連結: link.

圖片: Alt

帶尺寸的圖片: Alt

當然,我們為了讓使用者更加便捷,我們增加了圖片拖拽功能。

如何插入一段漂亮的程式碼片

部落格設定頁面,選擇一款你喜歡的程式碼片高亮樣式,下面展示同樣高亮的 程式碼片.

// An highlighted block var foo = 'bar'; 

生成一個適合你的列表

  • 專案
    • 專案
      • 專案
  1. 專案1
  2. 專案2
  3. 專案3
  • 計劃任務
  • 完成任務

建立一個表格

一個簡單的表格是這麼建立的:

專案 Value
電腦 $1600
手機 $12
導管 $1

設定內容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文字居中 第二列文字居右 第三列文字居左

SmartyPants

SmartyPants將ASCII標點字元轉換為“智慧”印刷標點HTML實體。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

建立一個自定義列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何建立一個註腳

一個具有註腳的文字。2

註釋也是必不可少的

Markdown將文字轉換為 HTML

KaTeX數學公式

您可以使用渲染LaTeX數學表示式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n 1 ) ! n N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通過尤拉積分

Γ ( z ) = 0 t z 1 e t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

你可以找到更多關於的資訊 LaTeX 數學表示式here.

新的甘特圖功能,豐富你的文章

gantt
        dateFormat  YYYY-MM-DD
        title Adding GANTT diagram functionality to mermaid
        section 現有任務
        已完成               :done,    des1, 2014-01-06,2014-01-08
        進行中               :active,  des2, 2014-01-09, 3d
        計劃一               :         des3, after des2, 5d
        計劃二               :         des4, after des3, 5d
  • 關於 甘特圖 語法,參考 這兒,

UML 圖表

可以使用UML圖表進行渲染。 Mermaid. 例如下面產生的一個序列圖::

這將產生一個流程圖。:

  • 關於 Mermaid 語法,參考 這兒,

FLowchart流程圖

我們依舊會支援flowchart的流程圖:

  • 關於 Flowchart流程圖 語法,參考 這兒.

匯出與匯入

匯出

如果你想嘗試使用此編輯器, 你可以在此篇文章任意編輯。當你完成了一篇文章的寫作, 在上方工具欄找到 文章匯出 ,生成一個.md檔案或者.html檔案進行本地儲存。

匯入

如果你想載入一篇你寫過的.md檔案或者.html檔案,在上方工具欄可以選擇匯入功能進行對應副檔名的檔案匯入,
繼續你的創作。


  1. mermaid語法說明 ↩︎

  2. 註腳的解釋 ↩︎