應(yīng)用機器學(xué)習(xí)的建議

1.決定下一步做什么

到目前為止,我們已經(jīng)介紹了許多不同的學(xué)習(xí)算法,如果你一直跟著這些視頻的進度學(xué)習(xí),你會發(fā)現(xiàn)自己已經(jīng)不知不覺地成為一個了解許多先進機器學(xué)習(xí)技術(shù)的專家了。

然而,在懂機器學(xué)習(xí)的人當(dāng)中依然存在著很大的差距,一部分人確實掌握了怎樣高效有力地運用這些學(xué)習(xí)算法。而另一些人他們可能對我馬上要講的東西,就不是那么熟悉了。他們可能沒有完全理解怎樣運用這些算法。因此總是把時間浪費在毫無意義的嘗試上。我想做的是確保你在設(shè)計機器學(xué)習(xí)的系統(tǒng)時,你能夠明白怎樣選擇一條最合適、最正確的道路。因此,在這節(jié)視頻和之后的幾段視頻中,我將向你介紹一些實用的建議和指導(dǎo),幫助你明白怎樣進行選擇。具體來講,我將重點關(guān)注的問題是假如你在開發(fā)一個機器學(xué)習(xí)系統(tǒng),或者想試著改進一個機器學(xué)習(xí)系統(tǒng)的性能,你應(yīng)如何決定接下來應(yīng)該選擇哪條道路?為了解釋這一問題,我想仍然使用預(yù)測房價的學(xué)習(xí)例子,假如你已經(jīng)完成了正則化線性回歸,也就是最小化代價函數(shù)J的值,假如,在你得到你的學(xué)習(xí)參數(shù)以后,如果你要將你的假設(shè)函數(shù)放到一組新的房屋樣本上進行測試,假如說你發(fā)現(xiàn)在預(yù)測房價時產(chǎn)生了巨大的誤差,現(xiàn)在你的問題是要想改進這個算法,接下來應(yīng)該怎么辦?

實際上你可以想出很多種方法來改進這個算法的性能,其中一種辦法是使用更多的訓(xùn)練樣本。具體來講,也許你能想到通過電話調(diào)查或上門調(diào)查來獲取更多的不同的房屋出售數(shù)據(jù)。遺憾的是,我看到好多人花費了好多時間想收集更多的訓(xùn)練樣本。他們總認(rèn)為,要是我有兩倍甚至十倍數(shù)量的訓(xùn)練數(shù)據(jù),那就一定會解決問題的是吧?但有時候獲得更多的訓(xùn)練數(shù)據(jù)實際上并沒有作用。在接下來的幾段視頻中,我們將解釋原因。

我們也將知道怎樣避免把過多的時間浪費在收集更多的訓(xùn)練數(shù)據(jù)上,這實際上是于事無補的。另一個方法,你也許能想到的是嘗試選用更少的特征集。因此如果你有一系列特征比如x1,x2,x3等等。也許有很多特征,也許你可以花一點時間從這些特征中仔細(xì)挑選一小部分來防止過擬合?;蛘咭苍S你需要用更多的特征,也許目前的特征集,對你來講并不是很有幫助。你希望從獲取更多特征的角度來收集更多的數(shù)據(jù),同樣地,你可以把這個問題擴展為一個很大的項目,比如使用電話調(diào)查來得到更多的房屋案例,或者再進行土地測量來獲得更多有關(guān),這塊土地的信息等等,因此這是一個復(fù)雜的問題。同樣的道理,我們非常希望在花費大量時間完成這些工作之前,我們就能知道其效果如何。我們也可以嘗試增加多項式特征的方法,比如x1的平方,x2的平方,x1,x2的乘積,我們可以花很多時間來考慮這一方法,我們也可以考慮其他方法減小或增大正則化參數(shù)λ的值。我們列出的這個單子,上面的很多方法都可以擴展開來擴展成一個六個月或更長時間的項目。遺憾的是,大多數(shù)人用來選擇這些方法的標(biāo)準(zhǔn)是憑感覺的,也就是說,大多數(shù)人的選擇方法是隨便從這些方法中選擇一種,比如他們會說“噢,我們來多找點數(shù)據(jù)吧”,然后花上六個月的時間收集了一大堆數(shù)據(jù),然后也許另一個人說:“好吧,讓我們來從這些房子的數(shù)據(jù)中多找點特征吧”。我很遺憾不止一次地看到很多人花了至少六個月時間來完成他們隨便選擇的一種方法,而在六個月或者更長時間后,他們很遺憾地發(fā)現(xiàn)自己選擇的是一條不歸路。幸運的是,有一系列簡單的方法能讓你事半功倍,排除掉單子上的至少一半的方法,留下那些確實有前途的方法,同時也有一種很簡單的方法,只要你使用,就能很輕松地排除掉很多選擇,從而為你節(jié)省大量不必要花費的時間。最終達(dá)到改進機器學(xué)習(xí)系統(tǒng)性能的目的假設(shè)我們需要用一個線性回歸模型來預(yù)測房價,當(dāng)我們運用訓(xùn)練好了的模型來預(yù)測未知數(shù)據(jù)的時候發(fā)現(xiàn)有較大的誤差,我們下一步可以做什么?

