翻譯:Getting Started With Python For Data Science

翻譯:Getting Started With Python For Data Science

原文鏈接:http://www.kaggle.com/wiki/GettingStartedWithPythonForDataScience

這篇教程假設讀者能夠使用python編程,但並不需要數據科學,機器學習或預測模型的知識。在實踐中學習是一種黑客品質。

所有這篇教程中的代碼都可以在github上找到。

你也許會遇到不熟悉的術語,但是不會對你完成教程形成阻礙。到最後,你可能不會加深對數據科學的理解,但是你會建立起一個環境,在那裏你可以輕鬆的操作不同的數據科學工具甚至在kaggle比賽中得到不錯的成績。更重要的是,你將有一個可以實驗並學習更多數據科學知識的環境。

下面是你將會學習的內容:

  • 怎樣安裝流行的科學計算庫和統計學計算庫。
  • 使用上述庫函數簡歷一個基準預測模型,並提交。
  • 編寫你自己的評估函數,並學習怎樣使用交叉驗證去證明你自己的想法。

動心了麼?我想是的。

1. 建立環境

第一件事,我們需要一個適合科學統計計算的python環境。假設你已經安裝了python(還沒?強烈推薦python2.7),我們需要三個包,你需要按照順序安裝:

  • numpy - (發音是num - pie)強大的數字型數組,下面兩個包都依賴於它。
  • scipy - (sigh - pie) 可以用來進行科學計算,數學運算,也適合實現工程。
  • sklearn - 傻瓜機器學習包

注意:64位的版本可以在這裏找到。

點擊上面的鏈接可以到各個工程的項目主頁,獲取適合你操作系統的安裝包,如果你使用的是linux,你可以用pip來安裝,如果你用的windows,從二進制包安裝會更簡單。

同時我推薦安裝一個python的ide環境。當然你可以在命令行執行python腳本,但使用一個趁手的環境調試起來會更容易。我使用PyDev,不過ipython也不錯。

 

2. 第一次提交

 

Biological Response 比賽是一個二分類問題,並且數據只是一系列數字,所以特徵抽取和特徵選擇並不像其他kaggle比賽那樣重要,是非常適合入門學習的數據集。現在下載訓練集和測試集。即使這項比賽已經結束了,你依然可以提交併查看你的結果和其他世界各地最好的數據科學家之間的差別。

在下面的代碼中,我們會使用一種增強的分類器,叫做random forest,通常情況下即使不對參數進行調整,它也能表現良好。雖然隨機森類是一個非常複雜的分類器,由於sklearn將它封裝了起來,所以很容易使用。

注意:使用下面這些算法時,你不必理解所有的數學原理。爲了理解算法是如何工作,實驗是一個非常好的開端。理解模型非常重要,但是不需要在開始的時候就掌握模型,開心的去比賽吧。

下面是代碼:

複製代碼
from sklearn.ensemble import RandomForestClassifier
from numpy import genfromtxt, savetxt

def main():
    #create the training & test sets, skipping the header row with [1:]
    dataset = genfromtxt(open('Data/train.csv','r'), delimiter=',', dtype='f8')[1:]    
    target = [x[0] for x in dataset]
    train = [x[1:] for x in dataset]
    test = genfromtxt(open('Data/test.csv','r'), delimiter=',', dtype='f8')[1:]

    #create and train the random forest
    #multi-core CPUs can use: rf = RandomForestClassifier(n_estimators=100, n_jobs=2)
    rf = RandomForestClassifier(n_estimators=100)
    rf.fit(train, target)
    predicted_probs = [x[1] for x in rf.predict_proba(test)]

    savetxt('Data/submission.csv', predicted_probs, delimiter=',', fmt='%f')

if __name__=="__main__":
    main()
複製代碼

這時你應該開始運行代碼並且把代碼寫入一個新的名稱爲makeSubmission.py的python腳本。你的代碼的目錄結構應該如下:

複製代碼
#  "My Kaggle Folder")
#  |
#  |---"Data"
#  |   |
#  |   |---train.csv
#  |   |
#  |   |---test.csv
#  |
#  |---makeSubmission.py
複製代碼

