天天看點

Kaggle知識點:資料分布不一緻的驗證

Adversarial Validation

在Kaggle比賽中資料分布一緻是阻礙大家上分的點,本篇文章将介紹Adversarial Validation原理和使用方法,并對資料分布不一緻的情況給出一些解決案例。

原創文章不易,希望分享、點選再看和收藏,謝謝!

Adversarial Validation

Kaggle比賽中資料可分為訓練集和測試集,國内比賽可能根據比賽階段劃分多個測試集,由于資料集采樣和分布的原因導緻訓練集和線上測試集可能存在分布不一緻的情況,也會帶來本地交叉驗證(Cross Validatation, CV)與線上不一緻的情況。

Kaggle知識點:資料分布不一緻的驗證

Adversarial Validation核心思路是建構一個分類模型,目的是分辨訓練集和測試集的來源,這裡假設使用AUC作為分類精度評價函數。

  • 如果分類模型無法分辨樣本(AUC接近0.5),則說明訓練集和測試集資料分布比較一緻;
  • 如果分類模型可以很好分辨樣本(AUC接近1),則說明訓練集和測試集資料分布不太一緻;

使用Adversarial Validation方法也非常簡單,将訓練集和測試集分别打上不同的标簽然後進行訓練,代碼思路如下:

train = pd.read_csv( 'data/train.csv' )
test = pd.read_csv( 'data/test.csv' )


train['TARGET'] = 1
test['TARGET'] = 0


data = pd.concat(( train, test ))
x = data.drop( [ 'TARGET', 'ID' ], axis = 1 )
y = data.TARGET


from sklearn.cross_validation import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y)      

在訓練集和測試集分布一緻的情況中,構模組化型的驗證AUC一般接近0.5,即分類模型無法判别樣本來源:

# logistic regression / AUC: 49.82%
# random forest, 10 trees / AUC: 50.05%
# random forest, 100 trees / AUC: 49.95%      

在訓練集和測試集分布不一緻的情況中,構模組化型得到的AUC一般接近1,即分類模型可以分辨樣本的來源。此時本地CV和線上就容易出現不止的情況。

資料分布不一緻怎麼辦?

當使用Adversarial Validation驗證或者手工驗證發現訓練集和測試集分布存在差異時,可以有哪些做法?

  • 假設存在多個訓練集,可以使用Adversarial Validation與測試集分布比較一緻的一個訓練集進行訓練;

在IJCAI2018裡,資料A是前六天的資料,資料B是第七天上半天的資料;在Ogeek裡,資料A有兩百萬資料,資料B隻有五萬資料;在聯通個性化推薦比賽,資料A有初賽約70W資料,資料B有複賽約35W資料。

此種情況一般存在于國内的多階段比賽會放出多個訓練集,比較好的方法是選擇與測試集最為相似的一份訓練集(假設為資料B)進行訓練。

當然其他的訓練資料(與測試集不相似,假設為資料A)可以被利用,可以先在資料A上進行預訓練,然後在資料B上進行微調,完成遷移學習(或稱為嫁接學習)。

​​https://zhuanlan.zhihu.com/p/51901122​​

  • 假設Adversarial Validation的AUC非常高,可以嘗試使用Adversarial Validation選擇出與測試集比較相似的樣本,建構成為驗證集。
  • 假設資料集可以擴增,則可以使用外部資料來擴增訓練資料,以保證訓練資料與測試資料的一緻性。

當然但資料分布不一緻的時候,上述情況都需要反複進行嘗試,不同的資料集具體情況不一樣。同時Adversarial Validation也隻能給出一些指導建議,具體還是要通過送出來驗證具體思路的正确性。

最後Adversarial Validation也可以用于驗證AB榜shake up的可能性,過拟合CV有風險。Do not trust your local CV!

Kaggle知識點:資料分布不一緻的驗證

閱讀連結

  • ​​https://www.kaggle.com/h4211819/adversarial-validation​​
  • ​​http://fastml.com/adversarial-validation-part-two/​​
  • ​​http://fastml.com/adversarial-validation-part-one/​​