1.獲得更多的訓(xùn)練樣本——通常是有效的,但代價較大,下面的方法也可能有效,可考慮先采用下面的幾種方法。
2.嘗試減少特征的數(shù)量
3.嘗試獲得更多的特征
4.嘗試增加多項式特征
5.嘗試減少正則化程度λ
6.嘗試增加正則化程度λ

我們不應(yīng)該隨機選擇上面的某種方法來改進我們的算法,而是運用一些機器學(xué)習(xí)診斷法來幫助我們知道上面哪些方法對我們的算法是有效的。

2.評估一個假設(shè)

如何避免過擬合和欠擬合的問題?

當(dāng)我們確定學(xué)習(xí)算法的參數(shù)時,我們考慮的是選擇參數(shù),來使訓(xùn)練誤差最小化,有人認(rèn)為,僅僅是因為這個函數(shù)有很小的訓(xùn)練誤差并不能說明它一定是一個好的假設(shè),它也有可能過擬合,即對新的數(shù)據(jù)沒有好的預(yù)測結(jié)果,那么怎么判斷一個假設(shè)是否過擬合呢?我們可以畫出假設(shè)函數(shù)h(x),然后觀察。但一般情況下,對于特征不止一個的例子,想要畫出假設(shè)函數(shù)來觀察是不可能的。

因此,我們需要一種評價假設(shè)函數(shù)的方法:
首先將數(shù)據(jù)分成兩部分,第一部分成為我們的訓(xùn)練集,第二部分成為我們的測試集,將所有數(shù)據(jù)分成訓(xùn)練集和測試集,其中一種 典型的分割方法是按照七比三的比例。m表示訓(xùn)練樣本的總數(shù),mtest表示測試樣本的總數(shù)。

最后再提醒一點,在這里我是選擇了前70%的數(shù)據(jù)作為訓(xùn)練集,后30%的數(shù)據(jù)作為測試集,但如果這組數(shù)據(jù)有某種規(guī)律或順序的話,那么最好是隨機選擇70%作為訓(xùn)練集,剩下的30%作為測試集。當(dāng)然如果你的數(shù)據(jù)已經(jīng)隨機分布了,你就可以選擇前70%和后30%。但如果你的數(shù)據(jù)不是隨機排列的,最好還是打亂順序,或者使用一種隨機的順序來構(gòu)建你的數(shù)據(jù)。

一種典型的方法來訓(xùn)練和測試你的學(xué)習(xí)算法,比如線性回歸算法。首先你需要對訓(xùn)練集進行學(xué)習(xí)得到參數(shù)θ。具體來講,就是最小化訓(xùn)練誤差J(θ),這里的J(θ)是使用那70%數(shù)據(jù)來定義得到的,也就是僅僅是訓(xùn)練數(shù)據(jù)。接下來你要計算測試誤差,用Jtest來表示測試誤差,那么你要做的就是把從訓(xùn)練集中學(xué)習(xí)得到的參數(shù)θ放到這里來計算測試誤差。

當(dāng)然這是我們使用線性回歸和平方誤差標(biāo)準(zhǔn)時,測試誤差的定義。如果考是考慮分類問題邏輯回歸問題呢?

訓(xùn)練和測試邏輯回歸的步驟和之前所說的非常類似。首先訓(xùn)練數(shù)據(jù),從70%的訓(xùn)練樣本中學(xué)習(xí)得到參數(shù)θ,然后計算測試誤差,目標(biāo)函數(shù)和我們平常做邏輯回歸的一樣,唯一的區(qū)別是,現(xiàn)在我們使用的是mtest個測試樣本。此外還可以使用錯誤分類誤差來檢驗預(yù)測值和實際值之間的差距(使用0/1錯誤分類度量來定義的測試誤差)。

如何進行諸如特征選擇一類的問題?比如學(xué)習(xí)算法多項式選擇的問題,或者學(xué)習(xí)算法正則化參數(shù)的選擇?

3.模型選擇和訓(xùn)練、驗證、測試集

