TIANCHI天池-OGeek算法挑战赛-完整方案及代码(亚军)
首先很幸運(yùn)拿到TIANCHI天池-OGeek算法挑戰(zhàn)賽大賽的亞軍,同時(shí)非常感謝大佬隊(duì)友的帶飛,同時(shí)希望我的分享與總結(jié)能給大家?guī)?lái)些許幫助,并且一起交流學(xué)習(xí)。(作者:王賀,知乎:魚(yú)遇雨欲語(yǔ)與余)
賽題鏈接:
https://tianchi.aliyun.com/competition/entrance/231688/introduction
Github鏈接:
https://github.com/fanfanda/OGeek-Competition
本文目錄
賽題分析
數(shù)據(jù)分析
賽題難點(diǎn)
特征工程
算法模型
思考總結(jié)
1. 賽題分析
此次賽題來(lái)自O(shè)PPO手機(jī)搜索排序優(yōu)化的一個(gè)子場(chǎng)景,并做了相應(yīng)的簡(jiǎn)化,意在解決query-title語(yǔ)義匹配的問(wèn)題。簡(jiǎn)化后,本次題目?jī)?nèi)容主要為一個(gè)實(shí)時(shí)搜索場(chǎng)景下query-title的ctr預(yù)估問(wèn)題。
賽題特征:prefix(用戶輸入,query前綴),query_prediction(根據(jù)當(dāng)前前綴,預(yù)測(cè)的用戶完整需求查詢?cè)~,最多10條;預(yù)測(cè)的查詢?cè)~可能是前綴本身,數(shù)字為統(tǒng)計(jì)概率),title(文章標(biāo)題),tag(文章內(nèi)容標(biāo)簽)
提供數(shù)據(jù):初賽復(fù)賽一致, 訓(xùn)練數(shù)據(jù):200萬(wàn) 驗(yàn)證數(shù)據(jù):5萬(wàn) 測(cè)試數(shù)據(jù)1:5萬(wàn) 測(cè)試數(shù)據(jù)2:25萬(wàn)
評(píng)估指標(biāo):本次競(jìng)賽的評(píng)價(jià)標(biāo)準(zhǔn)采用F1 score 指標(biāo),正樣本為1,公式如下:
2. 數(shù)據(jù)分析
這一部分將會(huì)對(duì)部分?jǐn)?shù)據(jù)進(jìn)行分析,另外獲取部分特征的點(diǎn)擊率分布情況判斷特征效果,看分布可以有一個(gè)很好的初步驗(yàn)證作用。
這四個(gè)圖是prefix在各自數(shù)據(jù)集的百分比統(tǒng)計(jì),并以訓(xùn)練集中出現(xiàn)頻次top10的prefix畫(huà)出了每個(gè)數(shù)據(jù)集的占比情況,可以發(fā)現(xiàn)valid與testa和testb的分布相似,說(shuō)明valid與testa和testb的查詢時(shí)間比較接近,作為驗(yàn)證集線下比較可信。
此處更近一步分析了train和testa、testb有較大的差異性。
我們對(duì)數(shù)據(jù)特點(diǎn)進(jìn)行了分析。發(fā)現(xiàn),
1.用戶有可能會(huì)拼錯(cuò)prefix,如‘抖音’拼寫(xiě)成‘枓音’,分析發(fā)現(xiàn),使用prefix的pinying會(huì)比中文大幅度減少不同值的出現(xiàn)次數(shù),當(dāng)然也有一部分不是拼寫(xiě)錯(cuò)誤的,如痘印,所以最后我們中文和拼音的兩部分特征都使用了。
2.由于這是實(shí)時(shí)性比較強(qiáng)的搜索場(chǎng)景,分析發(fā)現(xiàn),測(cè)試集中會(huì)有很大一部分prefix和title未在訓(xùn)練集中出現(xiàn)過(guò)。
除基礎(chǔ)數(shù)據(jù)分析外,我們還分析了部分特征,比如prefix的長(zhǎng)度特征,其用戶輸入prefix越詳細(xì),整體CTR也隨之提高,其他特征的長(zhǎng)度也有類(lèi)似的趨勢(shì)。
另外,相似度特征是非常重要的特征,prefix和title越相似度,點(diǎn)擊的可能就越高。
3. 賽題難點(diǎn)
經(jīng)過(guò)上面的分析以及對(duì)業(yè)務(wù)的理解,本賽題有什么難點(diǎn)呢?對(duì)此我們總結(jié)了五點(diǎn):
沒(méi)有用戶/沒(méi)有時(shí)間的信息,因此無(wú)法對(duì)用戶建模,對(duì)于同一個(gè)query,不同人不同時(shí)間段都會(huì)有不同的反應(yīng)。
實(shí)事熱點(diǎn)轉(zhuǎn)移快,訓(xùn)練集中點(diǎn)擊率高的,測(cè)試集中不一定高。
訓(xùn)練集和測(cè)試集的分布不是單純的按照時(shí)間,因?yàn)橐恍┟黠@的熱搜詞訓(xùn)練集中沒(méi)有,但是驗(yàn)證集和測(cè)試集里面大量存在。這顯然不合理的,所以我們認(rèn)為,主辦方數(shù)據(jù)抽樣的時(shí)候,過(guò)濾了該詞語(yǔ)。
因?yàn)槭菍?shí)時(shí)性比較強(qiáng)的搜索場(chǎng)景,因此面對(duì)新出現(xiàn)的title如何處理?由于同樣的query-title,最終都會(huì)被模型預(yù)測(cè)成相同的標(biāo)簽,模型對(duì)于高頻新詞的點(diǎn)擊率均值的把握,成為了關(guān)鍵點(diǎn)。
用戶的明顯拼寫(xiě)錯(cuò)誤query,例如劉覽器這種如何處理?
4. 特征工程
這里對(duì)CountVector的特征構(gòu)造進(jìn)行展示,CountVector特征在復(fù)賽提升也是非常大的。
# CountVectorizer data = data_df[['prefix', 'query_prediction', 'title', 'label']] data.replace('nan',np.nan,inplace=True) data['query_prediction'].fillna('{}',inplace=True) data['title'].fillna('-1',inplace=True) # prefix,title,query_prediction jieba分詞 def get_cv_feature(dt):df = pd.DataFrame()for item in ['prefix', 'title']:print(item)stat = pd.DataFrame()stat[item] = dt[item].drop_duplicates().valuesstat[item+'_jieba'] = stat[item].apply(lambda x:' '.join(jieba.cut(str(x), cut_all=False)))df[item+'_jieba'] = pd.merge(dt,stat,how='left',on=item)[item+'_jieba']stat = pd.DataFrame()item = 'query_prediction'print(item)stat[item] = dt[item].drop_duplicates().valuesdef getFeature(x):dct = json.loads(x)lst = []for k in dct.keys():lst.extend(jieba.cut(k,cut_all=False))return ' '.join(lst)stat['query_prediction_jieba'] = stat['query_prediction'].apply(getFeature)df[item+'_jieba'] = pd.merge(dt,stat,how='left',on=item)[item+'_jieba']return df df = get_cv_feature(data) from sklearn.feature_extraction.text import CountVectorizer from scipy import sparse cntv=CountVectorizer() data['label'] = data['label'].astype(int) vector_feature = ['prefix_jieba','query_prediction_jieba','title_jieba'] train_index = data[data['label']>=0].index.tolist() test_index = data[data['label']==-1].index.tolist() train_sp = pd.DataFrame() test_sp = pd.DataFrame() for feature in vector_feature:print(feature)cntv.fit(df[feature])train_sp = sparse.hstack((train_sp,cntv.transform(df.loc[train_index][feature]))).tocsr()test_sp = sparse.hstack((test_sp,cntv.transform(df.loc[test_index][feature]))).tocsr() print(train_sp.shape) print(test_sp.shape)相似度特征:prefix,title分別構(gòu)造與query_prediction中每個(gè)key的相似度),并統(tǒng)計(jì)max,std,mean相似度。更進(jìn)一步,統(tǒng)計(jì)top3,top5相似度的max,std,mean。
這些也是CTR問(wèn)題傳統(tǒng)特征,同時(shí)對(duì)于這些特征的構(gòu)造也是直接照辦之前的開(kāi)源
魚(yú)遇雨欲語(yǔ)與余:2018騰訊廣告算法大賽總結(jié)/0.772229/Rank11
鏈接:https://zhuanlan.zhihu.com/p/38034501
由于賽題的特殊性,給了我們驗(yàn)證集,通過(guò)觀察訓(xùn)練集和驗(yàn)證集的數(shù)據(jù),我們發(fā)現(xiàn)存在熱點(diǎn)轉(zhuǎn)移的情況,例如關(guān)于某個(gè)明星,title 1是高熱點(diǎn)轉(zhuǎn)換網(wǎng)頁(yè),可是到了驗(yàn)證集中,這位明星的高熱點(diǎn)title是另外的一些網(wǎng)頁(yè),說(shuō)明實(shí)時(shí)熱點(diǎn)性比較強(qiáng)。因此我們對(duì)CTR的使用方法進(jìn)行如下調(diào)研。
我們這邊采用了多種方式來(lái)防止過(guò)擬合,分別是多折交叉提取特征,平滑,以及采樣。
從表格中(5)可以看出,不使用五折交叉提取特征,訓(xùn)練集的auc比驗(yàn)證集的auc高很多,這就非常容易過(guò)擬合,導(dǎo)致線上結(jié)果很差,
(2)->(3)的過(guò)程就是相差了一個(gè)平滑,從而導(dǎo)致訓(xùn)練集和驗(yàn)證集上的auc都有所下降;此外,在我們的方法中加入了0.5的采樣,是為了使得訓(xùn)練集和驗(yàn)證集結(jié)果都不會(huì)過(guò)擬合。
上表(4)所示,對(duì)訓(xùn)練集和驗(yàn)證集均加入0.5的采樣之后,訓(xùn)練集和驗(yàn)證集的auc都會(huì)有所降低,當(dāng)然對(duì)非常近的數(shù)據(jù)可能不利,但是對(duì)訓(xùn)練集和測(cè)試集相隔比較遠(yuǎn)的數(shù)據(jù),隨熱點(diǎn)的轉(zhuǎn)移,CTR也會(huì)有所改善。
經(jīng)過(guò)調(diào)研,我們使用0.5sample構(gòu)造CTR特征,主要目的是目的是為了削弱ctr的特征重要度。
5. 算法模型
對(duì)于此次比賽我們對(duì)傳統(tǒng)機(jī)器學(xué)習(xí)模型以及深度模型都進(jìn)行了嘗試。
TextCNN是經(jīng)典的文本特征提取網(wǎng)絡(luò),TextCNN Concat模型 輸入是tag,prefix,title,query_prediction(query_prediction對(duì)其進(jìn)行拆分成10條,查詢?cè)~為文本,查詢?cè)~概率為權(quán)重)+特征工程中的統(tǒng)計(jì)特征, 接著將所有基礎(chǔ)的文本特征通過(guò)TextCNN來(lái)提取,非文本特征通過(guò)全連接層來(lái)提取,上述幾部分結(jié)合作為最終的特征層。由于模型過(guò)于簡(jiǎn)單,并沒(méi)有特征之間(title,prefix)的深層次關(guān)聯(lián),導(dǎo)致效果很一般。
因?yàn)橹挥肨extCNN結(jié)構(gòu)的網(wǎng)絡(luò)缺少prefix和title之間相似度的衡量,所以另外加了孿生網(wǎng)絡(luò)或偽孿生網(wǎng)絡(luò)來(lái)度量prefix和title之間相似度,以及prefix和query,title和query之間的相似度,并同樣加入統(tǒng)計(jì)概率作為權(quán)重
實(shí)驗(yàn)結(jié)果發(fā)現(xiàn),由于prefix和title的長(zhǎng)度有一些差別,反而用偽孿生網(wǎng)絡(luò)比孿生網(wǎng)絡(luò)取得了更好一些的效果,所以在上述模型中,prefix,title和query_prediction中并沒(méi)有用共享權(quán)值(偽孿生網(wǎng)絡(luò))。該模型結(jié)合了TextCNN,DeepFM,AFM等相關(guān)操作。
具體流程如下: 輸入分為兩部分,對(duì)于prefix,title和query_prediction進(jìn)行TextCNN操作提取文本特征,tag和統(tǒng)計(jì)特征通過(guò)全連接層獲取對(duì)應(yīng)的Embedding特征。
接著一部分是DeepFM模型,來(lái)獲取淺層特征和交叉特征,其中query_prediction的統(tǒng)計(jì)概率作為query文本向量的權(quán)重。
另外一部分是AFM相關(guān)操作,就是Bi-Interaction Pooling && Attention,對(duì)每?jī)蓛蒄ield的文本特征向量進(jìn)行交叉,由于不同文本向量交叉的特征重要性不同,所以此處加入Attention,簡(jiǎn)單來(lái)說(shuō)就是對(duì)不同文本向量交叉的特征加權(quán)平均得到向量再放入Deep層進(jìn)行更深層次的訓(xùn)練。
主要進(jìn)行了以上幾種深度學(xué)習(xí)模型,經(jīng)過(guò)試驗(yàn)對(duì)比,嘗試3能取得最好的效果,但由于數(shù)據(jù)量不是特別大,并沒(méi)有取得比LightGBM模型更好的效果,雖然該模型與LightGBM模型融合有所提高,但是作為NN模型在200萬(wàn)規(guī)模的數(shù)據(jù)集上穩(wěn)定性不夠強(qiáng),結(jié)果值會(huì)產(chǎn)生一定的波動(dòng),且模型受限于2個(gè),所以最終提交的成績(jī)并沒(méi)有使用該模型。
我們最終融合方案也比較簡(jiǎn)單,主要進(jìn)行加權(quán)融合,權(quán)重的確定看的是線下分?jǐn)?shù)。
6. 思考總結(jié)
優(yōu)點(diǎn):
能夠?qū)?shù)據(jù)和業(yè)務(wù)經(jīng)過(guò)細(xì)致的分析,挖掘更深層次的特征,更好的描述實(shí)體關(guān)系。
在模型方面僅使用穩(wěn)定性比較高的LightGBM,并且具有很好的解釋性。
從特征提取到模型訓(xùn)練僅使用三個(gè)小時(shí)完成,可以更高效的生成結(jié)果。
單模型取得top2的成績(jī),從特征提取到模型訓(xùn)練可以短時(shí)間完成。
不足:
為了保證模型的泛化性沒(méi)有對(duì)特征集合進(jìn)行精細(xì)選擇,從而損失一定的準(zhǔn)確性。
沒(méi)有構(gòu)造出較大差異性的第二模型,導(dǎo)致最終成績(jī)?cè)趩文?.7486的成績(jī)上未能
獲得很大的提升。
歡迎指正與交流,有問(wèn)題直接加作者qq418811687。
Github鏈接:
https://github.com/fanfanda/OGeek-Competition
可以“閱讀原文”進(jìn)入作者知乎查看。
請(qǐng)關(guān)注和分享↓↓↓?
機(jī)器學(xué)習(xí)初學(xué)者
QQ群:727137612
(注意:本站有7個(gè)qq群,加入過(guò)任何一個(gè)的不需要再加)
本站的知識(shí)星球ID:92416895
往期精彩回顧
良心推薦:機(jī)器學(xué)習(xí)入門(mén)資料匯總及學(xué)習(xí)建議(2018版)
黃海廣博士的github鏡像下載(機(jī)器學(xué)習(xí)及深度學(xué)習(xí)資源)
吳恩達(dá)老師的機(jī)器學(xué)習(xí)和深度學(xué)習(xí)課程筆記打印版
機(jī)器學(xué)習(xí)小抄-(像背托福單詞一樣理解機(jī)器學(xué)習(xí))
首發(fā):深度學(xué)習(xí)入門(mén)寶典-《python深度學(xué)習(xí)》原文代碼中文注釋版及電子書(shū)
科研工作者的神器-zotero論文管理工具
機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)
機(jī)器學(xué)習(xí)必備寶典-《統(tǒng)計(jì)學(xué)習(xí)方法》的python代碼實(shí)現(xiàn)、電子書(shū)及課件
吐血推薦收藏的學(xué)位論文排版教程(完整版)
機(jī)器學(xué)習(xí)入門(mén)的百科全書(shū)-2018年“機(jī)器學(xué)習(xí)初學(xué)者”公眾號(hào)文章匯總
Python環(huán)境的安裝(Anaconda+Jupyter notebook+Pycharm)
總結(jié)
以上是生活随笔為你收集整理的TIANCHI天池-OGeek算法挑战赛-完整方案及代码(亚军)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: NLP研究方向的「情感分析领域」的简单调
- 下一篇: 深入了解数据人才 | 中国数据人才白皮书