中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

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

2020-04-28    來源:raincent

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

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

機器學習之旅的開端

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

數據集

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

數據預處理的工作流程

數據預處理和轉換

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

 

 

 

 

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

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

 

 

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

缺失值與插補

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

 

 

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

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

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

第一輪特征選擇

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

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

特征選擇的第一次嘗試是為了減少系統(tǒng)內部的多重共線性。方法是執(zhí)行相關性研究,同時對特征進行合并或刪除。下面是多重共線性處理前后的相關圖:

 

 

左側是原始數據的相關圖。右側是處理后數據的相關圖,其中的特征要么被刪除,要么被合并。

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

 

 

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

聚類子類別

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

 

 

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

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

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

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

另一個值得描述的變量是每個社區(qū)的表現(xiàn)。

 

 

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

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

數據流水線

我們的流水線總結如下:

 

 

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

 

 

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

 

 

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

 

 

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

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

 

 

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

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

 

 

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

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

 

 

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

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

 

 

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

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

嘗試新事物和我的結論

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

原文標題:

My First Machine Learning Project

原文鏈接:

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

標簽: 機器學習項

版權申明:本站文章部分自網絡,如有侵權,請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:AI領域薪酬統(tǒng)計:機器學習平均近3萬,數據相關崗位增速放緩

下一篇:一位數據科學家的獨白