對于一個數(shù)據(jù)集最合適的多項式次數(shù),怎么選用正確的特征來構(gòu)造學(xué)習(xí)算法?或者如何選擇學(xué)習(xí)算法中的正則化參數(shù)lambda?

假設(shè)我們要在10個不同次數(shù)的二項式模型之間進行選擇:

顯然越高次數(shù)的多項式模型越能夠適應(yīng)我們的訓(xùn)練數(shù)據(jù)集,但是適應(yīng)訓(xùn)練數(shù)據(jù)集并不代表著能推廣至一般情況,我們應(yīng)該選擇一個更能適應(yīng)一般情況的模型。我們需要使用交叉驗證集來幫助選擇模型。

即:使用60%的數(shù)據(jù)作為訓(xùn)練集,使用 20%的數(shù)據(jù)作為交叉驗證集,使用20%的數(shù)據(jù)作為測試集

模型選擇的方法為:

1.使用訓(xùn)練集訓(xùn)練出10個模型
2.用10個模型分別對交叉驗證集計算得出交叉驗證誤差(代價函數(shù)的值)
3.選取代價函數(shù)值最小的模型
4.用步驟3中選出的模型對測試集計算得出推廣誤差(代價函數(shù)的值)

當(dāng)面對這樣的模型選擇問題時,我們要做的是用驗證集來選擇模型,而不是用原來的測試集。

具體來講,我們首先要選取第一種假設(shè),第一個模型,然后最小化代價函數(shù),得到對應(yīng)一次模型的一個參數(shù)向量θ,一直求得各個對應(yīng)模型的參數(shù)變量。接著要做的不是像原來一樣用測試集來測試這些假設(shè),而是用驗證集來測試,然后計算出Jcv來觀察這些假設(shè)模型在驗證集上的效果如何。我們要做的就是用驗證集擬合出最佳參數(shù)d,這樣省下了測試集,可以用它來衡量或者估計算法選出的模型的泛化誤差。

用測試集選擇你的模型,然后使用相同的測試集來計算誤差,這不是一個好主意,通過測試集來選擇多項式的系數(shù),然后仍在測試集上計算誤差,把它當(dāng)做理想的泛化誤差,但是最好不要這樣做!分成訓(xùn)練集、驗證集和測試集是更好地選擇。

4.診斷偏差和方差

如果你在運行算法的時候,運行的不是很理想,多半是出現(xiàn)了偏差或方差過大的問題,換句話說要么是過擬合問題,要么是欠擬合問題,這種情況下,搞清楚是偏差問題還是方差問題或者兩者都有關(guān)是很重要的,因為這有利于我們找到有效的方法和途徑來改進算法。

如何觀察算法然后判斷是偏差問題還是方差問題?這對于改進你的學(xué)習(xí)算法的效果非常重要!

我們沿用之前所使用的訓(xùn)練誤差和驗證誤差的定義,分別是用訓(xùn)練集計算的,和利用驗證集計算的均方誤差,可以利用下面的函數(shù)圖像來分析出最佳d值。

具體來說,假設(shè)你得出了一個學(xué)習(xí)算法,而這個算法并沒有表現(xiàn)地像你期望的那么好,如果你的交叉驗證誤差或者測試集誤差都非常大,那么怎么判斷此時的學(xué)習(xí)算法出現(xiàn)了高偏差的問題還是高方差問題。

如果你的算法處于高偏差的情況,那么你的訓(xùn)練集誤差會很大,因為你的假設(shè)不能很好地擬合訓(xùn)練集數(shù)據(jù)。而你處于高方差的問題時,你的訓(xùn)練誤差通常都會很小,并且遠(yuǎn)遠(yuǎn)小于交叉驗證誤差。

即:
對于訓(xùn)練集,當(dāng) d 較小時,模型擬合程度更低,誤差較大;隨著 d 的增長,擬合程度提高,誤差減小。

對于交叉驗證集,當(dāng) d較小時,模型擬合程度低,誤差較大;但是隨著 d 的增長,誤差呈現(xiàn)先減小后增大的趨勢,轉(zhuǎn)折點是我們的模型開始過擬合訓(xùn)練數(shù)據(jù)集的時候。

如果我們的交叉驗證集誤差較大,我們?nèi)绾闻袛嗍欠讲钸€是偏差呢?根據(jù)上面的圖表,我們知道:

1.訓(xùn)練集誤差和交叉驗證集誤差近似時:偏差/欠擬合
2.交叉驗證集誤差遠(yuǎn)大于訓(xùn)練集誤差時:方差/過擬合

采取什么措施來應(yīng)對高方差和高偏差?

5. 正則化和偏差/方差

