1. 程式人生 > >Ng第十一課:機器學習系統的設計(Machine Learning System Design)

Ng第十一課:機器學習系統的設計(Machine Learning System Design)

未能 計算公式 pos 構建 我們 行動 mic 哪些 指標

11.1 首先要做什麽

11.2 誤差分析

11.3 類偏斜的誤差度量

11.4 查全率和查準率之間的權衡

11.5 機器學習的數據


11.1 首先要做什麽

在接下來的視頻將談到機器學習系統的設計。這些視頻將談及在設計復雜的機器學習系統時,將遇到的主要問題。同時會試著給出一些關於如何巧妙構建一個復雜的機器學習系統的建議。下面的課程講的東西數學性不強,但是非常有用的,可能在構建大型的機器學習系統時,節省大量的時間。

本周以一個垃圾郵件分類器算法為例進行討論。 為了解決這樣一個問題,首先要做的決定是如何選擇並表達特征向量 x。我們可以選擇一個由 100 個最常出現在垃圾郵件中的詞所構成的列表,根據這些詞是否有在郵件中出現,來獲得我們的特征向量(出現為 1,不出現為 0),尺寸為 100×1。 為了構建這個分類器算法,我們可以做很多事,例如:

1. 收集更多的數據,讓我們有更多的垃圾郵件和非垃圾郵件的樣本

2. 基於郵件的路由信息開發一系列復雜的特征

3. 基於郵件的正文信息開發一系列復雜的特征,包括考慮截詞的處理

4. 為探測刻意的拼寫錯誤(把 watch 寫成 w4tch)開發復雜的算法

在上面這些選項中,非常難決定應該在哪一項上花費時間和精力,作出明智的選擇,比隨著感覺走要更好。當我們使用機器學習時,總是可以“頭腦風暴”一下,想出一堆方法來試試。實際上,當你需要通過頭腦風暴來想出不同方法來嘗試去提高精度的時候,你可能已經超越了很多人了。大部分人並不嘗試著列出可能的方法,他們做的只是某天早上醒來,因為某些原因有了一個突發奇想:"讓我們來試試用 Honey Pot 項目收集大量的數據吧。"


11.2 誤差分析

在本次課程中,我們將會講到誤差分析(error analysis)的概念。這會幫助你更系統地 做出決定。如果你準備研究機器學習的東西,或者構造機器學習應用程序,最好的實踐方法 不是建立一個非常復雜的系統,擁有多麽復雜的變量;而是構建一個簡單的算法,這樣你可以很快地實現它。

每當我研究機器學習的問題時,我最多只會花一天的時間,就是字面意義上的 24 小時, 來試圖很快的把結果搞出來,即便效果不好。坦白的說,就是根本沒有用復雜的系統,但是 只是很快的得到的結果。即便運行得不完美,但是也把它運行一遍,最後通過交叉驗證來檢 驗數據。一旦做完,你可以畫出學習曲線,通過畫出學習曲線,以及檢驗誤差,來找出你的算法是否有高偏差和高方差的問題,或者別的問題。在這樣分析之後,再來決定用更多的數 據訓練,或者加入更多的特征變量是否有用。這麽做的原因是:這在你剛接觸機器學習問題 時是一個很好的方法,你並不能提前知道你是否需要復雜的特征變量,或者你是否需要更多 的數據,還是別的什麽。提前知道你應該做什麽,是非常難的,因為你缺少證據,缺少學習曲線。因此,你很難知道你應該把時間花在什麽地方來提高算法的表現。但是當你實踐一個 非常簡單即便不完美的方法時,你可以通過畫出學習曲線來做出進一步的選擇。你可以用這 種方式來避免一種電腦編程裏的過早優化問題,這種理念是:我們必須用證據來領導我們的 決策,怎樣分配自己的時間來優化算法,而不是僅僅憑直覺,憑直覺得出的東西一般總是錯 誤的。除了畫出學習曲線之外,一件非常有用的事是誤差分析,我的意思是說:當我們在構 造垃圾郵件分類器時,我會看一看我的交叉驗證數據集,然後親自看一看哪些郵件被算法錯 誤地分類。因此,通過這些被算法錯誤分類的垃圾郵件與非垃圾郵件,你可以發現某些系統 性的規律:什麽類型的郵件總是被錯誤分類。經常地這樣做之後,這個過程能啟發你構造新 的特征變量,或者告訴你:現在這個系統的短處,然後啟發你如何去提高它。

