經驗&教訓分享:我的第一個機器學習項目

thu數據派 發佈 2020-01-03T07:51:19+00:00

機器學習之旅的開端在這片博客中,我將介紹隊友和我如何完成我們的第一個機器學習項目。我的最終目標是當某一天再次回顧這個數據集時,可以應用更好的預測模型,看到自己原本可以做出哪些改進,並且能看到自己作為一個數據科學家的成長。

作者:Austin Cheng

翻譯:王紫岳

校對:和中華

本文約4700字,建議閱讀13分鐘

本文簡要介紹了作者在初次進行機器學習的操作時所遇到到情況與得到的教訓。

機器學習之旅的開端

在這片博客中,我將介紹隊友(Aron,Ashish,Gabriel)和我如何完成我們的第一個機器學習項目。寫這篇博客的目的是為了記錄——記錄下我作為一名有抱負的數據科學家的旅程。同時,這篇博客也是為了寫下逐步完善預測模型背後的思維和推理過程。由於我的目的是建立一個可以快速使用的通用工作流程,所以我將儘可能的簡化推理過程。我的最終目標是當某一天再次回顧這個數據集時,可以應用更好的預測模型,看到自己原本可以做出哪些改進,並且能看到自己作為一個數據科學家的成長。

數據集

該數據集取自kaggle.com。它包含了79個描述房屋特徵的維度,而且描述了愛荷華州埃姆斯幾乎所有的房屋。該數據集旨在為有志向的機器學習從業者提供一個玩具示例。在處理這個數據集時我們得到的主要教訓是:簡單的線性模型也可以十分強大,並且在適當的場景中,它們的表現可以輕鬆地勝過高度複雜的模型。在接下來的文章中,我將描述我們處理這個數據集所遵循的工作流程,並證實線性模型應該始終在你的工具箱中占有一席之地。

數據預處理的工作流程

數據預處理和轉換

我們遵循了得到的第一個建議:將目標變量(售價)轉化為一個服從正態分布並去除了異常值的變量。前者很重要,因為它確保目標變量的殘差將服從正態分布(線性推理模型的基本假設),而後者可以確保我們的模型結果不會因為異常的觀測值,特別是那些有很大影響和槓桿效應的值,而產生偏斜(或成為錯誤的偏差)。下面將舉例說明對數轉換(log transformation,我們的手動box-cox轉換):

在上方的圖片中,顯示了高度傾斜且未經處理的數據。在下方的圖片中,我們展示了經過對數轉換後的數據。將兩者進行比較,我們可以看到數據在分布上的巨大改進。

在這裡我們沒有對各個特徵進行轉換,來使其變成正態分布。雖然,機器學習模型可能會因使用了正態分布的特徵而受益,但這將損害結果模型的可解釋性。出於這個原因,我們選擇不去應用它,而是繼續使用去除異常值的方法。下面,我們展示了刪除某個變量的異常值後的效果:

左邊是未處理的數據,右邊是處理過的數據。去除異常值的效果是明顯的,因為我們可以看到擬合線發生了明顯的偏移。

缺失值與插補

在第二步中,我們花了大量的時間去查找缺失值。而插補卻是十分棘手的,因為它需要我們對每一個特徵都有深刻的理解。不論是使用均值、中位數、眾數、零、空,還是簡單地刪除觀測值或特徵本身,都取決於我們認為可以接受的某種預定準則。這種預定準則很多時候靠直覺。下面,我們對缺失值進行定性總結。

頂部顯示的是每個特徵的缺失值的數量,底部顯示的是缺失之間的相關性。

這裡我沒有深入的探討處理每個變量缺失值的具體過程(讀者可以參考我們在Github上發布的代碼來獲得具體的解決辦法),而是簡單地回顧了一下總體思路。首先,在原則上,任何缺失值超過95%以上的變量都可以被安全地丟棄,但在做之前還是要謹慎一些,因為這些缺失不一定是真實的缺失。從變量缺失值的相關性中提取信息,我們也許可以推斷出這些缺失值的含義。例如,與車庫緊密相關的缺失值表明了一個房屋沒有車庫的可能性。另一個基本完全缺失的變量是泳池面積。因此,我們認為缺少泳池面積信息的房屋數據意味著這些房子沒有泳池。