在我們在訓(xùn)練模型的過程中,一般會使用一些正則化方法來防止過擬合。但是我們可能會正則化的程度太高或太小了,即我們在選擇λ的值時也需要思考與剛才選擇多項式模型次數(shù)類似的問題。

我們選擇一系列的想要測試的λ值,通常是 0-10之間的呈現(xiàn)2倍關(guān)系的值(如:0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5.12,10共12個)。 我們同樣把數(shù)據(jù)分為訓(xùn)練集、交叉驗證集和測試集。

選擇λ的方法為:

1.使用訓(xùn)練集訓(xùn)練出12個不同程度正則化的模型
2.用12個模型分別對交叉驗證集計算的出交叉驗證誤差
3.選擇得出交叉驗證誤差最小的模型
4.運用步驟3中選出模型對測試集計算得出推廣誤差,我們也可以同時將訓(xùn)練集和交叉驗證集模型的代價函數(shù)誤差與λ的值繪制在一張圖表上:

  • 當(dāng) λ較小時,訓(xùn)練集誤差較?。ㄟ^擬合)而交叉驗證集誤差較大
  • 隨著 λ的增加,訓(xùn)練集誤差不斷增加(欠擬合),而交叉驗證集誤差則是先減小后增加
6.學(xué)習(xí)曲線

學(xué)習(xí)曲線就是一種很好的工具,我經(jīng)常使用學(xué)習(xí)曲線來判斷某一個學(xué)習(xí)算法是否處于偏差、方差問題。學(xué)習(xí)曲線是學(xué)習(xí)算法的一個很好的合理檢驗sanity check)。學(xué)習(xí)曲線是將訓(xùn)練集誤差和交叉驗證集誤差作為訓(xùn)練集樣本數(shù)量(m)的函數(shù)繪制的圖表。

即,如果我們有100行數(shù)據(jù),我們從1行數(shù)據(jù)開始,逐漸學(xué)習(xí)更多行的數(shù)據(jù)。思想是:當(dāng)訓(xùn)練較少行數(shù)據(jù)的時候,訓(xùn)練的模型將能夠非常完美地適應(yīng)較少的訓(xùn)練數(shù)據(jù),但是訓(xùn)練出來的模型卻不能很好地適應(yīng)交叉驗證集數(shù)據(jù)或測試集數(shù)據(jù)。

如何利用學(xué)習(xí)曲線識別高偏差/欠擬合:作為例子,我們嘗試用一條直線來適應(yīng)下面的數(shù)據(jù),可以看出,無論訓(xùn)練集有多么大誤差都不會有太大改觀:也就是說在高偏差/欠擬合的情況下,增加數(shù)據(jù)到訓(xùn)練集不一定能有幫助。

如何利用學(xué)習(xí)曲線識別高方差/過擬合:假設(shè)我們使用一個非常高次的多項式模型,并且正則化非常小,可以看出,當(dāng)交叉驗證集誤差遠(yuǎn)大于訓(xùn)練集誤差時,往訓(xùn)練集增加更多數(shù)據(jù)可以提高模型的效果。

也就是說在高方差/過擬合的情況下,增加更多數(shù)據(jù)到訓(xùn)練集可能可以提高算法效果。

7.決定下一步做什么

我們已經(jīng)介紹了怎樣評價一個學(xué)習(xí)算法,我們討論了模型選擇問題,偏差和方差的問題。那么這些診斷法則怎樣幫助我們判斷,哪些方法可能有助于改進學(xué)習(xí)算法的效果,而哪些可能是徒勞的呢?

讓我們再次回到最開始的例子,在那里尋找答案,這就是我們之前的例子?;仡?1.1 中提出的六種可選的下一步,讓我們來看一看我們在什么情況下應(yīng)該怎樣選擇:

1.獲得更多的訓(xùn)練樣本——解決高方差
2.嘗試減少特征的數(shù)量——解決高方差
3.嘗試獲得更多的特征——解決高偏差
4.嘗試增加多項式特征——解決高偏差
5.嘗試減少正則化程度λ——解決高偏差
6.嘗試增加正則化程度λ——解決高方差

神經(jīng)網(wǎng)絡(luò)的方差和偏差:

使用較小的神經(jīng)網(wǎng)絡(luò),類似于參數(shù)較少的情況,容易導(dǎo)致高偏差和欠擬合,但計算代價較小使用較大的神經(jīng)網(wǎng)絡(luò),類似于參數(shù)較多的情況,容易導(dǎo)致高方差和過擬合,雖然計算代價比較大,但是可以通過正則化手段來調(diào)整而更加適應(yīng)數(shù)據(jù)。
通常選擇較大的神經(jīng)網(wǎng)絡(luò)并采用正則化處理會比采用較小的神經(jīng)網(wǎng)絡(luò)效果要好。
對于神經(jīng)網(wǎng)絡(luò)中的隱藏層的層數(shù)的選擇,通常從一層開始逐漸增加層數(shù),為了更好地作選擇,可以把數(shù)據(jù)分為訓(xùn)練集、交叉驗證集和測試集,針對不同隱藏層層數(shù)的神經(jīng)網(wǎng)絡(luò)訓(xùn)練神經(jīng)網(wǎng)絡(luò),
然后選擇交叉驗證集代價最小的神經(jīng)網(wǎng)絡(luò)。

