天天看點

這些“秘密武器”,讓你輕松跻身Kaggle前2%

Kaggle的比賽真的好玩到令人上瘾。在享受比賽的過程中,如果比賽成績能夠名列前茅那就非常棒了~~~

一位名叫Abhay Pawar的小哥開發了一些特征工程和機器學習模組化的标準方法。這些簡單而強大的技術幫助他在Instacart Market Basket Analysis競賽中取得了前2%的成績。

下文是他以第一人稱為小夥伴們分享他的技術經驗。希望對你有所幫助。enjoy!

要建構數值型連續變量的監督學習模型,最重要的方面之一就是好好了解特征。觀察一個模型的部分依賴圖有助于了解模型的輸出是如何随着每個特征變化而改變的。

這些“秘密武器”,讓你輕松跻身Kaggle前2%

但是,繪制的圖形是基于訓練好的模型建構的,這會引發一些問題。而如果我們直接用未經學習的訓練資料去作圖,我們就能更好了解這些資料的深層含義。因為這樣做能幫助我們進行:

 ●  特征了解

 ●  識别嘈雜特征(這是最有趣的!)

 ●  特征工程

 ●  特征重要性

 ●  特征調試

 ●  洩漏檢測與了解

 ●  模型監控

為了友善大家使用,我把這些方法用Python做了一個包,叫做featexp。本文中,我們會利用它來進行特征探索。我們将使用來自Kaggle競賽“違約者預測”的資料集,競賽的任務是基于已有的資料預測債務違約者。

featexp:

https://github.com/abhayspawar/featexp

Home Credit Default Risk

https://www.kaggle.com/c/home-credit-default-risk/

特征了解

這些“秘密武器”,讓你輕松跻身Kaggle前2%

如果因變量 (分析目标) 是二分類資料,散點圖就不太好用了,因為所有點不是0就是1。針對連續型變量,資料點太多的話,會讓人很難了解目标和特征之間的關系。但是,用featexp可以做出更加友好的圖像。讓我們試一下吧!

這些“秘密武器”,讓你輕松跻身Kaggle前2%

Featexp可以把一個數字特征,分成很多個樣本量相等的區間(X軸)。然後,計算出目标的平均值 (Mean),并繪制出左上方的圖像。在這裡,平均值代表違約率。圖像告訴我們,年紀 (DAYS_BIRTH) 越大的人,違約率越低。

這非常合理的,因為年輕人通常更可能違約。這些圖能夠幫助我們了解客戶的特征,以及這些特征是如何影響模型的。右上方的圖像表示每個區間内的客戶數量。

識别嘈雜特征

嘈雜特征容易造成過拟合,分辨噪音一點也不容易。在featexp裡,你可以跑一下測試集或者驗證集,然後對比訓練集和測試集的特征趨勢,進而找出嘈雜的特征。

這些“秘密武器”,讓你輕松跻身Kaggle前2%

訓練集和測試集特征趨勢的對比

為了衡量噪音影響程度,featexp會計算兩個名額:

 ●  趨勢相關性 (從測試繪圖中可見) :如果一個特征在訓練集和測試集裡面表現出來的趨勢不一樣,就有可能導緻過拟合。這是因為,模型從測試集裡學到的一些東西,在驗證集中不适用。趨勢相關性可以告訴我們訓練集和測試集趨勢的相似度,以及每個區間的平均值。上面這個例子中,兩個資料集的相關性達到了99%。看起來噪音不是很嚴重!

 ●  趨勢變化:有時候,趨勢會發生突然變化和反複變化。這可能就參入噪音了,但也有可能是特定區間内有其他獨特的特征對其産生了影響。如果出現這種情況,這個區間的違約率就沒辦法和其他區間直接對比了。

下面這個特征,就是嘈雜特征,訓練集和測試集沒有相同的趨勢:兩者相關性隻有85%。有時候,可以選擇丢掉這樣的特征。

這些“秘密武器”,讓你輕松跻身Kaggle前2%

嘈雜特征的例子

抛棄相關性低的特征,這種做法在特征非常多、特征之間又充滿相關性的情況下比較适用。這樣可以減少過拟合,避免資訊丢失。不過,别把太多重要的特征都丢掉了;否則模型的預測效果可能會大打折扣。同時,你也不能用重要性來評價特征是否嘈雜,因為有些特征既非常重要,又嘈雜得不得了。

