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