好的,以上就是我們介紹的偏差和方差問題,以及診斷該問題的學(xué)習(xí)曲線方法。在改進學(xué)習(xí)算法的表現(xiàn)時,你可以充分運用以上這些內(nèi)容來判斷哪些途徑可能是有幫助的。而哪些方法可能是無意義的。如果你理解了以上幾節(jié)視頻中介紹的內(nèi)容,并且懂得如何運用。那么你已經(jīng)可以使用機器學(xué)習(xí)方法有效的解決實際問題了。你也能像硅谷的大部分機器學(xué)習(xí)從業(yè)者一樣,他們每天的工作就是使用這些學(xué)習(xí)算法來解決眾多實際問題。我希望這幾節(jié)中提到的一些技巧,關(guān)于方差、偏差,以及學(xué)習(xí)曲線為代表的診斷法能夠真正幫助你更有效率地應(yīng)用機器學(xué)習(xí),讓它們高效地工作。

機器學(xué)習(xí)系統(tǒng)的設(shè)計

8.首先要做什么

在接下來的視頻中,我將談到機器學(xué)習(xí)系統(tǒng)的設(shè)計。這些視頻將談及在設(shè)計復(fù)雜的機器學(xué)習(xí)系統(tǒng)時,你將遇到的主要問題。同時我們會試著給出一些關(guān)于如何巧妙構(gòu)建一個復(fù)雜的機器學(xué)習(xí)系統(tǒng)的建議。下面的課程的的數(shù)學(xué)性可能不是那么強,但是我認(rèn)為我們將要講到的這些東西是非常有用的,可能在構(gòu)建大型的機器學(xué)習(xí)系統(tǒng)時,節(jié)省大量的時間。

本周以一個垃圾郵件分類器算法為例進行討論。

為了解決這樣一個問題,我們首先要做的決定是如何選擇并表達(dá)特征向量x。我們可以選擇一個由100個最常出現(xiàn)在垃圾郵件中的詞所構(gòu)成的列表,根據(jù)這些詞是否有在郵件中出現(xiàn),來獲得我們的特征向量(出現(xiàn)為1,不出現(xiàn)為0),尺寸為100×1。

為了構(gòu)建這個分類器算法,我們可以做很多事,例如:

1.收集更多的數(shù)據(jù),讓我們有更多的垃圾郵件和非垃圾郵件的樣本
2.基于郵件的路由信息開發(fā)一系列復(fù)雜的特征
3.基于郵件的正文信息開發(fā)一系列復(fù)雜的特征,包括考慮截詞的處理
4.為探測刻意的拼寫錯誤(把watch 寫成w4tch)開發(fā)復(fù)雜的算法

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

我們將在隨后的課程中講誤差分析,我會告訴你怎樣用一個更加系統(tǒng)性的方法,從一堆不同的方法中,選取合適的那一個。因此,你更有可能選擇一個真正的好方法,能讓你花上幾天幾周,甚至是幾個月去進行深入的研究。

9.誤差分析

在本次課程中,我們將會講到誤差分析(Error Analysis)的概念。這會幫助你更系統(tǒng)地做出決定。如果你準(zhǔn)備研究機器學(xué)習(xí)的東西,或者構(gòu)造機器學(xué)習(xí)應(yīng)用程序,最好的實踐方法不是建立一個非常復(fù)雜的系統(tǒng),擁有多么復(fù)雜的變量;而是構(gòu)建一個簡單的算法,這樣你可以很快地實現(xiàn)它。

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

構(gòu)建一個學(xué)習(xí)算法的推薦方法為:

  1. 從一個簡單的能快速實現(xiàn)的算法開始,實現(xiàn)該算法并用交叉驗證集數(shù)據(jù)測試這個算法
    2.繪制學(xué)習(xí)曲線,決定是增加更多數(shù)據(jù),或者添加更多特征,還是其他選擇
    3.進行誤差分析:人工檢查交叉驗證集中我們算法中產(chǎn)生預(yù)測誤差的樣本,看看這些樣本是否有某種系統(tǒng)化的趨勢

