本文爲 AI 研習社編譯的技術博客,原標題 : My secret sauce to be in top 2% of a kaggle competition 作者 | Abhay Pawar 翻譯 | 就2 校對 | 醬番梨 整理 | 志豪 原文鏈接: https://towardsdatascience.com/my-secret-sauce-to-be-in-top-2-of-a-kaggle-competition-57cff0677d3c
參加kaggle競賽確實是一件非常有趣而且令人上癮的事情。
前幾年,我找到了一些標準的流程來探索特徵進而建立起更好的機器學習模型。這些簡單但是強大的技術幫我在 Instacart 網站購物車分析競賽中排進前2%,而且在其他地方,這這些方法也非常有用。所以,讓我們開始吧!
在一堆數據上,最重要的是,你要很好的理解這些特徵。通過查看模型的特徵依賴圖可以幫助你理解模型的輸出--隨着特徵的變化。
但是,上面這些圖存在的問題是:他們是採用訓練過的模型創建的。
如果我們可以直接從訓練數據上直接創建,那就可以幫助我們更好的理解基礎數據。實際,它可以幫你完成下面的事情:
- 特徵的理解
- 識別噪聲特徵(最有趣的部分!)
- 特徵工程
- 重要特徵選擇
- 特徵的調試
- 遺漏檢測和理解
- 模型監控
爲了便於於訪問,我決定將這些技術放到python 包 featexp 中,在本文中,我們將瞭解如何將這些技術用於特徵探索。我們將在Kaggle上使用來自 Home Credit Default Risk 房屋信用違約風險競賽的應用程序數據集。競賽的目標是利用提供給他們的數據來預測違約者。
1、特徵的理解
特徵與目標的散點圖並沒有幫助
如果因變量(目標)是二元的,散點圖就不起作用,因爲所有點都在0或1處。對於連續目標,太多的數據點使得很難理解目標和特徵趨勢。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)
DAYS_BIRTH (age)的特徵與目標圖
右側 Featexp 創建了相同人數的柱狀圖 (x軸)。然後,它計算每個柱子中的目標均值,並將其繪製在上面左邊的圖中。在我們的例子中,Y座標 target是平均的違約率。
這個圖告訴我們,DAYS_BIRTH(較高年齡)的負值較高的客戶違約率較低。這是有道理的,因爲年輕人通常更容易違約。這些圖幫助我們理解這個特徵告訴了客戶什麼,以及它將如何影響模型。右邊的圖顯示了每個柱子裏顧客的數量。
2、識別噪聲特徵
噪聲特徵會導致過度擬合和識別它們並不容易。在featexp中,您可以通過測試集(或驗證集),並比較訓練/測試中的特徵趨勢,以識別噪聲趨勢。
get_univariate_plots(data=data_train, target_col='target', data_test=data_test, features_list=['DAYS_EMPLOYED'])
訓練集與試驗集特徵趨勢的比較
Featexp計算了在這些圖上顯示的兩個指標,這些圖有助於測量噪聲:
- 趨勢相關(見測試圖): 如果一個特性在訓練集和評估集上不具有相同的趨勢w.r.t.目標,它會導致過度擬合。這是因爲模型正在學習一些在測試數據中不適用的東西。趨勢相關性有助於理解 訓練集 / 訓練集 趨勢的相似性,並用於計算訓練集和測試集的平均目標值。上述特徵具有99%的相關性。似乎不是噪聲!
- 趨勢變化: 趨勢方向的突然重複變化可能意味着噪聲。但是,這種趨勢變化也可能發生,因爲該柱子表示的人羣在其他特性方面具有非常不同的特徵,因此,它默認的違約率無法和其他人羣相比。
下面的特徵不具有相同的趨勢,因此具有低的趨勢相關性85%。這兩個指標可以用來去掉噪聲特徵。
噪聲特徵示例
當有很多特徵並且它們彼此相關時,降低-低趨勢相關特徵效果很好。它可以減少過擬合和其他相關特性,避免信息丟失。不要刪除太多重要的特性也很重要,因爲這可能導致性能下降。另外,您不能使用特性重要性來識別這些有噪聲的特性,因爲它們可能相當重要,但仍然非常有噪聲!
使用來自不同時間段的測試數據會更有效,因爲這樣您就可以確定特性趨勢是否會隨着時間的推移而保持不變。
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)
get_trend_stats() 返回Dataframe
讓我們嘗試在數據中刪除趨勢相關性較低的特徵,看看結果如何改進。
使用趨勢相關不同特徵選擇下的AUC
我們可以看到,特徵趨勢相關閾值越高,特徵下降,排行榜上(LB) AUC越高。不刪除重要的特性進一步將 AUC提高到0.74。有趣的是,測試AUC的變化沒有 排行 AUC大。完整的代碼可以在 featexp_demo 筆記本中找到。
3.特徵工程
通過查看這些圖,有助於創建更好的特徵。僅僅是對數據有更好的理解就可以產生更好的特徵工程。但是,除此之外,它還可以幫助您改進現有的特徵。讓我們看看EXT_SOURCE_1的另一個特徵:
特徵 與 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的圖可以通過以下兩種方式幫助您捕獲複雜特徵工程代碼中的bug:
零變異特徵只顯示一個柱子
- 1、檢查特徵的總體分佈是否正確。我個人曾多次遇到過類似於上述的極端情況,都是由於小的bug引起的。
- 2、在查看這些圖之前,總是假設特徵趨勢是什麼樣子。特徵趨勢看起來不像您預期的那樣,可能會提示一些問題。坦率地說,這種假設趨勢的過程使得構建ML模型更加有趣!
6、遺漏特徵檢測
從目標到特徵的數據遺漏將導致過擬合。 遺漏的特徵一般具有很高的重要性。但是,理解爲什麼在一個特徵中發生泄漏是困難的。查看特徵圖可以幫助您實現這一點。 下面的特徵在' null ' 柱子中有0%的默認值,在所有其他的柱子中有100%的默認值。顯然,這是遺漏的極端情況。這個特徵只有在客戶默認時纔有值。那麼這個特徵是什麼,這可能是由於一個bug,或者該特徵實際上只是爲默認用戶填充的(在這種情況下,它應該被刪除)。瞭解遺漏特徵的問題將導致更快的調試。
理解爲什麼一個特徵是應該要去掉的
7、模型的監控
由於featexp計算兩個數據集之間的趨勢相關性,因此它很容易用於模型監控。每次重新訓練模型時,新的訓練數據可以與經過良好測試的訓練數據進行比較(通常是首次構建模型時的訓練數據)。趨勢相關可以幫助您監控特徵w.r.t.是否有任何變化,它與目標的關係。
· · ·
做這些簡單的事情總是幫助我在現實生活和kaggle比賽上建立更好的模型。使用featexp需要15分鐘來查看這些說明文檔,這絕對是值得的,因爲在那之後你就不會找不到方向了。 對於探索特徵,您還發現了什麼其他有用的技巧和提示?我一直在尋找反饋。在評論中讓我知道,或者通過[email protected]聯繫我。感謝您的閱讀!