用與訓練集不同時間段的資料來做測試集可能會比較好。這樣就能看出來資料是不是随時間變化的了。

Featexp裡有一個 get_trend_stats() 函數,可以傳回一個資料框 (Dataframe) ,顯示趨勢相關性和趨勢變化。

這些“秘密武器”,讓你輕松跻身Kaggle前2%

get_trend_stats()傳回的資料框

現在,可以試着去丢棄一些趨勢相關性弱的特征了,看看預測效果是否有提高。

這些“秘密武器”,讓你輕松跻身Kaggle前2%

用趨勢相關性進行不同特征選擇得到的的AUC值

我們可以看到,丢棄特征的相關性門檻值越高,排行榜(LB)上的AUC越高。隻要注意不要丢棄重要特征,AUC可以提升到0.74。有趣的是,測試集的AUC并沒有像排行榜的AUC變化那麼大。完整代碼可以在featexp_demo記事本裡面找到。

featexp_demo

https://github.com/abhayspawar/featexp/blob/master/featexp_demo.ipynb

特征工程

通過檢視這些圖表獲得的見解,有助于我們建立更好的特征。隻需更好地了解資料,就可以實作更好的特征工程。除此之外,它還可以幫助你改良現有特征。下面來看另一個特征EXT_SOURCE_1:

這些“秘密武器”,讓你輕松跻身Kaggle前2%

EXT_SOURCE_1的特征與目标圖

具有較高EXT_SOURCE_1值的客戶違約率較低。但是,第一個區間(違約率約8%)不遵循這個特征趨勢(上升并下降)。它隻有-99.985左右的負值且人群數量較多。這可能意味着這些是特殊值,是以不遵循特征趨勢。幸運的是,非線性模型在學習這種關系時不會有問題。但是,對于像Logistic回歸這樣的線性模型,如果需要對特殊值和控制進行插值,就需要考慮特征分布,而不是簡單地使用特征的均值進行插補。

特征重要性

Featexp還可以幫助衡量特征的重要性。DAYS_BIRTH和EXT_SOURCE_1都有很好的趨勢。但是,EXT_SOURCE_1的人群集中在特殊值區間中,這表明它可能不如DAYS_BIRTH那麼重要。基于XGBoost模型來衡量特征重要性,發現DAYS_BIRTH實際上比EXT_SOURCE_1更重要。

特征調試

檢視Featexp的圖表,可以幫助你通過以下兩項操作來發現複雜特征工程代碼中的錯誤:

這些“秘密武器”,讓你輕松跻身Kaggle前2%

零方差特征隻展現一個區間

1、檢查特征的人群分布是否正确。由于一些疏忽,我遇到過多次類似上面這樣的極端情況。

2、在檢視這些圖之前,我總是會先做假設,假設特征趨勢會是什麼樣子的。如果特征趨勢看起來不符合預期,可能暗示着存在某些問題。實際上,這個驗證趨勢假設的過程使機器學習模型更有趣了!

洩漏檢測

從目标到特征的資料洩漏會導緻過拟合。洩露的特征具有很高的特征重要性。要了解為什麼在特征中會發生洩漏是很困難的,檢視featexp圖像可以幫助了解這一問題。

在“Nulls”區間的特征違約率為0%,同時,在其他所有區間中的違約率為100%。顯然,這是洩漏的極端情況。隻有當客戶違約時,此特征才有價值。基于此特征,可能是因為一個故障,或者因為這個特征在違約者中很常見。了解洩漏特征的問題所在能讓你更快地進行調試。

這些“秘密武器”,讓你輕松跻身Kaggle前2%

了解為什麼特征會洩漏

模型監控

由于featexp可計算兩個資料集之間的趨勢相關性,是以它可以很容易地利用于模型監控。每次我們重新訓練模型時,都可以将新的訓練資料與測試好的訓練資料(通常是第一次構模組化型時的訓練資料)進行比較。趨勢相關性可以幫助你監控特征資訊與目标的關系是否發生了變化。

這些簡單的步驟總能幫助我在Kaggle或者實際工作中建構更好的模型。用featexp,花15分鐘去觀察那些圖像,是十分有價值的:它會帶你一步步看清黑箱裡的世界。

原文釋出時間為:2018-11-28

本文來自雲栖社群合作夥伴“

大資料文摘

”,了解相關資訊可以關注“

”。

繼續閱讀