《深度學習:Java語言實現》一一2.4機器學習應用流程
2.4機器學習應用流程
我們已經了解了機器學習的方法,以及這些方法是如何識別模式的。這一節裏,我們會學習使用機器學習挖掘數據時該選擇或者必須選擇哪一套學習流程。每一種機器學習方法都會依據模型參數設置決策邊界(Decision Boundary),但是我們不能隻關心模型參數。還有另一個非常麻煩的問題,實際上,它也是機器學習長久以來的死穴之一:特征工程(Feature Engineering)。判斷從原始數據中可以創建哪些特性,又即分析的主題,是創建一個恰當分類器必須經曆的步驟。這一步的過程,與模型參數的調整大同小異,也需要經曆大量的試錯。某些情況下,特征工程甚至比設定一個參數更加耗費時間精力。
因此,在我們簡單地提起“機器學習”,準備構建一個分類器處理實際問題時,還需要提前準備完成幾個任務。一般而言,這些任務可以概括如下:
確定哪一種機器學習方法適用於你的問題。
確定該采用什麼特征進行分析。
確定分析模型的參數設置是什麼。
隻有你完成了這些任務,機器學習才能有實際的用武之地。
那麼,你怎樣才能確定合適的特征和參數呢?怎樣才能讓機器開始學習?讓我們首先看看下圖,通過它也許你能夠比較容易地了解機器學習的全貌。這是機器學習流程的一個總結:
正如你從前麵這幅圖中所能看到的,機器學習的學習過程可以粗略劃分為兩個步驟:
訓練
測試
實際上,模型的參數在訓練階段中會不斷地被修改和調整,機器需要在測試階段檢測模型的效果。我們都知道研究或者實驗幾乎不可能僅憑一次訓練或者一個測試集就能取得成功。我們需要一遍又一遍地重複訓練→測試,訓練→測試……這樣的過程,直到找到正確的模型。
讓我們依次看下前麵的流程圖。首先,你需要將原始數據劃分為兩部分:訓練數據集和測試數據集。這裏,你需要特別注意的一點是,訓練數據集和測試數據集是分離的。讓我們舉一個例子,這樣你能更容易地理解這到底是什麼意思:你希望使用曆史價格數據,通過機器學習預測S&P 500的每日價格(實際上,使用機器學習作為預測金融證券價格的工具是最吸引人的研究領域之一)。
假設你有2001年到2015年的曆史股價數據作為原始數據,如果你使用這些數據進行訓練,並且也使用同一時段的這些數據同樣地進行測試,將會發生什麼情況呢?你會發現,即使僅僅使用簡單的機器學習,或者特征工程,獲得正確預測的概率依舊高達70%,甚至會到80%或者90%。這樣一來,你可能會想:這是多麼偉大的發現啊!市場實際上就這麼簡單!現在我就可以成為一個億萬富翁了!
不過,這隻是個曇花一現的歡喜。現實並不會一帆風順。如果你在實際投資時也采用這樣的模型,不太可能獲得預期的收益,並可能因此一頭霧水。如果你仔細地思考,稍微留意一下,就會發現其實這很明顯。如果訓練數據集和測試數據集是完全一樣的,你實際上是在使用已經知道答案的數據進行測試。因此,這種測試能獲得很高準確率是必然的事,因為你是用正確的答案去預測正確的問題。不過,對測試而言,這沒有任何意義。如果你想要對模型進行恰當的評估,請確保使用不同時間區段的數據,譬如,你可以用2001年到2010年之間的數據作為訓練數據集,使用2011年到2015年的數據進行測試。這樣一來,你使用的就是答案未知的數據,從而能對模型預測準確率有一個恰當的評估。現在,你就能避免在破產的道路上一往無前了,因為你知道並非每筆投資都能賺得盆滿缽滿。所以,很明顯地,你應該將訓練數據集和測試數據集分開,不過你也有可能認為這並非一個嚴重的問題。然而,在數據挖掘的實際場景裏,我們經常會在無意識中使用了同樣的數據進行試驗,所以,請給予這個問題足夠的重視。我們在機器學習時就談論到這一問題,它同樣也適用於深度學習。
如果你將整個數據集劃分為兩部分,第一部分數據集應該作為訓練數據集。為了得到更為精確的預測率,我們需要為這部分訓練數據集創建恰當的特征。這種特征工程一定程度上取決於人的經驗或者直覺。為了讓選擇的特征取得最好的效果,你可能需要花費很長的時間和大量的精力。此外,每一種機器學習方法都有各自的特征數據類型格式,因為每一種方法其模型的理論和公式也各不相同。舉個例子,我們有一個模型隻接受一個整數,有的模型隻接受非負數字/值,還有的模型隻接受介於0與1之間的實數。我們再回到前麵那個股票價格的例子。由於股票價格會在一個比較大的區間變化,我們很難用一個隻接受整數的模型獲得比較準確的預測。
另外,我們還需要在數據與模型的兼容性方麵多下工夫。我們並不是說如果你選擇使用股票價格作為特征,就不能采用接受從0開始的所有實數的模型。譬如,如果你將所有股票的價格數據除以一定期間的最高股價,那麼其數據區間就介於0到1之間,這樣一來,你就可以使用隻接受從0到1實數的模型了。所以,如果你稍微調整下數據的格式,還是有機會使用這種模型的。當你考慮特征工程時,請牢記這一點。一旦你創建了特征,決定了選擇應用哪一種機器學習方法,就需要對這些進行檢查。
很顯然,機器學習中決定模型精度的重要因素是特征,不過模型自身,或者說算法中的公式也帶有一係列的參數,這些參數也對模型精度有影響。調整學習的速度,或者調整機器學習中,可允許的誤差數目都是這方麵很好的例子。學習的速度越快,它完成計算所花的時間越短,因此我們希望機器學習盡可能地快。然而,學習速度越快,得到的最終解就越粗糙。因此,我們需要留意的是,提高學習速度會導致模型的準確率降低。如果數據中混雜了噪聲,調整允許的誤差範圍也可以提高學習速度。機器判斷“數據是否看起來古怪”的標準是人為決定的。
當然,每一個方法都有一套獨特的參數集。眾多的參數中,一個很不錯例子是神經網絡中應該有多少神經元。另外,當我們談起支持向量機中的核函數,選擇什麼類型的核函數是支持向量機特有的參數之一。如上所述,機器學習需要確定很多參數,但是事先很難做到最優。至於如何預先定義模型參數,這有一塊專門的研究領域,專注於參數的研究。
因此,為了驗證哪些組合能返回最佳精度,我們需要測試大量的參數組合。由於一個個的單項測試會消耗大量的時間,標準流程是用不同的參數組合以並行的方式同時對多個模型進行測試,並對測試的結果進行比較。通常情況下,參數應該設置在哪一個區間是確定的,因此在一個合理的時間範圍內解決問題就不是一個大問題了。
一旦模型通過訓練數據集的訓練能取得好的準確率,下一步就可以進行測試。測試的大致流程是使用訓練數據集上同樣的特征、同樣的模型參數,檢查其準確率到底如何。測試中並沒有特別困難的步驟。計算也不會花費大量的時間。這是因為從數據中尋找模式,或者換句話說,優化公式的參數就會帶來計算量。然而,一旦參數調整完畢,就可以將公式直接應用於新的數據集。簡單而言,執行測試的目的就是為了檢查模型是否受訓練數據集的影響變得過度優化。這到底是什麼意思呢?使用機器學習時,訓練集下預測效果很好,但是測試集中表現不佳的模式有兩種。
第一種情況是由於將無意義的幹擾數據混到訓練數據集引發了不正確的優化。這可能源於本章前麵提到的誤差允許範圍的調整。我們周遭的數據並不總是幹淨的。甚至可以這麼說,幾乎沒有任何數據可以被恰當地劃分到純淨的模式(Clean Pattern)中。我們再一次提起股票價格的那個例子,它就是一個很好的證明。股票價格通常都在前期股價附近重複式地適度波動,不過,某些時候它們也會突然暴漲或暴跌。這種非常規的變化是沒有,或者說是不可能有任何規律的。再舉個例子,如果你想要預測一個國家的糧食產量,受異常氣候影響的年份的數據與正常年份的數據比起來一定存在很大的差別。雖然剛才所舉的都是一些極端的情況,比較容易理解,不過現實世界中的大多數數據都存在著噪聲,想要將數據劃分到恰當的模式比較困難。如果你僅僅做了訓練而沒有調整機器學習過程中模型的參數,那麼模型就會強行將噪音數據也劃分到一個模式中。這種情況下,訓練數據集中的數據也許進行了正確的分類,不過由於訓練數據集中存在著噪音,它們也進行了分類,而在測試數據集中這些噪音可能並不存在,從而影響測試的預測準確率。
第二種情況是隻依據訓練數據集中特有的數據進行分類而導致的無效優化(Incorrect Optimizing)。譬如,我們考慮設計一款接受英文語音輸入的移動應用。為了構建你的移動應用,你應該準備各種詞匯的發音數據作為訓練數據集。現在,我們假設你已經準備了足夠數量的英式英語語音數據,搭建了可以正確分類發音的模型,並且達到了很高的精確度。下一步就是測試。由於是測試,為了采用不同的數據,我們使用美式英語的語音數據。那麼,結果如何呢?你可能不會得到比較好的準確率。更進一步,如果你試圖讓你的應用去識別非英語母語國家人的發音,最終的預測精度可能更低。如你所知,不同地區的人有不同的英文發音。如果你不把這一點考慮在內,隻對英式英語訓練數據集的模型進行調整,即使你在訓練數據集上能達到很好的效果,麵對測試數據集時也不會有好的成績,也無法在實際應用中發揮作用。
出現這兩個問題的原因是機器學習模型是從訓練數據集中學習而來,它過度擬合於數據集了。這一問題應該被稱為“過擬合問題(Overfitting Problem)”,你對此應該非常小心,避免出現這種問題。機器學習的困境在於你既要考慮如何避免過擬合問題,與此同時還要完成特征工程。這兩個問題——過擬合和特征工程,在一定程度上都是相關的,因為糟糕的特征工程就會落入過擬合的陷阱。
要避免過擬合問題,除了增加訓練數據和測試數據並沒有太多的方法。通常而言,訓練數據的數量都是有限的,所以常用的方法是增加測試的數量。一個典型的例子是“K折交叉驗證(KFold CrossValidation)”。K折交叉驗證中,所有的數據一開始就被劃分到K個集合中。接著,其中的一個集合被選為測試數據集,其他K-1個集合作為訓練數據集。交叉驗證對劃分的K個數據集分別做驗證,總共進行K次,預測的精確度由這K次驗證的結果取平均值確定。最讓人擔心的事情是訓練數據集和測試數據集碰巧都有很好的預測精度,然而發生這種事件的概率在K折交叉驗證中減小了,因為測試會進行多次。對過度擬合再怎麼謹慎也不算過分,因此仔細驗證測試的結果是非常有必要的。
現在你已經了解了訓練的流程、什麼是訓練集,以及需要牢記在心的要點。以上兩點主要關注於數據分析。那麼,舉個例子來說,如果你的目的是從已有數據中找出有價值的信息,那你就可以按照這個流程進行操作。另一方麵,如果你需要應用可以處理將來的新數據,你還需要額外的流程,使用訓練中獲取的模型參數以及測試數據集進行預測。譬如,如果你希望從股票價格數據集中找出某些信息進行分析,並據此編寫市場報告的話,下一步要做的是進行訓練和測試集合。或者,如果你想要依據數據對未來的股票價格進行預測,將其作為一種投資係統的話,你的目標就變成了構建一個應用,其使用由訓練獲取的模型和測試數據集,基於已有的數據對股價進行預測,並且這些數據每天,或者每隔設置的固定時段都會更新。第二個例子中,如果你想要依據新增的數據更新模型,需要特別的小心,模型的構建需要在下一批數據到來之前完成。
最後更新:2017-08-19 01:32:41