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