以我們的垃圾郵件過濾器為例,誤差分析要做的既是檢驗交叉驗證集中我們的算法產(chǎn)生錯誤預(yù)測的所有郵件,看:是否能將這些郵件按照類分組。例如醫(yī)藥品垃圾郵件,仿冒品垃圾郵件或者密碼竊取郵件等。然后看分類器對哪一組郵件的預(yù)測誤差最大,并著手優(yōu)化。

思考怎樣能改進分類器。例如,發(fā)現(xiàn)是否缺少某些特征,記下這些特征出現(xiàn)的次數(shù)。

例如記錄下錯誤拼寫出現(xiàn)了多少次,異常的郵件路由情況出現(xiàn)了多少次等等,然后從出現(xiàn)次數(shù)最多的情況開始著手優(yōu)化。

誤差分析并不總能幫助我們判斷應(yīng)該采取怎樣的行動。有時我們需要嘗試不同的模型,然后進行比較,在模型比較時,用數(shù)值來判斷哪一個模型更好更有效,通常我們是看交叉驗證集的誤差。

在我們的垃圾郵件分類器例子中,對于“我們是否應(yīng)該將discount/discounts/discounted/discounting處理成同一個詞?”如果這樣做可以改善我們算法,我們會采用一些截詞軟件。誤差分析不能幫助我們做出這類判斷,我們只能嘗試采用和不采用截詞軟件這兩種不同方案,然后根據(jù)數(shù)值檢驗的結(jié)果來判斷哪一種更好。

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

總結(jié)一下,當(dāng)你在研究一個新的機器學(xué)習(xí)問題時,我總是推薦你實現(xiàn)一個較為簡單快速、即便不是那么完美的算法。我?guī)缀鯊奈匆娺^人們這樣做。大家經(jīng)常干的事情是:花費大量的時間在構(gòu)造算法上,構(gòu)造他們以為的簡單的方法。因此,不要擔(dān)心你的算法太簡單,或者太不完美,而是盡可能快地實現(xiàn)你的算法。當(dāng)你有了初始的實現(xiàn)之后,它會變成一個非常有力的工具,來幫助你決定下一步的做法。因為我們可以先看看算法造成的錯誤,通過誤差分析,來看看他犯了什么錯,然后來決定優(yōu)化的方式。另一件事是:假設(shè)你有了一個快速而不完美的算法實現(xiàn),又有一個數(shù)值的評估數(shù)據(jù),這會幫助你嘗試新的想法,快速地發(fā)現(xiàn)你嘗試的這些想法是否能夠提高算法的表現(xiàn),從而你會更快地做出決定,在算法中放棄什么,吸收什么誤差分析可以幫助我們系統(tǒng)化地選擇該做什么。

10.類偏斜的誤差度量

在前面的課程中,我提到了誤差分析,以及設(shè)定誤差度量值的重要性。那就是,設(shè)定某個實數(shù)來評估你的學(xué)習(xí)算法,并衡量它的表現(xiàn),有了算法的評估和誤差度量值。有一件重要的事情要注意,就是使用一個合適的誤差度量值,這有時會對于你的學(xué)習(xí)算法造成非常微妙的影響,這件重要的事情就是偏斜類(skewed classes)的問題。類偏斜情況表現(xiàn)為我們的訓(xùn)練集中有非常多的同一種類的樣本,只有很少或沒有其他類的樣本。

例如我們希望用算法來預(yù)測癌癥是否是惡性的,在我們的訓(xùn)練集中,只有0.5%的實例是惡性腫瘤。假設(shè)我們編寫一個非學(xué)習(xí)而來的算法,在所有情況下都預(yù)測腫瘤是良性的,那么誤差只有0.5%。然而我們通過訓(xùn)練而得到的神經(jīng)網(wǎng)絡(luò)算法卻有1%的誤差。這時,誤差的大小是不能視為評判算法效果的依據(jù)的。

查準(zhǔn)率Precision)和查全率Recall) 我們將算法預(yù)測的結(jié)果分成四種情況:

  1. 正確肯定True Positive,TP):預(yù)測為真,實際為真
    2.正確否定True Negative,TN):預(yù)測為假,實際為假
    3.錯誤肯定False Positive,FP):預(yù)測為真,實際為假
    4.錯誤否定False Negative,FN):預(yù)測為假,實際為真

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

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

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

12.查準(zhǔn)率和查全率之間的權(quán)衡

在之前的課程中,我們談到查準(zhǔn)率和召回率,作為遇到偏斜類問題的評估度量值。在很多應(yīng)用中,我們希望能夠保證查準(zhǔn)率和召回率的相對平衡。

