天天看點

《深度學習:Java語言實作》一一2.4機器學習應用流程

2.4機器學習應用流程

我們已經了解了機器學習的方法,以及這些方法是如何識别模式的。這一節裡,我們會學習使用機器學習挖掘資料時該選擇或者必須選擇哪一套學習流程。每一種機器學習方法都會依據模型參數設定決策邊界(decision boundary),但是我們不能隻關心模型參數。還有另一個非常麻煩的問題,實際上,它也是機器學習長久以來的死穴之一:特征工程(feature engineering)。判斷從原始資料中可以建立哪些特性,又即分析的主題,是建立一個恰當分類器必須經曆的步驟。這一步的過程,與模型參數的調整大同小異,也需要經曆大量的試錯。某些情況下,特征工程甚至比設定一個參數更加耗費時間精力。

是以,在我們簡單地提起“機器學習”,準備建構一個分類器處理實際問題時,還需要提前準備完成幾個任務。一般而言,這些任務可以概括如下:

确定哪一種機器學習方法适用于你的問題。

确定該采用什麼特征進行分析。

确定分析模型的參數設定是什麼。

隻有你完成了這些任務,機器學習才能有實際的用武之地。

那麼,你怎樣才能确定合适的特征和參數呢?怎樣才能讓機器開始學習?讓我們首先看看下圖,通過它也許你能夠比較容易地了解機器學習的全貌。這是機器學習流程的一個總結:

《深度學習:Java語言實作》一一2.4機器學習應用流程

正如你從前面這幅圖中所能看到的,機器學習的學習過程可以粗略劃分為兩個步驟:

 訓練

 測試

實際上,模型的參數在訓練階段中會不斷地被修改和調整,機器需要在測試階段檢測模型的效果。我們都知道研究或者實驗幾乎不可能僅憑一次訓練或者一個測試集就能取得成功。我們需要一遍又一遍地重複訓練→測試,訓練→測試……這樣的過程,直到找到正确的模型。

讓我們依次看下前面的流程圖。首先,你需要将原始資料劃分為兩部分:訓練資料集和測試資料集。這裡,你需要特别注意的一點是,訓練資料集和測試資料集是分離的。讓我們舉一個例子,這樣你能更容易地了解這到底是什麼意思:你希望使用曆史價格資料,通過機器學習預測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折交叉驗證(kfold crossvalidation)”。k折交叉驗證中,所有的資料一開始就被劃分到k個集合中。接着,其中的一個集合被選為測試資料集,其他k-1個集合作為訓練資料集。交叉驗證對劃分的k個資料集分别做驗證,總共進行k次,預測的精确度由這k次驗證的結果取平均值确定。最讓人擔心的事情是訓練資料集和測試資料集碰巧都有很好的預測精度,然而發生這種事件的機率在k折交叉驗證中減小了,因為測試會進行多次。對過度拟合再怎麼謹慎也不算過分,是以仔細驗證測試的結果是非常有必要的。

現在你已經了解了訓練的流程、什麼是訓練集,以及需要牢記在心的要點。以上兩點主要關注于資料分析。那麼,舉個例子來說,如果你的目的是從已有資料中找出有價值的資訊,那你就可以按照這個流程進行操作。另一方面,如果你需要應用可以處理将來的新資料,你還需要額外的流程,使用訓練中擷取的模型參數以及測試資料集進行預測。譬如,如果你希望從股票價格資料集中找出某些資訊進行分析,并據此編寫市場報告的話,下一步要做的是進行訓練和測試集合。或者,如果你想要依據資料對未來的股票價格進行預測,将其作為一種投資系統的話,你的目标就變成了建構一個應用,其使用由訓練擷取的模型和測試資料集,基于已有的資料對股價進行預測,并且這些資料每天,或者每隔設定的固定時段都會更新。第二個例子中,如果你想要依據新增的資料更新模型,需要特别的小心,模型的建構需要在下一批資料到來之前完成。