不努力一定沒結(jié)果,努力了沒結(jié)果更痛苦。
事情沒做怎么知道自己有多垃圾。
親身經(jīng)歷告訴你,雞湯都TM是唬人的。當(dāng)然成王敗寇的事也不好說。
從某種意義上來說,這是我第一次獨自花了大量時間做的一次DM/ML比賽,去年跟著師兄后面打醬油,其實沒做什么事,在kaggle上做了兩次也只是下載了數(shù)據(jù),隨便跑了個模型了事。至于參加這次比賽的原因,第一個是因為在實驗室兩年看了些論文卻沒什么項目,有個比賽的話,面試時候還能說說,第二就是興趣吧,之前也在Coursera上學(xué)過Ng的ML、臺大的ML基石和技法課,想具體實踐一下。
如題,結(jié)果很失敗,復(fù)賽都沒進(jìn)。我不知道原因何在,但能猜出一些,這個最后再表。先說說這一個月我干了些啥。
數(shù)據(jù)剛剛放出來,我就下載了,主要的行為數(shù)據(jù)解壓后有500M,讀到內(nèi)存里處理有點大(我們實驗室有用openstack搭的云平臺,不過由于資源緊張只給我虛擬了一個4G的ubuntu14.04=。=),于是用python寫了一個數(shù)據(jù)生成器(yield),生成一個包含數(shù)據(jù)每個字段的字典。接下來就是統(tǒng)計數(shù)據(jù)的一些基本信息了,不過這部分沒有深入做下去,不然我想我特征可能會好一點。接下來劃分?jǐn)?shù)據(jù)集,這時候的做法是將整個行為數(shù)據(jù)變成了三個文件(~1216線下訓(xùn)練,~1217線下測試/線上訓(xùn)練,~1218線上測試),然后在這三個數(shù)據(jù)集上提取特征,從負(fù)樣本中采樣,跑了m個LR模型,再做投票,草草交了(331)。
結(jié)果當(dāng)然很渣,然后又在LR上弄了幾天,當(dāng)然主要時間花在提取特征上面,結(jié)果有提升,但是趕不上別人的速度啊- -,怎么辦,想辦法,改用了隨機(jī)森林(RF),而且放棄了自己弄得那個負(fù)樣本隨機(jī)采樣,再融合的方法,把所有數(shù)據(jù)放在一起訓(xùn)練,并調(diào)節(jié)參數(shù)class_weight(忘了說我用的ML包是python的scikit-learn),又加了幾個特征,好的,線下能到6了。這個時候我已經(jīng)弄了近100維的特征,不過我發(fā)現(xiàn)將這些特征全都用上結(jié)果很差(特征冗余、特征有干擾、模型變復(fù)雜特征空間變大,泛化變?nèi)酰┯谑菄L試使用自動特征選擇算法,sklearn提供了很多,什么基于統(tǒng)計、L1正則的線性模型、基于決策樹,我都試了,結(jié)果嘛,呵呵噠。我不知道是不是我用的姿勢不對,反正試過之后我就放棄了,開始手動選擇特征,這個工作我花了兩天(現(xiàn)在想想太蠢了),主要就是在不同特征(組)上試模型,最后我發(fā)現(xiàn),原來只有幾個特征是有用的,而且這些特征都和最后幾天相關(guān)。在這段時間我犯過一些很蠢的錯誤,比如,有一天我在想怎么樣預(yù)測未有過行為的UI對,我當(dāng)時的想法是這樣的:雖然UI對的交互特征沒有,但是他們單獨的特征是可以提出來的啊,于是我就在訓(xùn)練數(shù)據(jù)中混了訓(xùn)練label為1的ui對的信息- -。,當(dāng)時并沒有覺得什么不對,線下效果爆表,當(dāng)天提交時還有點小激動= =。
換數(shù)據(jù)之前最后幾天,我試過使用全集的行為信息(之前使用的交互特征都是子集的ui對),大約采樣1/10,結(jié)果嘛,呵呵噠。我試過提取單天的特征做訓(xùn)練,然后發(fā)現(xiàn)單天線下都能做到7,當(dāng)時感覺這段時間都白做了,但是線上并不好(由于只交了一次單天的,所以不知道是不是過擬),當(dāng)時還有一個想法是用單天的特征可以訓(xùn)練出很多模型,在這些模型上做ensemble,并用這些單天的label做validation,但是這個想法沒有做下去,感覺有點不靠譜。
換數(shù)據(jù)最后幾天,我拋棄了原來特征表的大部分特征,從一個小的特征集合重新出發(fā),我看到旺旺群里有人用規(guī)則線上做到了10,并且說了一些規(guī)則的思路,我將有些規(guī)則轉(zhuǎn)化為了特征(比如用戶是否喜歡加購物車就購買規(guī)則可以用購買/購物車表示),結(jié)果果然有提升,并在換數(shù)據(jù)最后一天,線上到了9.3。
換數(shù)據(jù)后,線下用~16的模型訓(xùn)練f1只能到5了,用~15的模型訓(xùn)練卻能到6,當(dāng)然這些都沒換數(shù)據(jù)之前高,是不是18號的數(shù)據(jù)分布不一樣了呢?我第一天交了一發(fā)是用~16和~17的兩個模型做交集的結(jié)果,線上8.8,然后我就再也沒超過這個分?jǐn)?shù)T.T。第二天,我突然發(fā)現(xiàn)用基于樹的特征選擇+LR線下到能5.7,然而線上5都沒到。。。,第三天調(diào)了些參數(shù)加了些特征,交了~17數(shù)據(jù)訓(xùn)練的模型的結(jié)果,沒超過8.8,第四天交了~16數(shù)據(jù)訓(xùn)練的模型,沒超過8,最后一天,這時候已經(jīng)掉出榜單了,慌得要死,重新用自己抽樣的方法,對正樣本用SMOTE算法上采樣,并對負(fù)樣本按照比正樣本15:1的比例下采樣,跑100個RF模型,再做投票,最后結(jié)果也只有5.7,晚上沒轍了,開始在結(jié)果集中嘗試規(guī)則過濾,因為時間不夠了,隨便用一些規(guī)則過濾了一下ui。(這段時間最讓我迷茫的是用不同的模型不同的訓(xùn)練集測試不同目標(biāo)日的label表現(xiàn)各不相同。。。)
然而最后也沒逆襲。
原因是什么呢?特征選取有問題、采樣有問題,我真想不到到底是什么原因。
ps:以上過程記錄沒有任何指導(dǎo)價值,我只是想記錄一下之一個月做了什么。
pps:開始的兩句話雖然有氣話的成分,但卻一定程度說明了一些事實。BUT,你只能去努力,只能去做不是嗎,已經(jīng)選了這路,只要腿沒斷,就還得走下去不是嗎,這才是他媽的人生。