問(wèn)題:當(dāng)我們訓(xùn)練出數(shù)據(jù)后,發(fā)現(xiàn)模型有太大誤差,怎么辦?
既然選了ML這個(gè)方向,畢業(yè)入職后的工作也無(wú)外乎模型訓(xùn)練和調(diào)優(yōu),大多數(shù)的時(shí)間將會(huì)用來(lái)解決上面的問(wèn)題。于是,寫(xiě)下這篇文章,作為以后解決問(wèn)題的參考手冊(cè),也算是為正式工作做一點(diǎn)點(diǎn)準(zhǔn)備。
1)鑒別是過(guò)擬合還是欠擬合的問(wèn)題
當(dāng)發(fā)現(xiàn)訓(xùn)練出來(lái)的模型誤差太大的時(shí)候,首先考慮的就應(yīng)該是是否存在過(guò)擬合或者欠擬合的問(wèn)題。但是,如何對(duì)二者進(jìn)行有效鑒別呢?最簡(jiǎn)單的方法就是分別計(jì)算crossvalidationerror(Jcv) 跟trainingerror(Jtrain):當(dāng)Jcv跟Jtrain差不多且Jtrain較大時(shí),當(dāng)前模型更可能存在欠擬合;當(dāng)Jcv遠(yuǎn)遠(yuǎn)大于Jtrain且Jtrain較小時(shí),當(dāng)前模型更可能存在過(guò)擬合。
我們將整個(gè)數(shù)據(jù)集按照一定比例分為訓(xùn)練集和交叉驗(yàn)證集,假設(shè)訓(xùn)練集量為m,交叉驗(yàn)證集量為mcv。首先,我們利用m條訓(xùn)練集訓(xùn)練模型參數(shù),并得到Jtrain;然后,將訓(xùn)練出的模型應(yīng)用于交叉驗(yàn)證集,得到Jcv。這里附上Jcv和Jtrain的計(jì)算方法:
a)Jtrain的計(jì)算方法:
當(dāng)然,我們可以對(duì)數(shù)據(jù)集進(jìn)行多次劃分,看看Jcv和Jtrain是否在統(tǒng)計(jì)上滿足同一大小規(guī)律,確認(rèn)我們的判斷結(jié)果。
值得提醒的是,很多時(shí)候,我們?cè)诎l(fā)現(xiàn)模型結(jié)果不理想時(shí),并沒(méi)有靜下心來(lái)認(rèn)真思考究竟是過(guò)擬合還是欠擬合,而是胡亂試用各種方法,缺乏針對(duì)性,導(dǎo)致調(diào)優(yōu)過(guò)程花費(fèi)了大量的時(shí)間。另外,在判斷過(guò)擬合和欠擬合上有很多其它看似更完美、更理論的方式,但是我覺(jué)得沒(méi)有太大的必要,簡(jiǎn)單地計(jì)算Jcv和Jtrain通常已經(jīng)能準(zhǔn)確定位問(wèn)題了,性價(jià)比顯然最高。
2)如果存在欠擬合,怎么辦?
我相信,大多數(shù)時(shí)候,一開(kāi)始,我們的算法會(huì)是欠擬合的。所以,如果你發(fā)現(xiàn)你的算法欠擬合后,恭喜你,你的調(diào)優(yōu)工作才剛剛開(kāi)始,也就是說(shuō),你的模型還差得遠(yuǎn)呢。正是因?yàn)槿绱?,每次我的模型出現(xiàn)過(guò)擬合后,我都會(huì)開(kāi)心一陣子,說(shuō)明問(wèn)題不大了。
解決欠擬合問(wèn)題有以下幾種方法。
a)添加其他特征
一直以來(lái)覺(jué)有有句話說(shuō)得很有道理:“在機(jī)器學(xué)習(xí)里,特征決定了準(zhǔn)確率的上限,而算法決定了結(jié)果趨近于上限的程度”。這句話也可以翻譯成:“巧婦難為無(wú)米之炊”。特征是米,每個(gè)不同的機(jī)器學(xué)習(xí)算法就是做飯的巧婦。很多人在公司(特別是大公司)待一段時(shí)間后,不免都會(huì)有一點(diǎn)點(diǎn)失望。因?yàn)樗麄儼l(fā)現(xiàn),公司里的很多“機(jī)器學(xué)習(xí)/數(shù)據(jù)挖掘工程師”或者“算法工程師”每天的工作,不過(guò)都是在不停地發(fā)現(xiàn)和調(diào)研新的特征來(lái)添加進(jìn)原有的算法框架里,以提升算法的準(zhǔn)確率,而不是發(fā)明一些更牛逼、高大上的算法來(lái)替換掉原有的算法框架。當(dāng)然,研究高大上的算法的人有,但并不是那么多。我這里只是想說(shuō)明特征很重要,而且,調(diào)研新的更有效的特征是機(jī)器學(xué)習(xí)里永無(wú)止境的有效工作。
不同的應(yīng)用環(huán)境有不同的特征,下面是做搜索排序可能用到的一些特征類別,并不全,只是舉個(gè)例子提供思路參考。
在這里,特別說(shuō)明一下,“組合”、“泛化”、“相關(guān)性”三類特征是特征添加的重要手段,無(wú)論在什么場(chǎng)景,都可以照葫蘆畫(huà)瓢,總會(huì)得到意想不到的效果。除上面的特征之外,“上下文特征”、“平臺(tái)特征”等等,都可以作為特征添加的首選項(xiàng)。
b)添加多項(xiàng)式特征
這句話的意思其實(shí)就是提高模型的復(fù)雜度,增加模型的表達(dá)空間。例如,將原來(lái)的線性模型,通過(guò)特征添加,變?yōu)槎位蛉文P?。?dāng)然,這里并不需要改變本身的訓(xùn)練算法,只需要在原有的特征空間里添加相應(yīng)的高次項(xiàng)特征即可。例如,原來(lái)有個(gè)特征x,可以將x^2或者x^3作為一個(gè)新的特征放到原來(lái)的線性系統(tǒng)里進(jìn)行訓(xùn)練。
c)減小正則化參數(shù)
正則化的目的就是防止模型過(guò)擬合,現(xiàn)在模型出現(xiàn)了欠擬合,當(dāng)然可以通過(guò)減小正則化參數(shù)的方法來(lái)避免欠擬合,不需要多解釋。
3)如果存在過(guò)擬合,怎么辦?
學(xué)術(shù)界關(guān)于過(guò)擬合的研究很多,這是因?yàn)檫@個(gè)主題會(huì)更理論一些,看起來(lái)更有技術(shù)含量一些。
解決過(guò)擬合問(wèn)題有一下幾種方法:
a)訓(xùn)練集選用更多樣本
雖然我不同意“對(duì)于機(jī)器學(xué)習(xí),樣本數(shù)量越大訓(xùn)練出來(lái)的分類器正確率越高”這句話,但是如果樣本量不足是肯定會(huì)有問(wèn)題的。舉個(gè)極端的例子,如果我們只有三個(gè)訓(xùn)練樣本,很容易得到一個(gè)訓(xùn)練誤差為0的模型,但是實(shí)際誤差卻很大,也就是過(guò)擬合問(wèn)題。所以,選擇更多的樣本有可能在一定程度上解決過(guò)擬合的問(wèn)題。但是,這種方法不一定每次都會(huì)奏效。首先,更多的樣本并不一定那么容易得到,很多時(shí)候樣本的獲得是需要很大成本的;其次,即使能夠得到,也得考慮時(shí)間、空間復(fù)雜度的問(wèn)題,我們的算法平臺(tái)是否允許這么大的樣本量;最后,即使前面兩個(gè)條件都允許,也不一定增加訓(xùn)練樣本就能提高模型準(zhǔn)確率,這也是為什么一開(kāi)始我說(shuō)我不同意“對(duì)于機(jī)器學(xué)習(xí),樣本數(shù)量越大訓(xùn)練出來(lái)的分類器正確率越高”這句話的原因。一開(kāi)始,隨著樣本量的增加,模型準(zhǔn)確率肯定會(huì)相應(yīng)增加,但是,當(dāng)樣本量達(dá)到一定程度(飽和)后,樣本量的增加是沒(méi)有意義的,這個(gè)時(shí)候就需要用其他方法實(shí)現(xiàn)準(zhǔn)確率的提升。
b)采用更小的特征集
不僅特征的次數(shù)彰顯了模型的復(fù)雜度,特征集的維數(shù)也一樣彰顯了模型的復(fù)雜度。所以,采用更小的特征集,可以解決過(guò)擬合的問(wèn)題。一般,減小特征集的方法有:特征選擇和特征抽取。二者的區(qū)別是:特征選擇是指在原有的特征中選擇一部分特征來(lái)用,拋棄不重要的特征,新的特征集是原特征集的子集。詳細(xì)的特征選擇方法介紹可以參考這里:http://www.cnblogs.com/heaad/archive/2011/01/02/1924088.html;特征抽取是指通過(guò)原有的高維特征構(gòu)建新的特征,新的特征維度遠(yuǎn)遠(yuǎn)低于原有特征的維度,新的每一維特征都是原有所有特征的加權(quán)組合。最常見(jiàn)的特征抽取方法有主成分分析(PCA)和因子分析。
c)增大正則化參數(shù)
正則化的目的就是防止模型過(guò)擬合,這里不解釋。
d)減小模型復(fù)雜度,降低模型階次(不推薦)
前往“CSDN知識(shí)庫(kù)”獲取【機(jī)器學(xué)習(xí)】圖譜和更多優(yōu)質(zhì)內(nèi)容
聯(lián)系客服