在這節(jié)課中,我將告訴你應(yīng)該怎么做,同時也向你展示一些查準(zhǔn)率和召回率作為算法評估度量值的更有效的方式。繼續(xù)沿用剛才預(yù)測腫瘤性質(zhì)的例子。假使,我們的算法輸出的結(jié)果在0-1 之間,我們使用閥值0.5 來預(yù)測真和假。

查準(zhǔn)率(Precision)=TP/(TP+FP)

例,在所有我們預(yù)測有惡性腫瘤的病人中,實際上有惡性腫瘤的病人的百分比,越高越好。

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

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

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

我們可以將不同閥值情況下,查全率與查準(zhǔn)率的關(guān)系繪制成圖表,曲線的形狀根據(jù)數(shù)據(jù)的不同而不同:

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

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

13.機器學(xué)習(xí)的數(shù)據(jù)

在之前的視頻中,我們討論了評價指標(biāo)。在這個視頻中,我要稍微轉(zhuǎn)換一下,討論一下機器學(xué)習(xí)系統(tǒng)設(shè)計中另一個重要的方面,這往往涉及到用來訓(xùn)練的數(shù)據(jù)有多少。在之前的一些視頻中,我曾告誡大家不要盲目地開始,而是花大量的時間來收集大量的數(shù)據(jù),因為數(shù)據(jù)有時是唯一能實際起到作用的。但事實證明,在一定條件下,我會在這個視頻里講到這些條件是什么。得到大量的數(shù)據(jù)并在某種類型的學(xué)習(xí)算法中進行訓(xùn)練,可以是一種有效的方法來獲得一個具有良好性能的學(xué)習(xí)算法。而這種情況往往出現(xiàn)在這些條件對于你的問題都成立。

并且你能夠得到大量數(shù)據(jù)的情況下。這可以是一個很好的方式來獲得非常高性能的學(xué)習(xí)算法。

很多很多年前,我認(rèn)識的兩位研究人員Michele BankoEric Brill進行了一項有趣的研究,他們嘗試通過機器學(xué)習(xí)算法來區(qū)分常見的易混淆的單詞,他們嘗試了許多種不同的算法,并發(fā)現(xiàn)數(shù)據(jù)量非常大時,這些不同類型的算法效果都很好。

比如,在這樣的句子中:早餐我吃了__個雞蛋(to,two,too),在這個例子中,“早餐我吃了2個雞蛋”,這是一個易混淆的單詞的例子。于是他們把諸如這樣的機器學(xué)習(xí)問題,當(dāng)做一類監(jiān)督學(xué)習(xí)問題,并嘗試將其分類,什么樣的詞,在一個英文句子特定的位置,才是合適的。他們用了幾種不同的學(xué)習(xí)算法,這些算法都是在他們2001年進行研究的時候,都已經(jīng)被公認(rèn)是比較領(lǐng)先的。因此他們使用了一個方差,用于邏輯回歸上的一個方差,被稱作"感知器"(perceptron)。他們也采取了一些過去常用,但是現(xiàn)在比較少用的算法,比如 Winnow算法,很類似于回歸問題,但在一些方面又有所不同,過去用得比較多,但現(xiàn)在用得不太多。還有一種基于內(nèi)存的學(xué)習(xí)算法,現(xiàn)在也用得比較少了,但是我稍后會討論一點,而且他們用了一個樸素算法。這些具體算法的細(xì)節(jié)不那么重要,我們下面希望探討,什么時候我們會希望獲得更多數(shù)據(jù),而非修改算法。他們所做的就是改變了訓(xùn)練數(shù)據(jù)集的大小,并嘗試將這些學(xué)習(xí)算法用于不同大小的訓(xùn)練數(shù)據(jù)集中,這就是他們得到的結(jié)果。

這些趨勢非常明顯,首先大部分算法,都具有相似的性能,其次,隨著訓(xùn)練數(shù)據(jù)集的增大,在橫軸上代表以百萬為單位的訓(xùn)練集大小,從0.1個百萬到1000百萬,也就是到了10億規(guī)模的訓(xùn)練集的樣本,這些算法的性能也都對應(yīng)地增強了。

事實上,如果你選擇任意一個算法,可能是選擇了一個"劣等的"算法,如果你給這個劣等算法更多的數(shù)據(jù),那么從這些例子中看起來的話,它看上去很有可能會其他算法更好,甚至?xí)?優(yōu)等算法"更好。由于這項原始的研究非常具有影響力,因此已經(jīng)有一系列許多不同的研究顯示了類似的結(jié)果。這些結(jié)果表明,許多不同的學(xué)習(xí)算法有時傾向于表現(xiàn)出非常相似的表現(xiàn),這還取決于一些細(xì)節(jié),但是真正能提高性能的,是你能夠給一個算法大量的訓(xùn)練數(shù)據(jù)。像這樣的結(jié)果,引起了一種在機器學(xué)習(xí)中的普遍共識:"取得成功的人不是擁有最好算法的人,而是擁有最多數(shù)據(jù)的人"。

