本文介紹機(jī)器學(xué)習(xí)算法的性能評(píng)估的方法擂错,包括算法高偏差還是高方差的診斷蝇裤,學(xué)習(xí)曲線等。從工程應(yīng)用的角度來(lái)講秦士,算法只需要知道原理缺厉,并不需要真正去實(shí)現(xiàn),數(shù)值專家們幫我們實(shí)現(xiàn)了大量的開源算法可供我們使用隧土。而怎么樣評(píng)估某個(gè)算法的性能以及怎么樣去優(yōu)化性能反而是工程應(yīng)用領(lǐng)域最重要的問(wèn)題提针。照例,文中難免有公式曹傀,需要正常顯示公式請(qǐng)移步 http://blog.kamidox.com/evaluating.html
為什么需要評(píng)估機(jī)器學(xué)習(xí)算法的性能
當(dāng)我們辛苦開發(fā)出來(lái)的機(jī)器學(xué)習(xí)算法不能很好地預(yù)測(cè)新數(shù)據(jù)時(shí)辐脖,我們?cè)撛趺崔k呢?一般情況下皆愉,有以下幾個(gè)方法:
- 獲取更多的訓(xùn)練數(shù)據(jù)
- 減少輸入的特征數(shù)量嗜价,避免出現(xiàn)過(guò)擬合
- 增加有價(jià)值的特征,即重新解讀并理解訓(xùn)練數(shù)據(jù)
- 增加多項(xiàng)式特征
- 減小正則化參數(shù) $\lambda$
- 增大正則化參數(shù) $\lambda$
如何評(píng)估機(jī)器學(xué)習(xí)算法幕庐,以便遇到問(wèn)題時(shí)能知道用上面方法中的哪個(gè)方法久锥?
- 對(duì)機(jī)器學(xué)習(xí)算法的性能進(jìn)行評(píng)估,接下來(lái)就要介紹機(jī)器學(xué)習(xí)算法性能評(píng)估的方法
- 對(duì)機(jī)器學(xué)習(xí)算法進(jìn)行診斷异剥,診斷是指通過(guò)對(duì)機(jī)器學(xué)習(xí)算法進(jìn)行測(cè)試瑟由,以便找出算法在哪種情況下能良好地工作,哪種情況下無(wú)法良好地工作冤寿。進(jìn)而找出算法性能優(yōu)化的方向和方法歹苦。
預(yù)測(cè)函數(shù)模型性能評(píng)估
怎么樣判斷我們的預(yù)測(cè)函數(shù)模型的性能是可以接受的呢?
我們可以把訓(xùn)練數(shù)據(jù)集分成兩部分督怜,隨機(jī)選擇 70% 的訓(xùn)練數(shù)據(jù)作為訓(xùn)練數(shù)據(jù)集殴瘦,用來(lái)訓(xùn)練機(jī)器學(xué)習(xí)算法;另外 30% 作為測(cè)試數(shù)據(jù)集号杠,用來(lái)驗(yàn)證訓(xùn)練出來(lái)的機(jī)器學(xué)習(xí)算法針對(duì)這些測(cè)試數(shù)據(jù)集的誤差蚪腋。一個(gè)好的機(jī)器學(xué)習(xí)算法應(yīng)該是對(duì)訓(xùn)練數(shù)據(jù)集成本比較低,即較準(zhǔn)確地?cái)M合數(shù)據(jù)究流,同時(shí)對(duì)測(cè)試數(shù)據(jù)集誤差比較小辣吃,即對(duì)未知數(shù)據(jù)有良好的預(yù)測(cè)性。
如何計(jì)算測(cè)試數(shù)據(jù)集的誤差呢芬探?
簡(jiǎn)單地說(shuō),就是用測(cè)試數(shù)據(jù)集和訓(xùn)練出來(lái)的機(jī)器學(xué)習(xí)算法參數(shù)厘惦,代入相應(yīng)的成本函數(shù)里計(jì)算測(cè)試數(shù)據(jù)集的成本偷仿。
針對(duì)線性回歸算法哩簿,我們可以使用下面的公式計(jì)算測(cè)試數(shù)據(jù)集的誤差,其中 m 是測(cè)試數(shù)據(jù)集的個(gè)數(shù):
$$
J_{test}(\theta) = \frac{1}{2m} \sum_{i=0}^m \left( h_\theta(x^{(i)}) - y^{(i)} \right)^2
$$
針對(duì)邏輯回歸算法酝静,可以使用下面的公式計(jì)算測(cè)試數(shù)據(jù)集的誤差节榜,其中 m 是測(cè)試數(shù)據(jù)集的個(gè)數(shù):
$$
J_{test}(\theta) = -\frac{1}{m} \sum_{i=1}^m \left[ log(h_\theta(x^{(i)})) + (1 - y^{(i)}) log(1 - h_\theta(x^{(i)})) \right]
$$
針對(duì)分類問(wèn)題時(shí),還可以用分類錯(cuò)誤率來(lái)代替成本函數(shù)算法别智,從而更直觀地觀察到一個(gè)算法對(duì)測(cè)試數(shù)據(jù)集的誤差情況宗苍。我們定義錯(cuò)誤率為:
$$
err(h_\theta(x), y) = \begin{cases}
1, & \text{if error classification. $h_\theta(x) \geq 0.5$, $y$ = 0 or $h_\theta(x) < 0.5$, $y$ = 1} \\
0, & \text{if correct classification. $h_\theta(x) \geq 0.5$, $y$ = 1 or $h_\theta(x) < 0.5$, $y$ = 0} \\
\end{cases}
$$
如何直觀地理解錯(cuò)誤率?如果預(yù)測(cè)出錯(cuò)了 (即實(shí)際值是 1 預(yù)測(cè)為 0 薄榛,或者實(shí)際值是 0 預(yù)測(cè)為 1) 讳窟,則成本算為 1 。如果預(yù)測(cè)正確了敞恋,成本算為 0 丽啡。
測(cè)試數(shù)據(jù)集的錯(cuò)誤率定義為:
$$
Test Error = \frac{1}{m} \sum_{i=0}^m err(h_\theta(x^{(i)}), y^{(i)})
$$
其中,m 為測(cè)試數(shù)據(jù)集的個(gè)數(shù)硬猫,$(x^{(i)}), y^{(i)})$ 為測(cè)試數(shù)據(jù)补箍。直觀地理解,就是針對(duì)測(cè)試數(shù)據(jù)集啸蜜,其錯(cuò)誤預(yù)測(cè)的數(shù)據(jù)的個(gè)數(shù)坑雅。
模型選擇
模型選擇問(wèn)題包括怎么樣選擇多項(xiàng)式來(lái)擬合數(shù)據(jù),怎么樣把數(shù)據(jù)集分成訓(xùn)練數(shù)據(jù)集衬横,驗(yàn)證數(shù)據(jù)集裹粤,測(cè)試數(shù)據(jù)集,怎么樣確定正則化參數(shù) lambda 的值等等冕香。
以多項(xiàng)式模型選擇為例蛹尝。假設(shè)我們用一階多項(xiàng)式,二階多項(xiàng)式悉尾,三階多項(xiàng)式 ... 十階多項(xiàng)式來(lái)擬合數(shù)據(jù)突那,多項(xiàng)式的階數(shù)我們記為 d。我們把數(shù)據(jù)集分成訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集构眯。先用訓(xùn)練數(shù)據(jù)集訓(xùn)練出機(jī)器學(xué)習(xí)算法的參數(shù) $\theta^{(1)}, \theta^{(2)}, \theta^{(3)}, ... , \theta^{(10)}$ 分別代表從一階到十階多項(xiàng)式的參數(shù)愕难。這個(gè)時(shí)候我們?cè)儆脺y(cè)試數(shù)據(jù)集算出針對(duì)測(cè)試數(shù)據(jù)集的成本 $J_test(\theta)$ 看哪個(gè)模型的測(cè)試數(shù)據(jù)集成本最低,這樣我們選擇這個(gè)測(cè)試數(shù)據(jù)集最低的多項(xiàng)式來(lái)擬合我們的數(shù)據(jù)惫霸。但實(shí)際上猫缭,這是不公平的,因?yàn)槲覀兺ㄟ^(guò)測(cè)試數(shù)據(jù)集的成本來(lái)選擇多項(xiàng)式時(shí)壹店,我們可能選擇了一個(gè)針對(duì)測(cè)試數(shù)據(jù)集成本最低的多項(xiàng)式猜丹,即在模型選擇過(guò)程中,我們通過(guò)測(cè)試數(shù)據(jù)集擬合了多項(xiàng)式的項(xiàng)數(shù) d硅卢。
為了解決這個(gè)問(wèn)題射窒,我們把數(shù)據(jù)分成三部分藏杖,隨機(jī)選擇 60% 的數(shù)據(jù)作為訓(xùn)練數(shù)據(jù)集,其成本記為 $J(\theta)$脉顿,隨機(jī)選擇剩下的 20% 數(shù)據(jù)作為交叉驗(yàn)證數(shù)據(jù)集 (Cross Validation)蝌麸,其成本記為 $J_{cv}(\theta)$,剩下的 20% 作為測(cè)試數(shù)據(jù)集艾疟,其成本記為 $J_{test}(\theta)$来吩。
在模型選擇時(shí),我們使用訓(xùn)練數(shù)據(jù)集來(lái)訓(xùn)練算法參數(shù)蔽莱,用交叉驗(yàn)證數(shù)據(jù)集來(lái)驗(yàn)證參數(shù)弟疆,選擇交叉驗(yàn)證數(shù)據(jù)集的成本 $J_{cv}(\theta)$ 最小的參數(shù)來(lái)選擇合適的模型多項(xiàng)式 d ,最后再用測(cè)試數(shù)據(jù)集來(lái)測(cè)試選擇出來(lái)的模型的針對(duì)測(cè)試數(shù)據(jù)集的錯(cuò)誤率碾褂。因?yàn)樵谀P瓦x擇過(guò)程中兽间,我們使用了交叉驗(yàn)證數(shù)據(jù)集,所以適配模型多項(xiàng)式 d 的過(guò)程中正塌,實(shí)際上是沒有使用我們的測(cè)試數(shù)據(jù)集的嘀略。這樣保證了使用測(cè)試數(shù)據(jù)集來(lái)計(jì)算成本時(shí),確保我們選擇出來(lái)的模型沒有見過(guò)測(cè)試數(shù)據(jù)乓诽,即測(cè)試數(shù)據(jù)集沒有參與模型選擇的過(guò)程帜羊。這樣算出來(lái)的針對(duì)測(cè)試數(shù)據(jù)集的成本是相對(duì)公平合理的。
當(dāng)然鸠天,在實(shí)踐過(guò)程中讼育,很多人直接把數(shù)據(jù)集分成訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集,然后通過(guò)比較測(cè)試數(shù)據(jù)集選擇的成本來(lái)選擇模型稠集。
方差與偏差 Bias vs. Variance
假定 $J_{train}(\theta)$ 表示訓(xùn)練誤差奶段;$J_{cv}(\theta)$ 表示交叉驗(yàn)證誤差;那么高方差意味著 $J_{train}(\theta)$ 很大剥纷,$J_{cv}(\theta)$ 也很大痹籍,這時(shí)算法是欠擬合的。高偏差定義為 $J_{train}(\theta)$ 很小晦鞋,但 $J_{cv}(\theta)$ 很大蹲缠,這時(shí)算法是過(guò)擬合的。
正則化與方差及偏差的關(guān)系
當(dāng) lambda 為零時(shí)悠垛,容易產(chǎn)生過(guò)擬合线定,即 $J_{train}(\theta)$ 很小,但 $J_{cv}(\theta)$ 很大确买,這個(gè)就是高偏差的定義斤讥。而當(dāng) lambda 太大時(shí),$J_{train}(\theta)$ 很大湾趾,$J_{cv}(\theta)$ 也很大周偎,此時(shí)會(huì)產(chǎn)生高方差抹剩。
可以把數(shù)據(jù)集的成本作為縱坐標(biāo)撑帖,lambda 作為橫坐標(biāo)蓉坎,把 $J_{train}(\theta)$ 和 $J_{cv}(\theta)$ 以及 lambda 畫在一個(gè)二維坐標(biāo)軸上,這樣我們可以明顯地看到 $J_{train}(\theta)$ 和 $J_{cv}(\theta)$ 隨著 lambda 的變化規(guī)則胡嘿,從而編程自動(dòng)找出最合適的 lambda 值蛉艾。
學(xué)習(xí)曲線
我們可以把 $J_{train}(\theta)$ 和 $J_{cv}(\theta)$ 作為縱坐標(biāo),畫出與訓(xùn)練數(shù)據(jù)集 m 的大小的關(guān)系衷敌。
我們可以觀察到當(dāng)高偏差 (High Bias, Under Fitting) 時(shí)勿侯,隨著訓(xùn)練數(shù)據(jù)集的增加,$J_{cv}(\theta)$ 不會(huì)明顯地下降缴罗,且 $J_{train}(\theta)$ 增加很快助琐,且最終$J_{train}(\theta)$ 和 $J_{cv}(\theta)$ 的值非常接近,且兩個(gè)值都比較大面氓。這個(gè)就是過(guò)擬合的表現(xiàn)兵钮。從這個(gè)關(guān)系也可以看出來(lái),當(dāng)發(fā)生高偏差時(shí)舌界,過(guò)多的訓(xùn)練數(shù)據(jù)樣例不會(huì)對(duì)算法性能有較大的改善掘譬。
當(dāng)高方差產(chǎn)生時(shí) (High Variance, Over Fitting),比如我們用 100 階的多項(xiàng)式來(lái)擬合數(shù)據(jù)瞄勾。隨著訓(xùn)練數(shù)據(jù)集 m 的增加擎鸠,$J_{train}(\theta)$ 的增加比較緩慢宴树,且值比較小。而 $J_{train}(\theta)$ 剛開始時(shí)很大靴拱,隨著訓(xùn)練數(shù)據(jù)集 m 的增加,它會(huì)開始緩慢下降猾普,但其值還是比較大袜炕。最終 $J_{train}(\theta)$ 和 $J_{cv}(\theta)$ 的值相差比較大。當(dāng)發(fā)生高方差時(shí)抬闷,更多的訓(xùn)練數(shù)據(jù)樣例會(huì)對(duì)算法性能有較大的改善妇蛀,因?yàn)樽罱K兩條線會(huì)越來(lái)越接近,達(dá)到我們想要的效果**笤成。
當(dāng)需要改進(jìn)學(xué)習(xí)算法時(shí)评架,可以畫出學(xué)習(xí)曲線,以便判斷算法是處在高偏差還是高方差問(wèn)題炕泳。
決定下一步行動(dòng)
回到本周開始的地方纵诞,我們可以總結(jié)那些行動(dòng)可以解決哪些算法問(wèn)題。
- 獲取更多的訓(xùn)練數(shù)據(jù) -> 解決高方差問(wèn)題 (High Variance, Over Fitting)
- 減少輸入的特征數(shù)量培遵,避免出現(xiàn)過(guò)擬合 -> 解決高方差問(wèn)題
- 增加有價(jià)值的特征浙芙,即重新解讀并理解訓(xùn)練數(shù)據(jù) -> 解決高偏差問(wèn)題 (High Bias, Under Fitting)
- 增加多項(xiàng)式特征 -> 解決高偏差問(wèn)題 (High Bias, Under Fitting)
- 減小正則化參數(shù) lambda -> 解決高偏差問(wèn)題 (High Bias, Under Fitting)
- 增大正則化參數(shù) lambda -> 解決高方偏差問(wèn)題 (High Variance, Over Fitting)
神經(jīng)網(wǎng)絡(luò)的過(guò)擬合
針對(duì)神經(jīng)網(wǎng)絡(luò)時(shí)登刺,我們可以設(shè)計(jì)兩套方案。第一套方案是使用小型的神經(jīng)網(wǎng)絡(luò)嗡呼,即只有一個(gè)隱藏層纸俭,隱藏層的神經(jīng)單元個(gè)數(shù)也比較少。第二套是使用大型的神經(jīng)網(wǎng)絡(luò)南窗,可以有多個(gè)隱藏層揍很,每個(gè)隱藏層有多個(gè)神經(jīng)單元。
一般來(lái)講万伤,方案一可能會(huì)導(dǎo)致高偏差窒悔,即欠擬合,但計(jì)算成本很低敌买。而方案二可能會(huì)導(dǎo)致過(guò)擬合简珠,且計(jì)算成本很高。針對(duì)欠擬合的情況虹钮,我們可以通過(guò)調(diào)整正則項(xiàng)參數(shù) lambda 來(lái)解決聋庵。一般來(lái)講,針對(duì)一個(gè)實(shí)際問(wèn)題芜抒,選擇一個(gè)大一點(diǎn)的神經(jīng)網(wǎng)絡(luò)珍策,通過(guò) lambda 糾正過(guò)擬合現(xiàn)象,這樣的神經(jīng)網(wǎng)絡(luò)架構(gòu)會(huì)比小型神經(jīng)網(wǎng)絡(luò)性能要好宅倒。
另外一個(gè)問(wèn)題攘宙,多個(gè)隱藏層好還是一個(gè)隱藏層好呢?針對(duì)不同的實(shí)際問(wèn)題結(jié)論是不一樣的拐迁。一個(gè)通用的方法是在不同隱藏層個(gè)數(shù)的神經(jīng)網(wǎng)絡(luò)里進(jìn)行比較蹭劈,通過(guò)計(jì)算交叉驗(yàn)證數(shù)據(jù)集的成本 $J_{cv}(\theta)$ 來(lái)判斷哪個(gè)網(wǎng)絡(luò)更適合我們的實(shí)際問(wèn)題。