一旦你運行了腳本,你就會在data目錄下發現my_first_submission.csv。現在開始做一件重要的事。提交這個文件到bio-response比賽。

提交了麼?你牛逼。你可以停下了-你學習瞭如何製作一個kaggle entry - 但如果你是個好奇寶寶,我確信你一定想知道如何使用其他的模型,不同的參數,以及其他牛逼閃閃放光芒的功能。繼續讀下去學習一些可以在本地評估模型的重要技巧,讓你不會浪費掉kaggle每天限制的提交次數。

 

3. 評估和交叉驗證

我們打算嘗試一下sklearn的gradient boosting machine來代替random forest。或者是一些其他簡單的線性模型。從sklearn使用這些方法制作提交文件是很簡單的,困難的是比較這些模型的效果。換一種模型就提交一次是不顯示的,我們需要一種本地的測試方法,爲了達到這個目標,我們需要了解兩點:

  1. 評估函數
  2. 交叉驗證

你總是需要一些評估函數去計算模型的表現。理想的情況下,這些評估方法與kaggle使用的方法相同。比賽的參與者通常將評估的代碼貼在論壇裏,kaggle在wiki頁面詳細的描述了度量方法。在bio-response比賽中,評估方法是log-loss,用戶Grunthus貼了一個python版的代碼。我們不會花費太多時間在這方面(閱讀論壇帖子以獲得更多信息),只需要將下面代碼複製並保存爲logloss.py。

 

複製代碼
import scipy as sp
de fllfun(act, pred):
    epsilon = 1e-15
    pred = sp.maximum(epsilon, pred)
    pred = sp.minimum(1-epsilon, pred)
    ll = sum(act*sp.log(pred) + sp.subtract(1,act)*sp.log(sp.subtract(1,pred)))
    ll = ll * -1.0/len(act)
    return ll
複製代碼

最後,我們需要數據來測試我們的模型。當你提交你的第一個kaggle比賽entry時,kaggle比較你的答案和真實數據在測試集上的結果。沒有那些真是數據的時候,我們怎麼才能在本地測試我們的模型呢?這就要靠交叉驗證來幫忙了。

交叉驗證是一項簡單的技術,它將數據分塊,並保留一部分,同時模型使用另一部分訓練。一旦你意識到了這一點,sklearn能幫你做到這些。在sklearn,交叉驗證是內建的功能。sklearn文檔有很多關於交叉驗證的信息。

下面的代碼創建了k=10的交叉驗證集合。保留每10%的訓練集,用於測試random forest模型。

複製代碼
from sklearn.ensemble import RandomForestClassifier
from sklearn import cross_validation
import logloss
import numpy as np

def main():
    #read in  data, parse into training and target sets
    dataset = np.genfromtxt(open('Data/train.csv','r'), delimiter=',', dtype='f8')[1:]    
    target = np.array([x[0] for x in dataset])
    train = np.array([x[1:] for x in dataset])

    #In this case we'll use a random forest, but this could be any classifier
    cfr = RandomForestClassifier(n_estimators=100)

    #Simple K-Fold cross validation. 5 folds.
    cv = cross_validation.KFold(len(train), k=5, indices=False)

    #iterate through the training and test cross validation segments and
    #run the classifier on each one, aggregating the results into a list
    results = []
    for traincv, testcv in cv:
        probas = cfr.fit(train[traincv], target[traincv]).predict_proba(train[testcv])
        results.append( logloss.llfun(target[testcv], [x[1] for x in probas]) )

    #print out the mean of the cross-validated results
    print"Results: " + str( np.array(results).mean() )

if __name__=="__main__":
    main()
複製代碼

注意,你的交叉驗證結果可能和kaggle提供的不一樣。有很多原因可能導致這個結果,random forest 有一個隨機的過程,並不會每次都產生一樣的結果;真是的測試數據與訓練數據分佈不一致(尤其是當樣本量相當小,就像在bio-reponse比賽中一樣);評估方法的實現也可能不同。即使你得到了些許不同的結果,你還是可以在本地比較模型的效果,還是可以知道做了哪些改進可以讓效果提升。

總結:

教程結束,現在,你擁有了強大的工具,我希望不久後在leaderboard上看到你。

-Chris Clark

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章