如何開始在Kaggle上展開競爭?

點擊上方關注,All in AI中國
如何開始在Kaggle上展開競爭?

您可能剛剛完成了第一次機器學習課程,但您不確定從何處開始應用您新發現的知識。你可以通過玩Iris數據集或梳理泰坦尼克號記錄來開始(這可能是你應該做的第一件事)。但是有什麼比直接跳入互聯網上與隨機陌生人競爭更有趣的呢?

如果您正在閱讀本文,您可能已經知道Kaggle是一個數據科學競賽平臺,在這個平臺上發燒友會參與各種機器學習主題,使用結構化(數值和/或分類數據表格格式)和非結構化數據(例如文本) / 圖像 / 音頻),旨在獲得獎金和令人垂涎的Kaggle金牌。雖然您可能會發現與其他人競爭的想法有時候會讓人害怕,但重要的是要記住,目標始終是儘可能多地學習而不是專注於結果。通過這種思維方式,你會發現比賽變得有趣、有價值,甚至讓人上癮。

選擇比賽的第一步

找一個你感興趣的競爭對手

在開始新的比賽時,這是最重要的一個考慮因素。你想給自己大約兩個月的時間來解決一個問題,並真正熟悉數據的來龍去脈。這是一段相當長的時間,選擇一個你不興趣的比賽將讓你的興趣急劇下降。在時間軸的早期加入也讓你有更多的時間來獲得知識,並提高你的學習質量。在與社區其他人一起解決問題的各個階段學習。

專注於學習

如果你在競爭中受到挫敗,覺得這太困難了,那麼就要儘可能地集中精力學習並繼續前進。通過這種方法,您將以這種方式學到更多東西。當你不再擔心自己在排行榜上的位置時,你甚至可能會發現自己取得了突破!

嘗試瞭解最高得分內核的每一行

問問自己是否有一些明顯的方法可以改善他們的工作。例如,您是否可以創建一個可以提高模型得分的新功能?你能稍微調整一下他們用於提高性能的學習率嗎?追求容易實現的目標,不要試圖重新發明輪子。這種心態將極大地加速您的學習,同時確保您不會感到沮喪。

尋找規則中的奇怪規定

這個並不像其他因素那麼重要,但值得一提。最近的競賽包含一條規則如下:

[您提交的內容]不包含機密信息或商業機密,也不是註冊專利或未決專利申請的主題

論壇中的一位用戶表示,這項規定將使dropout非法,因為這是谷歌專利技術!

內核和討論

應在比賽過程中定期檢查內核和討論選項卡

首先查看一些EDA並測量您在域和主題中的興趣水平。想想在您根據數據、特徵工程等的合適模型類型瀏覽其他作品時,任何出現的新穎的想法都會對您有所幫助。

討論選項卡中的“歡迎”帖子提供了一個很好的背景閱讀

在競爭領域獲取領域知識是沒有壞處的。這有助於深入瞭解模型的性能,並可以極大地幫助進行特徵工程。我通常會在比賽開始時花一到兩週時間儘可能地瞭解問題空間。為了解決這個問題,大多數競賽組織者在論壇中創建了一個登錄帖子,其中包含鏈接到該領域的重要論文/文章。他們還可能提供有關如何處理更大數據集的提示以及對數據的基本見解。當您獲得有關手頭問題的更多信息時,這些線程總是值得檢查並回顧過去。

探索性數據分析

你應該關注什麼?

您對數據集的初始分析將根據您正在檢查的數據類型而有所不同。但是,這些概念在各個領域通常是相似的,以下信息可以根據您的具體領域進行調整。為簡化,讓我們假設我們正在查看結構化數據。在任何初始EDA中都有一些基本問題要:

  1. 目標是如何分配的?
  2. 功能之間是否存在顯著的相關性?
  3. 數據中是否有任何缺失值?
  4. 訓練和測試數據有多相似?

目標是如何分配的?

在任何數據集中要注意的第一件事是類的分佈。如果存在類不平衡,您可能希望快速找到,因為這會對您的模型產生重大影響。特別是如果一個班級在訓練中淹沒了其他人的信息。有許多技術可以處理類不平衡(例如SMOTE,ADASYN,手動刪除樣本,處理不平衡數據集的模型參數),但首先我們要找出數據中是否有不均勻表示的類。檢查這個的快速方法是通過繪圖庫seaborn,基於流行的matplotlib。

import seaborn as sns
sns.countplot(df['target'])
如何開始在Kaggle上展開競爭?

多級目標失衡

我們可以看到,類90在我們的數據中被過度表示。上述SMOTE技術和其他技術可以創建更平衡的訓練數據集。反過來,這可以使模型更好地推廣,而這種不平衡可能不存在。

特徵之間是否存在顯著的相關性?

計算要素之間的Pearson相關係數可以提供對特徵的一些寶貴見解。瞭解特徵是否相關可以允許創造性的特徵工程或刪除不必要的列。例如,在下面顯示的heatmap圖中,EXT_SOURCE_1是由外部來源提供的貸款申請人的信用評級。 DAYS_BIRTH,申請人的年齡(負整數)與EXT_SOURCE_1呈負相關。這可能意味著EXT_SOURCE_1的計算涉及申請人的年齡。通常,我們希望避免包含可以從另一個特徵線性導出的特徵(這稱為線性依賴),因為它為模型提供了冗餘信息。

import seaborn as sns
import matplotlib.pyplot as plt
def correlation_map(df, columns, figsize=(15,10)):
correlation = (df.loc[:, columns]).corr()
fig, ax = plt.subplots(figsize = figsize)
sns.heatmap(correlation, annot = True, ax = ax)
如何開始在Kaggle上展開競爭?

相關heatmap圖顯示數值特徵之間的Pearson相關係數的正值和負值

數據中是否有任何缺失值?

您始終希望確保擁有一個完整的訓練數據集。例如,如果您的模型發現一個非常重要的特徵,但事實證明該特徵中的大量行是缺失值,則可以通過輸入缺失值來大大提高模型的性能。這可以通過基於不包含NaN的類似行推斷特徵的值來完成。另一種策略(稱為回填)是使用下一個非空值填充缺失值。其餘特徵的均值、中值或模式有時也用於估算缺失值。 pandas.DataFrame.fillna()方法提供了一些不同的選項來處理這種情況,這個Kaggle內核是一個非常有用的資源。

但是,缺失值並不總是意味著沒有記錄數據。有時,為某個不適用於該行的要素包含NaN值是有意義的。例如,假設具有二進制目標的貸款申請數據集(無論申請人是否被批准)包括關於個人是否擁有汽車的特徵。如果某個人沒有汽車,那麼汽車註冊日期的另一個功能將包含NaN值,因為這裡沒有任何信息可填寫。

訓練和測試數據有多相似?

pandas DataFrame對象包含一個pandas.Dataframe.describe()方法,該方法提供數據集中每個要素的統計信息,例如最大值、平均值、標準差、第50百分位值等。此方法返回另一個DataFrame,以便您可以添加更多信息。例如,您可以使用以下函數使用另一行檢查列中缺失值的數量:

def describe_df(df):
stats_df = df.describe()
stats_df.append(pd.Series(df.isna().any(), name='nans'))
return stats_df

這是一種非常有用的方法,可以讓您快速檢查訓練和測試中的特徵之間的相似性。但是如果您有一個單一的數字值可以讓你對訓練和測試的近距離一目瞭然呢?這就是對抗性驗證的用武之地。我知道這聽起來有點嚇人,但是一旦你理解它,它就會變得非常簡單。對抗性驗證涉及以下步驟:

  1. 將您的訓練和測試數據集連接成一個大型數據集
  2. 將所有訓練行的目標要素設置為值0
  3. 在所有測試行中為目標要素填寫值1(您可以看到它的位置)
  4. 根據數據創建分層摺疊(我喜歡使用sklearn實現)
  5. 將LightGBM等模型擬合到訓練摺疊並驗證驗證摺疊
  6. 採取將LightGBM等模型擬合到訓練摺疊並驗證驗證摺疊
  7. 對整個數據集進行驗證預測,並在ROC曲線下計算區域。我使用這個實現來計算面積。

ROC曲線下面積為0.5意味著模型無法區分訓練和測試行,因此兩個數據集是相似的。如果面積更大,那麼模型可以看到訓練和測試之間存在一些差異,因此值得您深入挖掘數據以確保您的模型能夠在測試中做好預測。

我發現以下兩個內核對於掌握這種技術非常有用:

Adversarial Santander | Kaggle

Adversarial CNN of PTP for VSB Power V12 | Kaggle

為什麼要從基於樹的模型開始?

確定正確的模型開始是很重要的,當你剛開始時可能會非常困惑。讓我們再假設您正在使用結構化數據,並且希望在進入建模之前獲得對數據有一些深入的見解。我發現LightGBM或XGBoost模型非常適合在您進入一個新的競爭對手時拋出數據。這些都是基於樹的增強模型,具有高度可解釋性和易於理解的特點。兩者都提供了繪製分割的功能,因此創建最大深度= 3左右的樹可以很有用,並且可以從一開始就準確查看模型分割的特徵。

lightgbm.Booster.feature_importance()方法顯示了模型最重要的特性的分割數的模型在一個特定的功能(importance_type =“分裂”)或每個分割獲得的信息量的特定功能(importance_type =“增益”)。查看特徵重要性在匿名數據集中特別有用,在這些數據集中,您可以獲取前5個特徵,並推斷出特徵可能是什麼,並瞭解它們對模型有多重要性。這可以極大地幫助特徵工程。

您還會發現LightGBM甚至在不使用gpu的情況下也可以快速地進行訓練(請原諒我的雙關語)。最後,對於這兩個模型都有很好的文檔,所以初學者應該沒有任何問題。

評估

如果沒有可靠的評估方法,你可能在競爭中擁有最好的表現模型,卻不知道它。一旦掌握瞭如何評估提交的內容,就應該確保在訓練和驗證中使用官方評估指標(如果沒有合適的實施方案,則使用您自己的版本)。將此與可靠的驗證集相結合,可以避免您通過提交進行刻錄,並允許您快速且經常地進行實驗。

此外,您希望以最終獲得單個數字的方式設置模型評估。查看訓練損失與驗證損失或一系列指標,包括精確度、召回率、F1得分、AUROC等,有時可用於生產,但在競爭中,您希望能夠快速瀏覽一個數字並說出“這個模型比我之前的型號更好”。同樣,這個數字應該是官方指標。如果不是,你應該有充分的理由不這樣做。

如果您遵循上述建議,您將會發現您經常進行實驗,所以您需要一種可靠的方法來跟蹤結果。我喜歡使用在Docker容器中運行的MongoDB實例,每次運行我的評估腳本後,我都會向其發送模型參數和驗證分數。我為每個模型保留了一個單獨的表(或MongoDB喜歡稱之為集合的集合)。當我完成一些實驗後,我將這些記錄以MongoDB .archive文件和.csv的形式轉儲到機器上的一個本地目錄中,以便快速讀取。應該注意的是,關於如何處理錄製結果有不同的思想流派,這是我的首選方法,但我很想知道其他數據科學家如何處理它!

如何開始在Kaggle上展開競爭?

編譯出品

相關推薦

推薦中...