2010-01-14 82 views
8

作爲計算語言學的學生,我經常進行機器學習實驗,我必須從各種不同的資源(如原始或註釋文本語料庫或句法樹庫)中準備訓練數據。對於每個新任務和每個新實驗,我編寫程序(通常使用Python,有時使用Java)以提取我需要的特性和值,並將數據從一種格式轉換爲另一種格式。這通常會導致非常大量的非常大的文件和大量的小程序來處理它們以獲取某些機器學習框架的輸入(如Weka的arff文件)。準備培訓數據的一般框架?

一個需要組織得非常好的組織來處理這個問題,並小心謹慎,不要錯過任何重要的特性,異常情況或錯誤。很多良好的軟件設計原則(如設計模式或重構範式)對於這些任務來說都沒有太大的用處,因爲諸如安全性,可維護性或可持續性等事情並不重要 - 一旦程序成功處理數據,就不再需要它了。到目前爲止,我甚至停止了在我的Python代碼和程序中以簡單的程序方式使用類或函數的麻煩。下一個實驗將需要具有獨特特徵和不同格式的不同數據集,以便無論如何都需要從頭開始編寫它們的準備工作。我目前的經驗是,將項目時間的80-90%用於準備培訓數據的任務並不少見。時間和日子只是在考慮如何從一種數據格式轉換到另一種數據格式。有時候,這會變得非常令人沮喪。

那麼,你可能猜測我有點誇張,甚至有目的,但我很積極,你明白我想說什麼。我的問題實際上是這樣的:

是否有任何通用框架,體系結構和接近這些任務的最佳實踐?考慮到優化設計,我寫的多少代碼可以重複使用?

+0

根據我畢業的經驗,我不認爲這是誇張的。 :P – ealdent 2010-01-15 13:19:14

回答

2

我發現自己大多采用從GNU的coreutils和Flex的語料庫編寫文本實用程序,鏈接東西一起簡單的腳本,至少當我需要做的準備工作是很簡單的正則表達式和瑣碎過濾等

仍然有可能使事物可重用,一般規則也適用於此。如果您在編程時不考慮最佳實踐等,只是程序化地編程,恕我直言,真正難怪您在開始新項目時必須從頭開始做所有事情。

儘管格式要求會有很大的不同,但仍然有許多常見的任務,即。標籤剝離,標籤翻譯,選擇,製表,一些簡單的數據收集,諸如令牌數,句子等等。編程這些任務以獲得高度的可重用性將會得到回報,儘管它首先需要更長的時間。

1

我不知道有任何這樣的框架 - 並不意味着他們不在那裏。我更喜歡使用我自己的,這只是我隨着時間的推移/調整/借用的代碼片段的集合,並且我可以根據問題以各種配置鏈接在一起。如果您已經知道python,那麼我強烈建議您在NumPy中處理所有的數據準備 - 正如您所知,ML數據集往往很大 - 數以千計的行向量包含浮點數。 NumPy對於這類事情來說很棒。另外,我可能會建議,爲了準備ML的培訓數據,幾乎每一個這樣的努力都會出現幾個任務,並且從一個問題到下一個問題都不會發生很大變化。我已經給你下面的這些片段。

正常化(縮放&均值爲中心的數據,以避免增持。正如我敢肯定你知道,你可以擴展-1到1或0〜1。我通常選擇後者,這樣我就可以利用稀疏模式。在Python中,使用NumPy的庫:

import numpy as NP 
data = NP.linspace(1, 12, 12).reshape(4, 3) 
data_norm = NP.apply_along_axis(lambda x : (x - float(x.min()))/x.max(), 
              0, data) 

交叉驗證(下面是我設置爲「5」的默認參數,所以測試組爲5%,訓練集,95% - 把這個在一個功能使得k重簡單得多)

def divide_data(data, testset_size=5) : 
    max_ndx_val = data.shape[0] -1 
    ndx2 = NP.random.random_integers(0, max_ndx_val, testset_size) 
    TE = data_rows[ndx2] 
    TR = NP.delete(data, ndx2, axis=0) 
    return TR, TE 

最後,這裏有一個極好的case study(IMHO),兩者都清楚和完整的,從字面上表示通過輸入到ML算法從原始數據的收集的整個過程(在這種情況下是MLP)。他們還提供他們的代碼。