構建一個學習算法的推薦方法為:

1. 從一個簡單的能快速實現的算法開始,實現該算法並用交叉驗證集數據測試這個算法

2. 繪制學習曲線,決定是增加更多數據,或者添加更多特征,還是其他選擇

3. 進行誤差分析:人工檢查交叉驗證集中我們算法中產生預測誤差的實例,看看這些實例是否有某種系統化的趨勢

以我們的垃圾郵件過濾器為例,誤差分析要做的既是檢驗交叉驗證集中 我們的算法產生錯誤預測的所有郵件,看是否能將這些郵件按照類分組。例如醫藥品垃圾郵件,仿冒品垃圾郵件或者密碼竊取郵件等。然後看分類器對哪一組郵件的預測誤差最大,並著手優化。思考怎樣能改進分類器。例如,發現是否缺少某些特征,記下這些特征出現的次數。 例如記錄下錯誤拼寫出現了多少次,異常的郵件路由情況出現了多少次等等,然後從出現次數最多的情況開始著手優化。 誤差分析並不總能幫助我們判斷應該采取怎樣的行動。有時我們需要嘗試不同的模型,然後進行比較,在模型比較時,用數值來判斷哪一個模型更好更有效,通常我們是看交叉驗 證集的誤差。在 我 們 的 垃 圾 郵 件 分 類 器 例 子 中 , 對 於 “ 我 們 是 否 應 該 將discount/discounts/discounted/discounting 處理成同一個詞?”如果這樣做可以改善我們算 法,我們會采用一些截詞軟件。誤差分析不能幫助我們做出這類判斷,我們只能嘗試采用和 不采用截詞軟件這兩種不同方案,然後根據數值檢驗的結果來判斷哪一種更好。

因此,當你在構造學習算法的時候,你總是會去嘗試很多新的想法,實現出很多版本的學習算法,如果每一次你實踐新想法的時候,你都要手動地檢測這些例子,去看看是表現差 還是表現好,那麽這很難讓你做出決定。到底是否使用詞幹提取,是否區分大小寫。但是通 過一個量化的數值評估,你可以看看這個數字,誤差是變大還是變小了。你可以通過它更快 地實踐你的新想法,它基本上非常直觀地告訴你:你的想法是提高了算法表現,還是讓它變 得更壞,這會大大提高你實踐算法時的速度。所以我強烈推薦在交叉驗證集上來實施誤差分 析,而不是在測試集上。但是,還是有一些人會在測試集上來做誤差分析。即使這從數學上 講是不合適的。所以我還是推薦你在交叉驗證向量上來做誤差分析。

總結一下,當你在研究一個新的機器學習問題時,我總是推薦你實現一個較為簡單快速、 即便不是那麽完美的算法。我幾乎從未見過人們這樣做。大家經常幹的事情是:花費大量的 時間在構造算法上,構造他們以為的簡單的方法。因此,不要擔心你的算法太簡單,或者太不完美,而是盡可能快地實現你的算法。當你有了初始的實現之後,它會變成一個非常有力 的工具,來幫助你決定下一步的做法。因為我們可以先看看算法造成的錯誤,通過誤差分析, 來看看他犯了什麽錯,然後來決定優化的方式。另一件事是:假設你有了一個快速而不完美 的算法實現,又有一個數值的評估數據,這會幫助你嘗試新的想法,快速地發現你嘗試的這些想法是否能夠提高算法的表現,從而你會更快地做出決定,在算法中放棄什麽,吸收什麽

誤差分析可以幫助我們系統化地選擇該做什麽。


11.3 類偏斜的誤差度量

在前面的課程中,我提到了誤差分析,以及設定誤差度量值的重要性。那就是,設定某 個實數來評估你的學習算法,並衡量它的表現,有了算法的評估和誤差度量值。有一件重要的事情要註意,就是使用一個合適的誤差度量值,這有時會對於你的學習算法造成非常微妙 的影響,這件重要的事情就是偏斜類(skewed classes)的問題。類偏斜情況表現為我們的訓

練集中有非常多的同一種類的實例,只有很少或沒有其他類的實例。 例如我們希望用算法來預測癌癥是否是惡性的,在我們的訓練集中,只有 0.5%的實例是惡性腫瘤。假設我們編寫一個非學習而來的算法,在所有情況下都預測腫瘤是良性的,那麽誤差只有 0.5%。然而我們通過訓練而得到的神經網絡算法卻有 1%的誤差。這時,誤差的 大小是不能視為評判算法效果的依據的。

