數據挖掘類競賽經驗總結與分享:人人都可以是贏家


隨着天池穿衣搭配推薦比賽的結束,我也該暫且退出競賽江湖,一心一意搞科研了。今年共參加了3場公開比賽,成績雖不是特別好,但也還說的過去,在搞比賽上面花費了不少時間和精力,耽誤了不少事。如果有一天問自己這么辛苦玩這些和畢業要求無關的事值得嗎?還是不自找麻煩糾結這些問題吧,呵呵,正道是——滿紙荒唐言,一把辛酸淚;都雲作者痴,誰解其中
味。

做競賽有哪些好處?

1. 讓你100%清楚哪些數據挖掘的算法在實際應用中最有效。有效包括效率和性能。很多人往往看了幾章data mining的教程,就以為知道了數據挖掘是怎么一回事了。甚至在高端會議發過
一些paper的同學也有些停留在理論的烏托邦,最典型的例子就是他們覺得SVM是最好用的分類器。比賽往往采用工業界的數據,所以通過PK,我們可以很清楚的知道哪些算法好用,哪些參
數靠譜,以及自己和別人的差距。

2. 認識很多有意思的人。當然這個要求你排名越靠前越好了,畢竟人以群分嘛。 例如Kaggle 上可以和別人組隊, 競賽top k的team有可能被邀請去參加答辯,這些都是認識大牛,
多交流的好機會。
3. 提高自己快速寫代碼的能力。 要知道每場比賽你要實現很多很多的想法。 所以敲代碼都是噼里啪啦的一揮而就,不會像做項目一樣有code review, unit test什么的。我們都
講究速成,一次到位。
4. 有錢賺。 這個好像比較難。 大牛人也不能保證每次都擠進前3名。 除了money, 還有積分, 比如天池的積分就可以換一些禮品。

壞處呢? 當然就是時間了。 做比賽真的是很費時間和體力。 人的時間是有限的,你在這里花的時間多了,做別的事就少了。

以上都是概括性的東西,各位看官也許就一笑而過,下面就來點詳細的經驗吧。 我會總結3場比賽的經驗,每場的收獲都或多或少有些不一樣。

1. IJCAI 2015 competition http://tianchi.aliyun.com/datalab/introduction.htm?spm=5176.100075.5678.1.tYIFBT&id=1


很多主流的數據科學類學術會議都會有一個競賽,例如KDD, ICDM, CIKM等。 它的特點是吸引很多有學術背景的同學來參賽。 獲得較高名次的同學受邀去會場workshop 做報告。 今
年的IJCAI是阿里巴巴贊助的,這個比賽的內容是預測雙十一的回頭客。 這算是我參加的第一個公開競賽吧。 說來有趣,也就是我的上一篇博客,“用R分析時間序列(time series)數
據”, 是為了參加微軟內部一個time series 預測的比賽,現學現賣了一把,很走運地拿了第一名。 然后覺得做比賽很有挑戰性,於是又搞了一把。 IJCAI比賽分兩個賽季,第一賽季名次不是很靠前,只排第15. 前50名可以進入第二賽季。 第二賽季換了個平台,很幸運的得的第二名,拿了獎金去阿根廷玩了一把。 為什么說很幸運呢?因為第二賽季換了平台,提交的是MAPREDUCE類型的java程序包,它嚴格規定了程序的流程必須是提取feature-》指定分類器,參數-》得到預測結果。 也就是說,每個人只能選一種分類器,不能像第一賽季一樣把多個分類器的結果融合。 而我的強項就是提取feature和選參數,這個時候我還很年輕,不懂得“融合大法”的厲害,所以說很幸運的得了第2.
什么是“融合大法”呢? 原來在做比賽的時候,光靠同一個算法產生的結果是不行的,必須要把多種算法的結果融合起來。 目前最好用的算法是GBDT,其中Xgboost工具包是最火的。 但是簡單地把GBDT和 logistic regression的結果加權, 其性能會超過單個GBDT的。 所以一般人都是訓練多個分類器,每個分類器都用不同的參數訓練幾組。 換句話說,不要只鍾意於最好結果的那組模型,結果弱一點的模型/參數也不能放棄。 這就是典型的ensemble思想,從弱分類器中得到強分類器。
但是光在模型上做花樣也是不行的,還需要在feature集上做花樣。 用feature的全集訓練的模型,效果無疑是最好的。 但是如果只取一部分feature,用這個部分feature集訓練出一些弱一點的模型,再把它們全部融合起來,性能又可以提升。很神奇吧? 我也是在這次比賽結束后才明白這個“秘密”的。 寫到這,各位讀者是不是覺得做比賽確實很費時間和體力呢?
最后提一句,GBDT的參數,把learning rate盡可能調小,把num of tree 盡可能調大,這樣單個DBGT的成績就提高的比較明顯。

 

