摘自自己的blog: [AI&Strategy](databatman.cn)

PetFinder Competition Top2%方案總結

比賽鏈接:[2018kaggle動物領養時間預估](PetFinder.my Adoption Prediction | Kaggle)

渣渣代碼開源:github.com/databatman/k

比賽最後private排名是 33/2000名,比public降了大概十名,還好還好。評估指標kappa係數還算波動不太大,沒能拿到金牌還是得繼續努力。

這次比賽主要預測寵物領養速度的,有0-4,5個等級,0是1天內領養,1是1-7天內,2是8-30天,3是31-90天,4是100天後沒領養,可以看到還是有一定有序的,評估指標是quadratic weighted kappa,式子中包含平方差,所以直接使用了mse作為模型的優化函數。會比使用分類指標效果更好。

我大概是1月份開始做的,當時做了大概1個月,分數達到了453,在當時還能進入榜單top5的,之後就因為過年和工作的原因沒做了,之後3月份加入了開源的pic256維特徵,單模型分數從453 -> 463,然後就找了隊伍合作,後面基本就靠隊友carry了,最後public分數478.

比賽的形式主要是kernel賽,需要在kaggle上實現,如果只用cpu的話需要在6小時內運行完成,用了gpu的話需要在2小時內完成。這樣的方式限制了你沒法大量stack模型,我們隊伍最後也只堆了3-5個模型,整體運行時間在90min內。

1 難點

這次的比賽難點主要在線上跟線下不同步,有人分析過可能是跟時間有關,test的數據裏age都偏小,猜測test應該多為春季裏出生的寵物,train裏多為秋冬季的,這個是真的神了,但是因為data裏沒有時間信息,所以也沒法針對處理。

所以就經常有線上線下不同步的情況,線下一頓操作猛如虎,到了線上變老鼠。 做過kaggle的應該都知道,線上線下不同步,private公佈的時候榜單變化會很劇烈,所以一直很擔心最後榜單變動太大,幸好最後只掉了10名。

到了比賽結束後也沒找到同步的方法,論壇大家也是,不過有個前排的kaggler說自己線上線下是同步的,等他開源了。

2 特徵

我這次的數據特徵羣主要有以下幾塊,

  • 0 原始特徵
  • 1 圖像特徵:主要通過預訓練模型如vgg提取出256維特徵,圖像特徵很重要,可以直觀的看到寵物的好壞,我在加入圖像這個特徵之後有1個百分位的提升,相當可觀。
  • 2 文本特徵:svd/nmf/lda等文本特徵,加上語種特徵如是否包含中英文等。
  • 3 rescue特徵:救助者特徵,對rescueid groupby 統計救助者拯救的寵物數量,寵物類別,費用等,有1-2個百分位的提升。
  • 4 state特徵:地域特徵,尤其是從維基百科上爬下各個州更詳細的經濟和地理信息作為特徵,有幾個千分位的提高。
  • 5 品種特徵:合併breed1和breed2,發現breed1和breed2能提取出純種特徵,當breed1==307的時候。品種特徵在論文中也強調了很影響寵物被領養的速度。
  • 6 官方api特徵:使用google api提取出的文本和圖像特徵,平臺提供。

失敗的特徵羣嘗試,

  • 0 將代表寵物是否接種過疫苗等的幾個特徵合到一起提取出是否健康的特徵,kappa指數降低
  • 1 從文本里提取是否包含positive/negative的詞例如happy good、sad、terrible等,離線cv提高,線上lb降低了1個百分位。
  • 2 rescueid groupby特徵過多離線cv提高,線上lb狂降。
  • 3 文本特徵例如:句子數,詞數等基本信息,離線cv提高,線上lb狂降。(有人提高了,可能模型不一樣導致)
  • 4 color1-3合併成一列,同樣離線cv提高,線上lb降低。

3 模型

模型結構用了stack。 第一層主要是3個lgb和3個nn,隊友的nn能達到440+,融合後有提升效果,lgb的單模型最好能到465, 第二層使用ridge,基本可以看做是線性加權融合,比手動調優好一點。

另外說一句,這次比賽使用mse作為優化函數,預測的結果都是double類型,如1.1,2.3,3.5這樣,但是提交的是0-4的類別,所以提交前還要使用分割函數劃分為0-4個類別,我使用的分割函數主要根據train裏0-4各個類別的佔比對test預測值排序來劃分test,開源的版本里還有使用黃金分割點來劃分的,有的人好有的人壞,最後就沒用。

4 覺得有用但沒做的點

  • 論壇有人發現有2個不同寵物id的圖片和基本信息一模一樣,但是age不一樣,猜測是rescuer將第一次沒被領養的寵物撤掉重新掛了下,但是實際查看數據發現有同資料但age小的反而被領養了,存在臟數據,所以最後也沒能利用這塊特徵。
  • 多模型融合裏可以嘗試用不同的優化指標,例如分類、自定義kappa等,但是投入時間不足就沒做嘗試。
  • 這次的指標對模型參數異常敏感,調優帶來的收益很大,僅僅只是將bagging從0.91 -> 0.9,kappa就提高了幾個千分點,效果驚人,隊友使用了貝葉斯調參法調到了最優,我個人沒嘗試,耗時太久了,大家感興趣可以研究研究。

推薦閱讀:

相關文章