如何在Kaggle比賽上擊敗98%的對手?你需要一份七步祕笈

栗子 曉查 整理編譯

量子位 報道 | 公眾號 QbitAI

怎樣才能在Kaggle舉辦的各式各樣的比賽裡,拿到驕人的成績?

如何在Kaggle比賽上擊敗98%的對手?你需要一份七步秘笈


一位叫做Abhay Pawar的少年,在2600多支隊伍參加的Instacart Market Basket Analysis比賽上,擊敗了98%的對手。

這是一個預測用戶未來將購買何種商品的比賽,依據的是過往交易數據。


如何在Kaggle比賽上擊敗98%的對手?你需要一份七步秘笈


少年對參加比賽充滿了心得,說最重要的就是要充分理解特徵

於是,他寫了一套七步秘笈出來,和小夥伴們分享自己探索特徵的經驗。

這份秘笈,封裝在一個名叫featexp的Python包裡,傳送門在文底。

舉慄用的數據集,是來自Kaggle Home Credit Default Risk (違約者預測) 比賽。

現在,瞭解一下具體步驟吧。

支配特徵,七步大法

少年說,仔細觀察一個模型的部分依賴圖 (Partial Dependency Plot,PDP) , 可以幫助大家理解output是如何隨著特徵而變化的。


如何在Kaggle比賽上擊敗98%的對手?你需要一份七步秘笈


問題是,這種圖像是用訓練好的模型做的。而如果直接用訓練數據來做圖,就可以讓大家更好地瞭解underlying data。

1. 理解特徵

如果因變量 (目標) 是二進制,散點圖就不好用,因為所有點不是0就是1。


如何在Kaggle比賽上擊敗98%的對手?你需要一份七步秘笈


針對連續目標,數據點太多的話,會讓人很難理解目標特徵之間的關係。

用featexp可以做出更加友善的圖像。

拿這行代碼試一下吧:

from featexp import get_univariate_plots

# Plots drawn for all features if nothing is passed in feature_list parameter.

get_univariate_plots(data=data_train, target_col='target', features_list=['DAYS_BIRTH'], bins=10)

Featexp可以把一個數字特徵,分成很多個樣本數相等的區間 (Equal Population Bins) 。

然後,計算出目標的平均值 (Mean) ,做出一個這樣的圖像:


如何在Kaggle比賽上擊敗98%的對手?你需要一份七步秘笈


在這裡,平均值代表違約率。圖像告訴我們,年紀 (DAYS_BIRTH) 越大的人,違約率越低。

嗯,如果年輕人不太在意違約,也比較符合常理。

還有另外一個圖像,表示每個區間的人數 (分的時候就是相等的) :


如何在Kaggle比賽上擊敗98%的對手?你需要一份七步秘笈


不過,這個栗子是比較友好的特徵。少年說了,下一個章節才是最有趣的。

2. 識別嘈雜特徵

嘈雜特徵容易造成過擬合,識別這樣的特徵一點也不容易。

在featexp裡面,可以跑一下測試集,然後對比驗證集和測試集的特徵趨勢,來找出嘈雜的特徵。

這是對比用的代碼:

get_univariate_plots(data=data_train, target_col='target', data_test=data_test, features_list=['DAYS_EMPLOYED'])

做出的圖像長這樣:


如何在Kaggle比賽上擊敗98%的對手?你需要一份七步秘笈


為了衡量嘈雜程度,featexp會計算兩個指標

一是趨勢相關性 (Trend Correlation) :如果一個特徵在訓練集和測試集裡面,表現出來的趨勢不一樣,就可能導致過擬合。這是因為,模型從測試集裡學到的一些東西,在驗證集裡不適用。

趨勢相關性可以告訴我們,訓練集和測試集趨勢的相似度,以及每個區間的平均值,以及這些數值要怎麼用。

上面這個特徵,兩個集子的相關性達到99%。

很好,一點也不嘈雜的樣子。

二是趨勢變化 (Trend Changes) :有時候,趨勢會發生突變 (Sudden Changes) 和反覆變化 (Repeated Changes) 。

這可能就是很嘈雜的表現了,但也有可能是那個區間,因為其他特徵的表現非常與眾不同,而受到影響了。

如果出現這種情況,這個區間的違約率就沒辦法和其他區間直接相比了。

下面這個特徵,就是嘈雜特徵,相關性只有85%有時候,可以選擇丟掉這個特徵。


如何在Kaggle比賽上擊敗98%的對手?你需要一份七步秘笈


拋棄相關性低的特徵,這種做法在特徵非常多、特徵之間又很相關的情況下,比較適用。

它可以減少過擬合,避免信息丟失。不過:

注意,別把太多重要的特徵都丟掉了。否則,模型的預測效果可能就有損失了。