2. Kaggle上的 Springleaf Marketing Response https://www.kaggle.com/c/springleaf-marketing-response

這個比賽的特點是錢多(總共10萬美元),所以吸引了世界各地超過2000個隊伍來爭奪,其激烈程度一點不遜於KDD competition。 我最終排名14. 很遺憾是一個人在做比賽。這次的秘訣是不同的人的結果融合,所以一個team的成員數量越多,越有優勢。 比賽結束的當天,我把我的結果和第10第11的人的融合,就超過了第2名的成績了;再和第9名的融合,就超過冠軍隊的得分了。 事實上冠亞軍也正是靠組隊飈上去的。 當然我這是事后諸葛亮了,要及時醒悟這個道理也是一個難點。

這個比賽的特點是不告訴你每個feature的實際意義,只是給你一堆數據,讓你從無知的概念中獲取結果。 這次我充分吸取了IJCAI的經驗,用了不同的算法,同一種算法用了不同的參數,也在不同的feature 子集上訓練了模型。 其中值得一提的有兩點:
1. 在第一次用GBDT預測之后,可以得到所有的feature的重要性。根據這個重要性從1開始編號,按照idx % 5 把所有feature划分成5份;同時再隨機產生5份 feature 子集。 這10份feature 子集每一份得到的模型成績都不是很高,只能排在400名左右,但是簡單地把這10個結果平均一下,成績就是前50了。很神奇吧! 我自己都驚呆了。 再和別的分類器融合融合,最終就是第14.
2. GBDT的參數,還是按照把learning rate盡可能調小,把num of tree 盡可能調大的原則,這樣單個GBDT就夠讓我的機器跑5個小時了,要知道如上所述,我只用80%的feature就能排在400/2200名,說明大部分用戶是不懂得如何調參數或者選分類器的。 (我的參數舉例:12000 trees , step size=0.02)

期間我還設計過許多高級的算法,例如用deep learning加工feature, 定義不同的算子來產生/加工raw feature等等,然而並沒有什么卵用,這里就不裝了。

3. 天池 穿衣搭配推薦 http://tianchi.aliyun.com/competition/introduction.htm?spm=5176.100066.333.8.s9zH6X&raceId=231506


這個比賽,總結一句就是理想很豐滿,現實很骨感。這個比賽看起來很有意思,我原本是抱着學術研究的態度去做的,結果自己設計的模型沒有用,還不如一些簡單地baseline。
說一說我的方法,各位估計要笑了,特別簡單,就是考慮幾條簡單地規則:1 根據文本計算一個相似度,按照相似度排序,取top200 2.計算商品之間有多少個共同購買的用戶(注意區分同一天購買,同一周,同月,同季度等等),排序取top200 3 trianing set中有一個搭配集,對於每一個item01,找到在搭配集中和它相似的/和它有過共同購買的 商品(item02), 然后把item02的搭配推薦給item01 , 取top200. 最后把這3條規則的結果穿插融合,就是我最終的排名(第13
名).
做完這些我就開始興致勃勃地設計自己的“高級”模型了。做了好幾天的矩陣分解,發現AUC是挺高的,但是MAP卻很低。 失望之余只好重新回到提取feature的思路上來。最后設計了一組新的feature,包括文字匹配概率,商品季節搭配概率,商品類別流動概率等等,線下測試得分挺高的,但是不妙的是在比賽快結束的時候主辦方對每個team的資源加了約束,我不能在全集上實現我的方案,最終還是沒能更新結果。
小結一下這個比賽:
1。 內容很吸引人,但是做法卻很簡單粗暴。 圖像什么的完全沒有效果(不知道冠軍隊有沒有用)。
2. 數據量很大,要對7.6W商品推薦前200個搭配候選項,大家都在全集(超過300W個商品)上篩選結果,光是item01-item02-feature這張表就有超過1T的大小。 所以比賽中期阿里雲平台一度被選手們整奔潰了,后來主辦方不得不對每個隊伍資源加了限制。
3. 第二賽季完全在odps平台上操作。我是第一次使用odps,搭配本地環境花費了好大精力。 如果本地環境沒搭配好,就不能提交mapreduce程序和udf程序,就只能靠sql腳本寫,這樣的得分最終會在30名左右。 所以我覺得,跑通了odps平台就贏了一半了。


以上就是我隨手寫的2015比賽之路歷程。3次比賽,3個不同的平台(學術競賽,kaggle,天池),3個不同的問題。 雖然后兩個都是留着莫大的遺憾,也算是學到了不少東西。 眼下好好搞科研吧,希望以后再有時間,組個隊搞搞吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM