題目連結: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發帖的原圖):

kaggle | Avito商品銷售預測 top 11% 總結

評論區摘抄

我在評論中看到他有說,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還沒搞過,以後一定找機會試試

提交沒幾次發現組合模型特別有效的話,組隊刷才是王道