題目連結:kaggle, avito是一家俄羅斯公司,從網站上來看是一個線上購物平臺,這一次題目的目標,就是預測某一個商品在某一天被售出的機率,給定的資料有一段時間內的商品的銷售情況(數量,價格,地區,品類,商品的俄文描述,商品的圖片)等資訊。
我的kaggle賬號:
https://www。
kaggle。com/yyqing/compe
titions
1. 丟了top10%
自己的時間規劃出了點問題,工作上臨時加了點任務,所以玩比賽這邊就少花了點時間,水平也不到位,本來在勉強拿到10%的最後一名,當剔除違規競賽者之後,排在了10%之外。:(
很少有題目同時用到了GBDT,CV,NLP的,這次算是遇到一個,算是漲了見識,有人取勝重點靠抽取到商品影象的特徵,有人取勝重點靠全量商品描述的詞向量,有人取勝在於強大的ensemble各路模型各路特徵。這一次我入場比較晚,找人組隊就很難了,一個人打還是比較累的,雖然利用到了之前儲存好的各種程式碼片段,不過還是時間太緊,精力有限,再加上我是球迷,我德表現如此糟糕,於是,哎喲喂,我也表現如此糟糕
2. 自己的收穫
短短10天,雖然成績不佳,但是知識和技能上的收穫還是感覺滿滿的:
組合模型在這一題發揮了重要的作用,我除了自己訓練了xgb,lgb和catboost之外,還從討論區複製來了rnn,ridge regression的成果
自己沒怎麼實踐過自然語言處理,照貓畫虎羅列好了tfidf,pca,svd等等,微調一下ngram,對自己分數提高還有有用的
認真按照自己的思路對著各路category實踐了target encode,感覺用處不大,過擬合有點重了,後來在討論中得知,大神們用的高階的target encode還有加噪音加平滑,據說也有用,下次我也玩高階的TE
由於是第一次搞詞向量的題目,第一次實踐了稀疏矩陣,lgb和xgb都支援,catboost還不支援,不過用pca將稀疏矩陣做成少量幾列還是可以餵給catboost用
拼接各種資料的時候,numpy的運算速度比dataframe要快,有的時候直接用pandas做數學運算,慢到出奇,不如把資料先匯出到numpy,運算完再重填回dataframe,節約時間大約一個數量級
壓縮資料在記憶體中佔的體積,link這個參考很不錯
多執行緒提取影象特徵,參考這裡,讓我差不多一天時間就把大約180萬張圖的基本特徵都拿出來了
在處理大量小圖片的時候,固態硬碟比機械硬碟的優勢就顯示出來了,機械硬碟的IOPS實在是跟不上cpu gpu的推理速度,分分鐘就到瓶頸,不過GCP上的幾百GB ssd價格好貴啊,玩了一會兒做完影象就趕緊換回了機械硬碟。
3. 高分答案集錦
這一次由於資料的豐富性,值得學習的思路很多,且很多大神分享的思路會有部分重合,這裡只摘抄我認為最值得學習並且去重的部分思路
3.1st, Little Boat, Dance with Ensemble
有一些lgb,有一些nn,有一些xgb作為第一層,第二層還是一些lgb+nn+xgb,第三層就是一個nn了。不過這麼組合出來分數提升了大約0。0002到0。0004,和直接線性組合比起來,可能差不多。
最佳單模型的nn和lgb都做到了215x的分數,另外隊友加來一個大量商品描述+RNN做出來的特徵,給lgb分數boost到了213x。
stacking在這一局非常重要,模型的多樣化是取勝的關鍵,
神經網路
我自己是重點時間都放NN了,所以也沒怎麼做特徵工程。我就來分享一下如何用一個nn做到215x的吧。
數字特徵加上類別特徵,分數有0。227x
加上了title和description都用rnn訓練一下,再加上fastText預訓練的embedding,調整一下,分數到了0。221x
自訓練的fastText embedding,在全量資料上,分數到了0。220x
加上vgg16的top layer的平均池化,這個讓分數變差了。tuning一下,在合併文字、影象、類別、數字特徵之前,分別加了一層,有了效果,0。219x了
嘗試調整文字模型,CNN或者attention等等,沒有一個work。最後,兩層的LSTM加一個dense,提高了分數0。0003
給影象嘗試不同的CNN,沒有一個“fine tune”的模型有用,並且還花了很多時間。最後發現fixed ResNet50的中間層有用,提高了0。0005, 到了0。218x了
開始各種tuning,都是基於自己想法的去調,發現在text和LSTM之間加上spatial dropout超級有用,提升了大約0。0007到0。001,又結合調整了dropout的比例,提升了0。001到0。0015,分數到了0。2165到0。217
開始把隊友做的特徵都加進來,隊友做的文字類的特徵加進來都沒啥用,不過其他類的特徵都有用,最後一個NN做到0。215x
如果一路上把所有模型都存下來(少量特徵訓練的模型,加了特徵分數變差的模型),然後再訓練一個全連線on top of those,可以得到0。008的提升,這個分數可以進入前10名了
秀一下我的模型架構圖吧(這個圖片截圖於little boat發帖的原圖):
評論區摘抄
我在評論中看到他有說,keras的RNN模型,用CuDNN實現的來執行的話,會快很多。
然後他貼出了他的rnn程式碼:
seq_title_description
=
Input
(
shape
=
[
max_seq_description_length
],
name
=
“seq_description”
)
emb_seq_title_description
=
Embedding
(
vocab_size
,
EMBEDDING_DIM1
,
weights
=
[
embedding_matrix1
],
trainable
=
False
)(
seq_title_description
)
emb_seq_title_description
=
SpatialDropout1D
(
0。25
)(
emb_seq_title_description
)
rnn_layer1
=
CuDNNLSTM
(
128
,
return_sequences
=
True
)(
emb_seq_title_description
)
rnn_layer1
=
CuDNNLSTM
(
128
,
return_sequences
=
False
)(
rnn_layer1
)
fc_rnn
=
Dense
(
256
,
init
=
‘he_normal’
)(
rnn_layer1
)
fc_rnn
=
PReLU
()(
fc_rnn
)
fc_rnn
=
BatchNormalization
()(
fc_rnn
)
fc_rnn
=
Dropout
(
0。25
)(
fc_rnn
)
3.1st Arsenal
很早就和小船開始組隊了,我們分別把精力花在nn和樹模型。花大約一半的時間在自己的xgblgb,另外一半的時間合併四個人的特徵共享。訓練了6個base xgb和7個level 2 xgb,13個lgb和12個level2 lgb。最好的base lgb到了0。2138分,最好的level2 lgb到了0。2110分
特徵工程
文字特徵:
tfidf用在title, description, title+description, title+description+param_1, etc。稀疏矩陣都直接給xgb用,然後做了svd和oof ridge特徵給lgb用,來保持多樣性。
文字統計,例如單詞長度,字母和單詞在不同level的長度,unique數量
影象特徵:
一些基本的image meta info
三個(ResNet50, InceptionV3, Xception)預訓練模型的top 5 category。
從vgg16拿出來的 512個raw特徵,和first 15 PCA特徵
keypoint數量特徵
類別特徵:
count/count unique在不同level的統計,都基於train+test算一遍,然後train+test+active再算一遍
不同level的target encode,包括了mean deal_probability對於count大於5000的catetory,mean predicted
預測出來的獨立變數特徵
xgb預測的price,image_top_1,lgb的price,image_top_1,
平均預測的price,image_top_1,item_seq_number,day_diff在不同的cat level上
user_id特徵
玩到過擬合了
其他
lgb我用了三組不同的的引數,用了baysian optimization找的,增加模型多樣性嘛。
特徵方面,我只用了能達成99%gain,在大部分lgb模型裡留下了700多個特徵,level 2 lgb裡大約300多個特徵,xgb大約用到了3000個稀疏特徵
3.1st thousandvoices
類別特徵的interactions
針對上述每一個特徵,做TE, mean target of previous ads, total occurence count, median price
超引數調優,我每一次增加num_leaves都有用哎,一直增加到2014,再加下去我記憶體就不夠了
3.1st Georgiy Danshchin
validatioin方案:time rolling window比較穩,組隊之後用common kfold了,
predicted price 和log1(price) 的差距,是很有用的特徵
3.2nd Sergei Fironov kaggle link
特徵
影象:從幾個公共模型提取出向量來
文字:全量資料訓練fasttext,生成向量(title, discription, title-category, stemmed title, stemmed description)
統計:各種groupby,interaction
非監督:用了autoencoder來對category提取向量,訓練了一個user2vec來表示user_id,作為特徵之一
模型
神經網路的:最好的nn得分到了0。2163,用到的特徵有:FM形式的cat特徵的embedding;數字特徵;拼接的fasttext;拼接影象特徵;BiLSTM for words, BiLSTM for char……好多好多
LGBM:fasttext向量對這個幫助很大,SVD over TFIDF有用,數字特徵和target encode有用
比較弱的模型有:FM_FTRL, Ridge,CatBoost
評論區摘抄
神經網路用了兩種loss, [‘mse’,‘binary_crossentropy’],平均
3.3rd KazAnova kaggle link
整合模型方案
平均了兩組整合模型。第一組是用的標準的5 fold validation方案。
第二組是用的時序方案。測試資料日期開始的幾天和訓練資料最後的幾天是重合的,我們嘗試用這幾天的資料用來做內部驗證。所以,我們用訓練集的前面六天來做訓練,用第10到13天來做驗證。沒有用第6到9天的資料,這被用來模仿訓練集和測試集的gap。最後,生成預測的時候,我們再用整個訓練集。
為了保證category的相似性,我們一直用著gap4天的方式來做。比如計算day4的訓練資料,我們用day0來做。為了模仿day 5的相似性,我們用day0和day1的平均值來做。這種方式,一直可以在cv和lb上給出類似的效能
我們最好單模型是用這個方法得來的,lgb最好0。2163,nn最好。2180
我們主要用了xentropy來作為objective,因為機率也是分佈在0到1之間的
LGBM 特徵
和上面諸位大神差不多的特徵
3-way interactions of 分類特徵
NN
我們最好的nn用了兩stacked的 雙向的 GRU, 額,後面的描述我不知道咋翻譯了,對NLP不熟,以後慢慢補。objective用的是binary cross-entropy with sigmoid output。
幾個注意的關鍵點:
用vgg16和vgg19獲得特徵,當做dense input
文字基於nltk處理
關於文字,我們合併了description,title, params到一個域,然後用間隔符分開
3.4th Joe Eddy
價格有關的統計特徵:因為發現價格比較重要,於是對價格開始基於各種分類的聚合。然後比如有20th percentile, median, max, std, skew。然後計算相對價格,比如每一個價格相對於同樣類別均價有多少便宜或者多少貴。後來猜測到購物網站上,有基於價格來排序商品的選項,這個肯定是很重要的特徵了。然後做了價格關於文字類描述的聚合,文字類描述做了詞向量然後聚類成少量的類別。
評論
Q:
Why did you choose tf-idf and svd as the matrix factorization method of categorical data? Coming from talkingdata, my first instinct was to use LDA(talkingdata 1st place solution) on label-encoded categories。
A:
I chose tf-idf -> SVD because it‘s the classic approach used for latent semantic analysis on text / the easiest one for me to implement and tune, but it’s very possible that LDA would have worked well for this too。
後面還有很多分享,太多了,這裡就不寫了
4. 最後
小夥子還是太年輕,要想取得好成績,一定是早早就準備開始比賽,審題,分析,多多在論壇參與討論,你看,奪得前三名的隊伍,都是很早開始,一個個思路的嘗試,每一步都踏平一個坑走到top位置的
失敗原因概括
儘早準備,才有時間機會嘗試各種idea,各種玩法
NLP實踐確是我的弱點,需要找一門課複習一遍,再找一道老的題目實踐實踐
layer stacking還沒搞過,以後一定找機會試試
提交沒幾次發現組合模型特別有效的話,組隊刷才是王道