注意x2,也不能用重要性來評價特徵是否嘈雜,因為有些特徵就是可以既重要,又嘈雜得不得了。

用 (與訓練集) 不同時間段的數據來做測試集,可能會比較好。這樣,就能看出來數據是不是隨時間變化的了。

請看下面的示範。

Featexp裡有一個 get_trend_stats() 函數,可以返回一個數據框 (Dataframe) ,顯示趨勢相關性趨勢變化。代碼如下:

from featexp import get_trend_stats
stats = get_trend_stats(data=data_train, target_col='target', data_test=data_test)
如何在Kaggle比賽上擊敗98%的對手?你需要一份七步秘笈


現在,可以試著丟棄一些特徵了。不妨參考這些標準來執行:


如何在Kaggle比賽上擊敗98%的對手?你需要一份七步秘笈


AUC=Area Under Curve,曲線下的面積,是評價模型的指標

丟棄特徵的相關性閾值越高,排行榜上的AUC越高。

加上不要丟棄重要特徵這一條規則,AUC提升到了0.74。

有趣的是,測試集的AUC並沒有像排行榜的AUC變化那麼大。

完整代碼可以在featexp_demo記事本里面找到:

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

3. 特徵工程

通過查看這些圖表獲得的見解有助於創建更好的特徵。

只需更好地瞭解數據就可以實現更好的特徵工程。 除此之外,它還可以幫助你改進現有特徵。下面來看另一個功能EXT_SOURCE_1:


如何在Kaggle比賽上擊敗98%的對手?你需要一份七步秘笈


EXT_SOURCE_1的特徵與目標圖

具有較高EXT_SOURCE_1值的客戶違約率較低。 但是,第一個區間(違約率約8%)不遵循這個特徵趨勢(上升然後下降)。 它只有-99.985左右的負值且人群數量較多。這可能意味著這些是特殊值,因此不遵循特徵趨勢。

幸運的是,非線性模型在學習這種關係時不會有問題。 但是,對於像邏輯迴歸這樣的線性模型,這些特殊值和空值應該用來自具有相似違約率的區間的值來估算,而不是簡單地用特徵均值。

4. 特徵重要性

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

5. 特徵調試

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


如何在Kaggle比賽上擊敗98%的對手?你需要一份七步秘笈


1)檢查特徵的人群分佈是否正確。 由於一些小錯誤,作者遇到過多次極端情況。

2)在查看這些圖之前,總是假設特徵趨勢會是什麼樣子。 特徵趨勢看起來不符合預期,可能暗示著某些問題。 坦率地說,這個假設趨勢的過程使ML模型更有趣!

6. 洩漏檢測

從目標到特徵的數據洩漏導致過度擬合。 洩露的特徵具有很高的功能重要性。 但是,要理解為什麼在特徵中會發生洩漏,這很是困難的。 查看featexp圖可以幫助理解這一問題。

以下特徵在“Nulls”區間中的違約率為0%,在其他所有區間中的違約率為100%。 顯然,這是洩漏的極端情況。 只有當客戶違約時,此特徵才有價值。 瞭解洩漏特徵的問題所在能讓你更快地debug。


如何在Kaggle比賽上擊敗98%的對手?你需要一份七步秘笈


7. 模型監控

由於featexp可計算兩個數據集之間的趨勢相關性,因此它可以很容易地用於模型監控。 每次重新訓練模型時,都可以將新的訓練數據與測試好的訓練數據(通常是第一次構建模型時的訓練數據)進行比較。 趨勢相關性可以幫助您監控特徵信息是否與目標的關係發生了變化。

featexp項目

作者Abhay Pawar在文中大篇幅使用了featexp,這是一個用於監督學習的特徵探索項目,本文也是主要針對此工具得使用展開討論。它對前面提到的特徵理解、識別帶噪聲的特徵、特徵除錯、洩露探測和模型監控都有幫助。

它的安裝也很簡單,可以通過pip直接安裝:

pip install featexp

詳細說明可參閱GitHub項目頁:

https://github.com/abhayspawar/featexp

秘笈原文傳送門:

https://towardsdatascience.com/my-secret-sauce-to-be-in-top-2-of-a-kaggle-competition-57cff0677d3c

活動策劃招聘

量子位正在招聘活動策劃,將負責不同領域維度的線上線下相關活動策劃、執行。歡迎聰明靠譜的小夥伴加入,並希望你能有一些活動策劃或運營的相關經驗。相關細節,請在量子位公眾號(QbitAI)對話界面,回覆“招聘”兩個字。

量子位 QbitAI · 頭條號簽約作者

վ'ᴗ' ի 追蹤AI技術和產品新動態


分享到:


相關文章: