機(jī)器學(xué)習(xí)天降福音!數(shù)據(jù)科學(xué)家、Kaggle大師發(fā)布「ML避坑寶典」
?數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)正變得越來(lái)越流行。
進(jìn)入這個(gè)領(lǐng)域的人數(shù),每天都在增長(zhǎng)。
這意味著,很多數(shù)據(jù)科學(xué)家在構(gòu)建第一個(gè)機(jī)器學(xué)習(xí)模型時(shí),并沒(méi)有豐富的經(jīng)驗(yàn),所以很容易發(fā)生錯(cuò)誤。
以下就是機(jī)器學(xué)習(xí)解決方案中一些最常見(jiàn)的初學(xué)者錯(cuò)誤。
在需要的地方?jīng)]有使用數(shù)據(jù)歸一化
對(duì)初學(xué)者來(lái)說(shuō),把特征放入模型,然后等著它給出預(yù)測(cè),這似乎是一件很容易的事。
但是在某些情況下,得到的結(jié)果可能會(huì)令人失望,因?yàn)槟氵z漏了一個(gè)非常重要的步驟。
某些類型的模型需要讓數(shù)據(jù)歸一化,包括線性回歸、經(jīng)典神經(jīng)網(wǎng)絡(luò)等。這些類型的模型使用特征值乘以訓(xùn)練的權(quán)重。如果特征沒(méi)有被歸一化,可能會(huì)發(fā)生一個(gè)特征的可能值范圍與另一個(gè)特征的可能值范圍非常不同的情況。
假設(shè),一個(gè)特征的值在[0, 0.001]范圍內(nèi),另一個(gè)特征的值在[100000, 200000]范圍內(nèi)。對(duì)于兩個(gè)特征同等重要的模型,第一個(gè)特征的權(quán)重將是第二個(gè)特征的權(quán)重的100'000'000倍。巨大的權(quán)重可能會(huì)給模型帶來(lái)嚴(yán)重的問(wèn)題。例如,存在一些異常值。
此外,估計(jì)各種特征的重要性會(huì)變得非常困難,因?yàn)榇髾?quán)重可能意味著該特征很重要,或者可能僅僅意味著它具有較小的值。
而在歸一化后,所有特征都在相同的值范圍內(nèi),通常是[0, 1]或[-1, 1]。在這種情況下,權(quán)重將處于相似的范圍內(nèi),并且將與每個(gè)特征的真正重要性密切對(duì)應(yīng)。
總體而言,在需要的地方使用數(shù)據(jù)歸一化,將產(chǎn)生更好、更準(zhǔn)確的預(yù)測(cè)結(jié)果。
認(rèn)為特征越多越好
有人可能認(rèn)為加入的特征越多越好,這樣模型就會(huì)自動(dòng)選擇和使用最好的特征。
在實(shí)踐中,并不是這樣的。在大多數(shù)情況下,具有精心設(shè)計(jì)和選擇特征的模型將顯著優(yōu)于具有10倍以上特征的類似模型。
模型的特征越多,過(guò)擬合的風(fēng)險(xiǎn)就越大。即使在完全隨機(jī)的數(shù)據(jù)中,模型也能夠找到一些信號(hào)——有時(shí)更弱,有時(shí)更強(qiáng)。
當(dāng)然,隨機(jī)噪聲中沒(méi)有真正的信號(hào)。但是,如果我們有足夠多的噪聲列,那么該模型就有可能根據(jù)檢測(cè)到的錯(cuò)誤信號(hào)使用其中的一部分。發(fā)生這種情況時(shí),模型預(yù)測(cè)質(zhì)量會(huì)降低,因?yàn)樗鼈儗⒉糠只陔S機(jī)噪聲。
的確存在各種用于特征選擇的技術(shù),它們可以在這種情況下提供幫助。但本文不討論它們。
記住,最重要的是——你應(yīng)該能夠解釋你擁有的每一個(gè)特征,明白為什么這個(gè)特性會(huì)幫助你的模型。
在需要外推法時(shí)使用基于樹(shù)的模型
樹(shù)模型受到歡迎的最主要原因除了它是實(shí)力擔(dān)當(dāng),還有就是因?yàn)樗芎糜谩?/p>
但是,它并不是百試百靈的。在某些情況下,使用基于樹(shù)的模型很可能會(huì)是一個(gè)錯(cuò)誤。
樹(shù)模型沒(méi)有推斷能力。這些模型永遠(yuǎn)不會(huì)給出大于訓(xùn)練數(shù)據(jù)中看到的最大值的預(yù)測(cè)值。他們也永遠(yuǎn)不會(huì)輸出比訓(xùn)練中的最小值更小的預(yù)測(cè)。
但在某些任務(wù)中,外推能力或許占據(jù)主要作用。比如,如果利用該模型預(yù)測(cè)股票價(jià)格,有可能未來(lái)的股票價(jià)格將比以往任何時(shí)候都高。所以在這種情況下,基于樹(shù)的模型將不再適用,因?yàn)樗鼈兊念A(yù)測(cè)結(jié)果將被限制在接近歷史最高價(jià)格的水平。
那這個(gè)問(wèn)題又該怎么解決呢?
其實(shí),條條大路通羅馬!
一種選擇是預(yù)測(cè)變化或差異,而不是直接預(yù)測(cè)值。
另一種解決方案是對(duì)此類任務(wù)使用不同的模型類型,比如能夠外推的線性回歸或神經(jīng)網(wǎng)絡(luò)。
多此一舉的歸一化
大家一定不陌生數(shù)據(jù)歸一化的重要性。但是不同的任務(wù)需要不同的歸一化方式,倘若類型按錯(cuò)了,那便會(huì)得不償失!
基于樹(shù)的模型不需要數(shù)據(jù)歸一化,因?yàn)樘卣髟贾挡粫?huì)用作乘數(shù),并且異常值也不會(huì)影響它們。
神經(jīng)網(wǎng)絡(luò)可能也不需要?dú)w一化——例如,如果網(wǎng)絡(luò)已經(jīng)包含內(nèi)部處理歸一化的層(例如Keras庫(kù)的BatchNormalization)。
在某些情況下,線性回歸可能也不需要數(shù)據(jù)歸一化。這是指所有特征都在相似的值范圍內(nèi),并且具有相同的含義。例如,如果模型應(yīng)用于時(shí)間序列數(shù)據(jù),并且所有特征都是同一參數(shù)的歷史值。
在實(shí)踐中,應(yīng)用不需要的數(shù)據(jù)歸一化不一定會(huì)損害模型。大多數(shù)情況下,這些情況下的結(jié)果將與跳過(guò)的歸一化非常相似。但是,進(jìn)行額外的不必要的數(shù)據(jù)轉(zhuǎn)換會(huì)使解決方案復(fù)雜化,并且會(huì)增加引入一些錯(cuò)誤的風(fēng)險(xiǎn)。
所以,具體是用,還是不用,實(shí)踐出真知!
數(shù)據(jù)泄露
數(shù)據(jù)泄露,要比我們想象得更容易。
請(qǐng)看以下代碼段:
實(shí)際上,「sum_feature」和「diff_feature」這兩個(gè)特征都是不正確的。
它們正在「泄漏」信息,因?yàn)樵诓鸱譃橛?xùn)練/測(cè)試集后,具有訓(xùn)練數(shù)據(jù)的部分將包含測(cè)試行中的一些信息。這雖然會(huì)得到更好的驗(yàn)證結(jié)果,但當(dāng)應(yīng)用于實(shí)際數(shù)據(jù)模型時(shí),就會(huì)性能暴跌。
正確的做法是首先進(jìn)行訓(xùn)練/測(cè)試拆分。然后才應(yīng)用特征生成功能。一般來(lái)說(shuō),分別處理訓(xùn)練集和測(cè)試集是一種很好的特征工程模式。
在某些情況下,必須在兩者之間傳遞一些信息——例如,我們可能希望測(cè)試集使用相同的StandardScaler ,該StandardScaler用于訓(xùn)練集并在其上進(jìn)行了訓(xùn)練。但這只是個(gè)別案例,所以,我們還是需要具體問(wèn)題具體分析!
從錯(cuò)誤中吸取教訓(xùn)是件好事。但最好從別人的錯(cuò)誤中學(xué)習(xí)——希望本文所提供的錯(cuò)誤示例能幫助到你。