查準率(Precision)和查全率(Recall) 我們將算法預測的結果分成四種情況:

1. 正確肯定(True Positive,TP):預測為真,實際為真

2. 正確否定(True Negative,TN):預測為假,實際為真

3. 錯誤肯定(False Positive,FP):預測為真,實際為假

4. 錯誤否定(False Negative,FN):預測為假,實際為假 則:

查準率=TP/(TP+FP)例,在所有我們預測有惡性腫瘤的病人中,實際上有惡性腫瘤的病 人的百分比,越高越好。

查全率=TP/(TP+FN)例,在所有實際上有惡性腫瘤的病人中,成功預測有惡性腫瘤的 病人的百分比,越高越好。

這樣,對於我們剛才那個總是預測病人腫瘤為良性的算法,其查全率是 0。


11.4 查全率和查準率之間的權衡

在之前的課程中,我們談到查準率和召回率,作為遇到偏斜類問題的評估度量值。在很 多應用中,我們希望能夠保證查準率和召回率的相對平衡。在這節課中,我將告訴你應該怎麽做,同時也向你展示一些查準率和召回率作為算法評 估度量值的更有效的方式。繼續沿用剛才預測腫瘤性質的例子。假使,我們的算法輸出的結 果在 0-1 之間,我們使用閥值 0.5 來預測真和假。

技術分享

查準率(Precision)=TP/(TP+FP) 例,在所有我們預測有惡性腫瘤的病人中,實際上 有惡性腫瘤的病人的百分比,越高越好。

查全率(Recall)=TP/(TP+FN)例,在所有實際上有惡性腫瘤的病人中,成功預測有惡 性腫瘤的病人的百分比,越高越好。

如果我們希望只在非常確信的情況下預測為真(腫瘤為惡性),即我們希望更高的查準 率,我們可以使用比 0.5 更大的閥值,如 0.7,0.9。這樣做我們會減少錯誤預測病人為惡性 腫瘤的情況,同時卻會增加未能成功預測腫瘤為惡性的情況。

如果我們希望提高查全率,盡可能地讓所有有可能是惡性腫瘤的病人都得到進一步地檢查、診斷,我們可以使用比 0.5更小的閥值,如 0.3。

我們可以將不同閥值情況下,查全率與查準率的關系繪制成圖表,曲線的形狀根據數據的不同而不同:

技術分享

我們希望有一個幫助我們選擇這個閥值的方法。一種方法是計算 F1 (F1 Score),其計算公式為:

技術分享

我們選擇使得 F1 值最高的閥值。


11.5 機器學習的數據

在之前的視頻中,我們討論了評價指標。在這個視頻中,我要稍微轉換一下,討論一下機器學習系統設計中另一個重要的方面,這往往涉及到用來訓練的數據有多少。在之前的一些視頻中,我曾告誡大家不要盲目地開始,而是花大量的時間來收集大量的數據,因為數據 有時是唯一能實際起到作用的。但事實證明,在一定條件下,我會在這個視頻裏講到這些條 件是什麽。得到大量的數據並在某種類型的學習算法中進行訓練,可以是一種有效的方法來 獲得一個具有良好性能的學習算法。而這種情況往往出現在這些條件對於你的問題都成立 並且你能夠得到大量數據的情況下。這可以是一個很好的方式來獲得非常高性能的學習算 法。因此,在這段視頻中,讓我們一起討論一下這個問題。

很多很多年前,我認識的兩位研究人員 Michele Banko 和 Eric Brill 進行了一項有趣的研究,他們嘗試通過機器學習算法來區分常見的易混淆的單詞,他們嘗試了許多種不同的算法,並發現數據量非常大時,這些不同類型的算法效果都很好。我們下面希望探討,什麽時候我 們會希望獲得更多數據,而非修改算法。

技術分享

通常情況下,首先思考這樣一個問題,“在這些特征面前,一個真人專家是否能有信心 地預測結果?”如果回答是肯定的,我們需要再思考我們的模型是怎樣的。如果算法是高偏 差的,且代價函數很小,那麽增加訓練集的數據量不太可能導致過擬合,可使得交叉驗證誤 差和訓練誤差之間差距更小。這種情況下,考慮獲得更多數據。

也可以這樣來認識,我們希望我們的算法低方差,低偏差,我們通過選擇更多的特征來降低方差,再通過增加數據量來降低偏差。

Ng第十一課:機器學習系統的設計(Machine Learning System Design)