那么這種說法在什么時候是真,什么時候是假呢?因為如果我們有一個學(xué)習(xí)算法,并且如果這種說法是真的,那么得到大量的數(shù)據(jù)通常是保證我們具有一個高性能算法的最佳方式,而不是去爭辯應(yīng)該用什么樣的算法。

假如有這樣一些假設(shè),在這些假設(shè)下有大量我們認(rèn)為有用的訓(xùn)練集,我們假設(shè)在我們的機器學(xué)習(xí)問題中,特征值x包含了足夠的信息,這些信息可以幫助我們用來準(zhǔn)確地預(yù)測y,例如,如果我們采用了一些容易混淆的詞,如:twoto、too,假如說它能夠描述x,捕捉到需要填寫的空白處周圍的詞語,那么特征捕捉到之后,我們就希望有對于“早飯我吃了__雞蛋”,那么這就有大量的信息來告訴我中間我需要填的詞是“兩個”(two),而不是單詞 totoo,因此特征捕捉,哪怕是周圍詞語中的一個詞,就能夠給我足夠的信息來確定出標(biāo)簽 y是什么。換句話說,從這三組易混淆的詞中,我應(yīng)該選什么詞來填空。

那么讓我們來看一看,大量的數(shù)據(jù)是有幫助的情況。假設(shè)特征值有足夠的信息來預(yù)測y值,假設(shè)我們使用一種需要大量參數(shù)的學(xué)習(xí)算法,比如有很多特征的邏輯回歸或線性回歸,或者用帶有許多隱藏單元的神經(jīng)網(wǎng)絡(luò),那又是另外一種帶有很多參數(shù)的學(xué)習(xí)算法,這些都是非常強大的學(xué)習(xí)算法,它們有很多參數(shù),這些參數(shù)可以擬合非常復(fù)雜的函數(shù),因此我要調(diào)用這些,我將把這些算法想象成低偏差算法,因為我們能夠擬合非常復(fù)雜的函數(shù),而且因為我們有非常強大的學(xué)習(xí)算法,這些學(xué)習(xí)算法能夠擬合非常復(fù)雜的函數(shù)。很有可能,如果我們用這些數(shù)據(jù)運行這些算法,這種算法能很好地擬合訓(xùn)練集,因此,訓(xùn)練誤差就會很低了。

現(xiàn)在假設(shè)我們使用了非常非常大的訓(xùn)練集,在這種情況下,盡管我們希望有很多參數(shù),但是如果訓(xùn)練集比參數(shù)的數(shù)量還大,甚至是更多,那么這些算法就不太可能會過度擬合。也就是說訓(xùn)練誤差有希望接近測試誤差。

另一種考慮這個問題的角度是為了有一個高性能的學(xué)習(xí)算法,我們希望它不要有高的偏差和方差。

因此偏差問題,我么將通過確保有一個具有很多參數(shù)的學(xué)習(xí)算法來解決,以便我們能夠得到一個較低偏差的算法,并且通過用非常大的訓(xùn)練集來保證。

我們在此沒有方差問題,我們的算法將沒有方差,并且通過將這兩個值放在一起,我們最終可以得到一個低誤差和低方差的學(xué)習(xí)算法。這使得我們能夠很好地測試測試數(shù)據(jù)集。從根本上來說,這是一個關(guān)鍵的假設(shè):特征值有足夠的信息量,且我們有一類很好的函數(shù),這是為什么能保證低誤差的關(guān)鍵所在。它有大量的訓(xùn)練數(shù)據(jù)集,這能保證得到更多的方差值,因此這給我們提出了一些可能的條件,如果你有大量的數(shù)據(jù),而且你訓(xùn)練了一種帶有很多參數(shù)的學(xué)習(xí)算法,那么這將會是一個很好的方式,來提供一個高性能的學(xué)習(xí)算法。

我覺得關(guān)鍵的測試:首先,一個人類專家看到了特征值 x,能很有信心的預(yù)測出y值嗎?因為這可以證明 y可以根據(jù)特征值x被準(zhǔn)確地預(yù)測出來。其次,我們實際上能得到一組龐大的訓(xùn)練集,并且在這個訓(xùn)練集中訓(xùn)練一個有很多參數(shù)的學(xué)習(xí)算法嗎?如果你不能做到這兩者,那么更多時候,你會得到一個性能很好的學(xué)習(xí)算法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容