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