在這裡,我們給出如何在嚴重缺失的情況下處理變量(一般來說,我們選擇保守的方式,即儘可能保留我們可以保留的任何信息)。對於缺失率相對較低的變量(比如缺失值少於5%的觀測數據),如果變量是連續的(或有序的),我們選擇使用均值進行插補;如果變量是類別型的,我們則會使用眾數。平均估算法背後的原理是,插補的數據不會改變擬合的斜率,因此不會對模型結果產生偏差。至於眾數和中位數(分別在類別變量或數值變量中使用),除了認為這些觀測值歸屬為最具代表性的組之外,沒有更好的解釋。雖然這種方式可能會有缺陷,但有時便捷性會比精確性更為重要,特別是當缺失值數量很少的時候(這些特徵的缺失值數量在數十個的時候)。為了使缺失值插補的過程更加精確,我會選擇基於k近鄰或者其他機器學習模型進行插補。另一種被廣泛接受的插補方法是用一個非常邊緣的數,例如-999(如果所有的觀測值都是正實數)。然而,這種插補方法不適用於擬合解析方程的推理模型。因此本例中沒有使用-999。

第一輪特徵選擇

我們經常會聽到維度詛咒。高維度可能意味著會產生共線變量,而它則會導致擬合係數不準確以及高方差。高維度可能意味著稀疏的數據,也可能意味著特徵數量過多從而導致過擬合。這兩種情況都不好,因為它們會產生性能較差的模型。

相關性研究:消除多重共線性

特徵選擇的第一次嘗試是為了減少系統內部的多重共線性。方法是執行相關性研究,同時對特徵進行合併或刪除。下面是多重共線性處理前後的相關圖:

左側是原始數據的相關圖。右側是處理後數據的相關圖,其中的特徵要麼被刪除,要麼被合併。

通過對比可以看到,這種相關性(用深藍色表示)大大降低了。這是通過去除或組合特徵實現的。幫助我們做出正確決定的指標是基於對特徵的R平方持續評估:

在左邊的圖中,與居住面積相關的變量(最後五分之一到最後三分之一)的R平方都大於0.8(大致等於VIF的5)。在右邊的圖中,適當組合特徵後,與居住面積相關的R平方值降低了。

聚類子類別

類別型變量的子類別可以聚類在一起。下面我們來看一個例子:

在這個圖中,我們可以看到,所有的不規則子類別(IR1到IR3)的均值都非常接近,但離規則的(Reg)很遠。這是一個提示,在簡化降低維度後,我們應該把所有的IR聚在一起。

在這個特殊的例子中,我們可以看到,如果我們將所有的不規則類別(IR1到IR3)分組到一個大的子類別中則可能對我們的模型產生有益的影響。之所以說是有益的,是因為在對變量進行啞變量處理之後,與未聚類子類別時相比,特徵空間會相對較小。聚類的過程不是人工完成的,而是使用K-means聚類完成的(儘管它是一種非監督的方法),根據與目標變量相關的變量對子類別進行聚類(在這個數據集中,我們使用變量Gr living area)。

特徵工程注意事項:應當使用哪種算術運算?

特徵工程可以通過交互來完成,而這種交互可以反映為任意兩個或多個特徵的某種算術運算。例如,乘法和加法可能在最終的模型結果中產生巨大的差異。我們總結出了一個很好的結論:每一個值必須始終服從變量的自然物理單位。例如,如果要合併車庫數量和車庫面積,應該通過乘法而不是加法來合併。在這種情況下,加法是沒有物理意義的。事實上,對這兩種操作的測試結果表明:對兩個變量的乘法會導致VIF的顯著下降,而加法則不會。

另一個值得描述的變量是每個社區的表現。

不同的社區擁有不同的銷售價格。每一個都值得擁有屬於它自己的模型。

通過觀察社區圖,我們可以看到每個社區的表現都是有區別的,並且每一個都遵循一個明確定義的行為。這些社區都有自己的模式。為了實現這一目標,我們創建了一個類似開關的交互參數,方法是將啞變量處理過的社區類別乘以Gr living area。這樣,每個社區都可以有自己的一組係數——自己的方程,而不是簡單的截距偏移 (類別型變量對廣義線性模型的作用)。使用這個特徵處理使我們的Kaggle排名下降了。

數據流水線

我們的流水線總結如下:


數據集被分割成一個訓練集和一個測試集,之後訓練集被發送到五個模型中:三個線性模型(Lasso, 嶺回歸 彈性網絡)和兩個非線性模型(隨機森林,梯度提升)。並對每個模型進行了廣泛的網格搜索從而選出最佳超參數。在超參數最優的情況下,利用模型對測試集進行預測,並對測試結果進行比較。下面是初始特徵工程的總結:

除了上面所顯示的特徵工程,我們還嘗試了許多類型的特徵工程和篩選(從數據集A開始直到數據集C,這些特徵工程被依次實現)。雖然我們自己得到的MSE測試分數並不總是與Kaggle排名一致,但所有這些都產生了一個更糟糕的Kaggle排名。下面我們展示了使用數據集A到D的結果:

在圖中我們可以看到,彈性網絡模型相比於其他的模型有微小的優勢。所有的線性模型都優於非線性的樹模型。這很好的驗證了我們一開始提到的內容:線性模型總有它的一席之地。在這個特定的數據集中,目標變量與其他特徵主要體現了線性關係,這使得我們有充分的理由使用線性模型而不是非線性模型。綜上所述,即使我們使用線性模型(較為簡單的模型),我們的Kaggle和MSE分數肯定還將得到提高。我們之所以這麼說的原因來自下面的圖:

左邊是測試和訓練數據集MSE,右邊是隨機森林的數據集MSE。兩者都顯示出過擬合的跡象。

上圖顯示,測試和訓練數據集MSE分數之間存在巨大的差異。對於樹模型來說,這可能是有意義的,因為樹模型往往會過擬合(當然,使用隨機森林的目的正是為了避免這個問題);然而,懲罰線性模型 應該可以緩解這個問題……但事實並非如此。這意味著我們的確可以改進我們的特徵篩選與處理。然而,我們嘗試了大量的特徵篩選操作,同時也考慮了如下圖所示的基於特徵重要性的排名,但是它們都給了我們負面的反饋。

這個圖是Lasso(左)和隨機森林(右)的特徵重要性。要注意的是,這兩個模型的特徵重要性是不同的。隨機森林模型比Lasso模型更強調連續變量的重要性,因為高基數會導致更大的誤差或熵降。我們通過測試,比較了標籤編碼和one-hot編碼,發現他們產生類似的結果(標籤編碼有輕微的優勢),這就是標籤編碼比one-hot編碼重要的原因。

鑒於特徵特徵的無用性,我們選擇通過遞歸去除特徵來蠻力改進我們的模型。這個想法如下圖所示:

左邊的示意圖顯示了我們遞歸地刪除特徵的過程。右側顯示了特徵被逐漸刪除時的MSE變化。突然的跳轉很可能是由於一個重要的特徵被刪除了。

特徵的最佳數量由測試誤差突然跳躍的位置來表示。通過這種遞歸的方法,我們可以進一步提高我們的MSE分數:

我們可以看到,使用機器來遞歸地刪除特徵是著實有效的。在遞歸地去除特徵後,誤差得分顯著下降。

最後,我們選擇通過集成所有不同的模型,來把所有的東西放在一起。我們是這樣做的:

這張圖展示了我們使用的集成技術,它很顯然被稱為堆疊。

集成技術只是不同模型預測值的線性組合。不同模型的權值是從最小化測試集錯誤分數的權值集中選取的。在將最終結果提交給Kaggle之後,我們的最終分數是0.1214。

嘗試新事物和我的結論

作為我們的第一個機器學習項目,我們學到了很多。第一點,也是很重要的一點,我們親眼看到了線性模型的力量。這是我們預料到的事實。第二點也是更深刻的教訓是,我們看到了人類直覺的局限性。長時間的無用的特徵工程對我們來說也是一個值得紀念的教訓。在這些機器學習的問題中,我們應該始終在人類直覺和依賴機器之間取得平衡。我們花費了太多的時間熱衷於研究數據集,嘗試找出哪些數據在統計上是重要的或是不重要的,並且在刪除特徵時又過於猶豫。如果我們果斷的處理這些操作,那麼他們是很有益的。但問題是,這些EDA和統計測試的結論從來不是非黑即白的——他們很少產生有可操作性的反饋。我們應該做的是,在跟隨機啞變量比較重要性時,更快速地研究線性和非線性模型給出的特徵重要性。與此同時,我們應該花更多的時間來研究如何執行相關特徵子集的PCA。儘管我們在人工特徵處理方面做了很多努力,但最終我們仍然遭受了多重共線性的困擾。我們需要更明智地使用機器學習技術。因此,我們從中得到的教訓是顯而易見的。當然,我們下次會做的更好。

原文標題:

My First Machine Learning Project

原文連結:

https://nycdatascience.com/blog/student-works/my-first-machine-learning-project-a-somewhat-generalized-workflow-with-after-thoughts/

編輯:於騰凱

校對:林亦霖

譯者簡介

王紫岳,雪梨大學Data Science在讀研究生,在數據科學界努力奮鬥的求知者。喜歡有挑戰性的工作與生活,喜歡與朋友們熱切交談,喜歡在獨處的時候讀書品茶。張弛有度,才能夠以最飽滿的熱情迎接有點忙碌的生活。

— 完 —

關注清華-青島數據科學研究院官方微信公眾平台「THU數據派」及姊妹號「數據派THU」獲取更多講座福利及優質內容。

關鍵字: