免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

Kaggle大神帶你上榜單Top2%:點(diǎn)擊預(yù)測(cè)大賽紀(jì)實(shí)(上)

 萬皇之皇 2017-12-19

大數(shù)據(jù)文摘作品

作者:Gabriel Moreira

編譯:朝夕、Katherine Hou、黨曉芊、Niki、元元、錢天培


作為全世界最知名的數(shù)據(jù)挖掘、機(jī)器學(xué)習(xí)競(jìng)賽平臺(tái),Kaggle早已成為數(shù)據(jù)玩家在學(xué)習(xí)了基礎(chǔ)機(jī)器學(xué)習(xí)之后一試身手的練兵場(chǎng)。


那么,參加Kaggle比賽到底是怎樣一種體驗(yàn)?zāi)??Kaggle比賽的愛好者們不計(jì)其數(shù),很顯然這些比賽不會(huì)是簡(jiǎn)單枯燥的模型調(diào)參。


更進(jìn)一步地問,Kaggle比賽的優(yōu)勝者們又是如何取得優(yōu)異的成績(jī)的呢??jī)?yōu)質(zhì)的算法對(duì)大多數(shù)Kaggle競(jìng)賽來說顯然不是制勝法寶——SVM、隨機(jī)森林、神經(jīng)網(wǎng)絡(luò)等的應(yīng)用對(duì)多數(shù)參賽者都不是難事,而改進(jìn)甚至發(fā)明新算法似乎也更屬于學(xué)術(shù)研究的范疇。


今天,文摘菌將為大家介紹一位資深數(shù)據(jù)科學(xué)家Gabriel參加Kaggle的Outbrain點(diǎn)擊預(yù)測(cè)比賽的經(jīng)歷。相信大家在讀完他的比賽經(jīng)歷后,會(huì)對(duì)Kaggle比賽有更深一步的了解,也能一窺大神在Kaggle比賽中取得優(yōu)異成績(jī)背后的秘密。


2017年1月18日的午夜,Outbrain點(diǎn)擊預(yù)測(cè)機(jī)器學(xué)習(xí)競(jìng)賽剛剛結(jié)束。在此之前,我連續(xù)三個(gè)半月工作到深夜。當(dāng)我翻閱排行榜(leaderboard)頁面時(shí),我發(fā)現(xiàn)我的名字在第19位,在將近1000名參賽者中排在前2%。而這只是我參加的第一個(gè)Kaggle比賽!



這項(xiàng)Kaggle競(jìng)賽是由Outbrain贊助的。Outbrain是一家廣告公司,這家公司每個(gè)月將上千家網(wǎng)站上相關(guān)的內(nèi)容與讀者匹配,提供2500億條個(gè)性化推薦。在這個(gè)競(jìng)賽中,參賽者們的挑戰(zhàn)是要預(yù)測(cè)全球用戶群體將點(diǎn)擊哪些廣告或者其他形式的贊助內(nèi)容。Outbrain運(yùn)營(yíng)一個(gè)發(fā)布者和廣告商的關(guān)系網(wǎng)。比如說,在下面的圖片中,CNN(發(fā)布者)在新聞頁面中將贊助內(nèi)容(廣告)呈現(xiàn)給用戶。


圖中標(biāo)注(從左到右,從上到下):

來源,發(fā)布者,文檔,

推廣內(nèi)容區(qū)域,

推廣內(nèi)容模塊


這個(gè)競(jìng)賽要求參賽者能夠準(zhǔn)確地對(duì)推薦內(nèi)容按照點(diǎn)擊率預(yù)測(cè)值進(jìn)行排序。點(diǎn)擊率(Click-Through Rate, CTR)預(yù)測(cè)與像電子商務(wù)和廣告這樣的行業(yè)息息相關(guān),因?yàn)橛脩艮D(zhuǎn)化率的微小提升可能帶來利潤(rùn)的巨大增長(zhǎng),同時(shí)帶來更好的用戶體驗(yàn)。


數(shù)據(jù)集和基礎(chǔ)架構(gòu)


競(jìng)賽中的一大難點(diǎn)是要處理龐大的數(shù)據(jù)集:來自560個(gè)網(wǎng)站的7億個(gè)獨(dú)立用戶,20億次頁面瀏覽量和大約1700萬次點(diǎn)擊記錄。其中包括2016年6月14日到6月28日在美國(guó)多個(gè)新聞網(wǎng)站觀測(cè)到的用戶的頁面瀏覽和點(diǎn)擊樣本。


考慮到這是一個(gè)大型的關(guān)系數(shù)據(jù)庫(kù),且其中一些數(shù)據(jù)表比內(nèi)存還大,Apache Spark非常適合用來做數(shù)據(jù)探索和快速分布式的預(yù)處理。谷歌云平臺(tái)提供了我需要的存儲(chǔ)和分布式處理的主要組件。


用Google Cloud Dataproc(谷歌云數(shù)據(jù)處理)管理服務(wù)可以很容易地部署一個(gè)Spark集群。我發(fā)現(xiàn)1個(gè)主進(jìn)程和8個(gè)工作進(jìn)程節(jié)點(diǎn)的“n1-highmem-4”型集群(大約相當(dāng)于4核CPU和16GB內(nèi)存)能夠在一個(gè)小時(shí)左右的時(shí)間里處理所有的競(jìng)賽數(shù)據(jù),其中包括合并大的表、變換特征以及存儲(chǔ)向量。


我主要的開發(fā)環(huán)境是Jupyter notebook,一個(gè)非常高效的Python界面。這個(gè)谷歌云平臺(tái)的教程介紹了如何在數(shù)據(jù)處理主節(jié)點(diǎn)上設(shè)置Jupyter,并使用PySpark庫(kù)。


Dataproc Spark集群利用谷歌云存儲(chǔ)(Google Cloud Storage, GCS)作為分布式文件系統(tǒng)而非通常默認(rèn)使用的HDFS。作為一個(gè)管理存儲(chǔ)(Managed storage)方式,它使得實(shí)例間的大型文件的傳輸和存儲(chǔ)更加便利。Spark能夠直接使用GCS中的數(shù)據(jù)做分布式處理。


我還使用了一些機(jī)器學(xué)習(xí)框架(比如FTRL, FFM, GBM等),這些框架是基于并行計(jì)算而非分布式計(jì)算的,所以它們需要用到高CPU核數(shù)和大內(nèi)存來處理大型數(shù)據(jù)集。部署在Google計(jì)算引擎(Google Compute Engine, GCE)上的一個(gè)’n1-highmem-32’型實(shí)例(32核CPU和256GB內(nèi)存)使得運(yùn)行時(shí)間縮短到1個(gè)小時(shí)以內(nèi)。由于數(shù)據(jù)處理過程為I/O密集型,我將SSD硬盤接到實(shí)例上以避免瓶頸。


初次嘗試


這次競(jìng)賽的評(píng)價(jià)算法是MAP@12(點(diǎn)擊率前12位廣告平均精準(zhǔn)度),這個(gè)指標(biāo)用來衡量的是廣告排序的質(zhì)量。換句話說,這個(gè)算法評(píng)估的是實(shí)際高點(diǎn)擊率的廣告是否被模型排在了前面。


常識(shí)告訴我們,廣告的平均流行程度可能可以很好的預(yù)測(cè)是新點(diǎn)擊量。這個(gè)方法的主要思路是按照降序的點(diǎn)擊率(CTR,點(diǎn)擊量/瀏覽量)對(duì)展示給用戶的廣告進(jìn)行排序。


在下面的Python代碼片段中,我將展示如何用PySpark從訓(xùn)練數(shù)據(jù)集 (click_trains.csv) 計(jì)算廣告點(diǎn)擊率。這個(gè)CSV文件有超過8700萬行,存儲(chǔ)于GCS。完整的代碼在Dataproc Spark集群中用8個(gè)工作節(jié)點(diǎn)能夠在30秒內(nèi)運(yùn)行完。


把訓(xùn)練數(shù)據(jù) (click_trains.csv) 加載到一個(gè)Spark DataFrame內(nèi),并計(jì)算行數(shù)。


得到不重復(fù)的廣告數(shù)量


在下一段代碼片段中,我用廣告編號(hào)分組,計(jì)算了每組的點(diǎn)擊量和瀏覽量,并由此定義了一個(gè)新的DataFrame。我用了一個(gè)叫ctr_udf的用戶自定義函數(shù)(User Defined Function, UDF)計(jì)算點(diǎn)擊量。這個(gè)片段輸出的結(jié)果是一個(gè)包含10個(gè)廣告的數(shù)據(jù)表,內(nèi)容為廣告編號(hào)及對(duì)應(yīng)的點(diǎn)擊量,瀏覽量和點(diǎn)擊率。


計(jì)算廣告平均點(diǎn)擊率


為了提高點(diǎn)擊率的可信度,我們只考慮超過5次瀏覽的廣告。我們用collectAsMap()函數(shù),把分布式的數(shù)據(jù)集轉(zhuǎn)換成一個(gè)內(nèi)存內(nèi)的可供查詢的字典,字典的鍵是廣告編號(hào),值是對(duì)應(yīng)的平均點(diǎn)擊率。


這是大多數(shù)參賽者提交的基準(zhǔn)線,即使沒有用任何機(jī)器學(xué)習(xí)算法,這個(gè)方法仍然可以得到MAP@12為0.637的成績(jī)。作為參考,官方的競(jìng)賽基線是按照廣告編號(hào)排序(近似于隨機(jī)方法),得到的MAP@12是0.485。因此,這個(gè)原始方法已經(jīng)能很好地預(yù)測(cè)點(diǎn)擊率了。


數(shù)據(jù)分析


和往常一樣,在應(yīng)用任何機(jī)器學(xué)習(xí)技術(shù)之前,很重要的過程是要分析數(shù)據(jù),并且做出假設(shè),哪些特征和算法會(huì)對(duì)解決這個(gè)問題有幫助。我用PySpark對(duì)最大的數(shù)據(jù)集(page_views.csv ~ 100GB)做了探索性數(shù)據(jù)分析(Exploratory Data Analysis, EDA)。


我的探索性分析核(Kernel)介紹了如何用Python,Spark SQL和Jupyter Notebook在谷歌Dataproc平臺(tái)上分析競(jìng)賽提供的最大的數(shù)據(jù)集。我把這個(gè)內(nèi)核分享給了其他參賽者,最終這個(gè)核被票選為受歡迎程度排名第二的貢獻(xiàn)(金牌)。根據(jù)核下面的評(píng)論,我發(fā)現(xiàn)許多參賽者都在考慮在機(jī)器學(xué)習(xí)競(jìng)賽中使用谷歌Dataproc和Spark。


在分析時(shí),我通過合并page_views數(shù)據(jù)集和訓(xùn)練集與測(cè)試集(events.csv),找到從數(shù)據(jù)集中提取數(shù)據(jù)值的方法。比如,在如下所示的累積圖表中,我們可以看到有65%的用戶只有一次頁面瀏覽,77%的用戶有最多兩次瀏覽,89%的用戶有最多5次瀏覽。

最多瀏覽了N次頁面的用戶累積百分比


這是一個(gè)典型的“冷啟動(dòng)”現(xiàn)象,我們對(duì)大多數(shù)用戶知之甚少,卻需要預(yù)測(cè)他們會(huì)點(diǎn)擊哪個(gè)推薦內(nèi)容。


通常,傳統(tǒng)的推薦系統(tǒng)技術(shù),例如協(xié)調(diào)過濾和基于內(nèi)容過濾,在這樣的情況下會(huì)失效。我的策略是采取另一種機(jī)器學(xué)習(xí)算法,讓我們能夠利用用戶行為和推薦贊助內(nèi)容的上下文信息。


特征工程


特征工程是指選擇或創(chuàng)建機(jī)器學(xué)習(xí)中需要用到的正確的特征的重要步驟。通常,根據(jù)數(shù)據(jù)復(fù)雜度不同,特征工程可能占到所有工作內(nèi)容的80%。下面的圖片展示了競(jìng)賽的原始數(shù)據(jù)模型,其中特征的數(shù)據(jù)類型用顏色進(jìn)行了區(qū)分。


Outbrain 點(diǎn)擊預(yù)測(cè)大型關(guān)系數(shù)據(jù)庫(kù)


所有的分類型字段最初都是整數(shù)形式的。依據(jù)機(jī)器學(xué)習(xí)算法,序數(shù)值型的編號(hào)會(huì)讓模型認(rèn)為一個(gè)類型比另一個(gè)類型有更大的關(guān)聯(lián)。例如,阿根廷的編號(hào)是1,巴西的是2,算法會(huì)推測(cè)巴西的代表性是阿根廷的兩倍。為了處理這個(gè)問題,通常會(huì)使用諸如單熱編碼(One-Hot Encoding, OHE)的技巧,這種方法會(huì)把每個(gè)分類轉(zhuǎn)換成一個(gè)稀疏的向量。在這個(gè)稀疏的向量中,除了編號(hào)值對(duì)應(yīng)的位置,其他位置都是0。


對(duì)于有大量唯一值的分類型特征來說,另一個(gè)很流行的技巧特征哈?;‵eature Hashing),這一方法將分類與一個(gè)固定長(zhǎng)度的向量通過哈希函數(shù)匹配。這種方法相較于單熱編碼提供了更低的稀疏度和更高的壓縮度,而且對(duì)新的少見的分類值(比如之前未出現(xiàn)過的用戶代理商)也能處理得很好。當(dāng)把多個(gè)特征匹配于相同的向量位置時(shí),它也會(huì)產(chǎn)生一些沖突,不過機(jī)器學(xué)習(xí)算法通常在處理這些沖突時(shí)足夠穩(wěn)健。我在處理數(shù)據(jù)時(shí)同時(shí)用了這兩種方法。


我還對(duì)數(shù)值型標(biāo)量特征做了分箱(Binning)操作。有些特征的噪聲很大,所以我們最好用數(shù)據(jù)變換的方法降低微小觀測(cè)單位帶來的誤差和偏差。例如,我把“小時(shí)”這個(gè)變量分箱處理成了不同時(shí)段如早晨,中午,下午,晚上等,因?yàn)槲壹僭O(shè)用戶在比如上午十點(diǎn)和上午十一點(diǎn)的行為差異不會(huì)特別大。


對(duì)于長(zhǎng)尾分布的變量,比如用戶瀏覽次數(shù),大多數(shù)用戶只有一次頁面瀏覽記錄,少量用戶有大量瀏覽記錄。采用像對(duì)數(shù)(log(1 + 瀏覽次數(shù)))這樣的變換能夠使分布平滑。一個(gè)有1000次瀏覽量的用戶可能和有500次瀏覽量的用戶沒有太大差別,他們都是模型的異常值。


標(biāo)準(zhǔn)化和正態(tài)化對(duì)于大多數(shù)用比如梯度下降這樣的優(yōu)化方法的機(jī)器學(xué)習(xí)算法來說也很重要。通常,對(duì)值和方差數(shù)量級(jí)不同的幾個(gè)原始數(shù)值型特征,只有基于決策樹的模型是穩(wěn)健的。


基于探索性分析,我對(duì)數(shù)據(jù)特征的一定的認(rèn)識(shí),也檢驗(yàn)了一些的假設(shè)。我在競(jìng)賽數(shù)據(jù)提供的原始特征外,為我的機(jī)器學(xué)習(xí)模型創(chuàng)建了一些特征,也通過轉(zhuǎn)換數(shù)據(jù)得到了一些特征。下面是一部分我新建特征。


用戶相關(guān)特征


user_has_already_viewed_doc

記錄用戶是否已經(jīng)瀏覽過向他們推薦的頁面。


user_views_count

熱心讀者的行為是否與其他客戶不同?讓我們加入這個(gè)特征,讓機(jī)器學(xué)習(xí)模型給出答案。


user_views_categories, user_views_topics, user_views_entities

用戶特征指標(biāo)包括客戶之前瀏覽過的內(nèi)容分類、主題和頁面內(nèi)容(按照置信度和詞頻-逆向文件頻率來分配權(quán)重),通過對(duì)內(nèi)容的篩選來對(duì)客戶偏好進(jìn)行建模。


user_avg_views_of_distinct_docs

(客戶瀏覽去重文檔數(shù)/客戶總瀏覽次數(shù))得到的比率,用來定義客戶重復(fù)閱讀網(wǎng)頁的頻率。


廣告/文檔相關(guān)特征


doc_ad_days_since_published, doc_event_days_since_published

廣告對(duì)特定用戶已經(jīng)發(fā)布的天數(shù)。普遍的共識(shí)是用戶對(duì)新的內(nèi)容更感興趣。但是如果你正在讀一篇舊報(bào)道,你很可能對(duì)其他舊新聞也感興趣。


doc_avg_views_by_distinct_users_cf

客戶對(duì)廣告網(wǎng)頁的平均瀏覽量。用戶常常登陸這個(gè)網(wǎng)站嗎?


ad_views_count, doc_views_count

指示某個(gè)文檔或者廣告的受歡迎程度。


事件相關(guān)特征


event_local_hour (已分箱), event_weekend?—事件發(fā)生的時(shí)間戳都是美國(guó)東部時(shí)間,我根據(jù)事件的地理位置調(diào)整得到用戶的當(dāng)?shù)貢r(shí)間。然后按照上午,下午,中午,晚上,夜里等時(shí)間段進(jìn)行分箱。同時(shí)我創(chuàng)建了另一個(gè)特征來表示是否是周末。我假設(shè)時(shí)間會(huì)影響到客戶對(duì)閱讀內(nèi)容的選取。


event_country, event_country_state

我從event_geolocation這個(gè)變量中提取出用戶所在的國(guó)家和省份


ad_id, doc_event_id, doc_ad_id, ad_advertiser, …?

模型中所有原始的分類數(shù)據(jù)都使用單熱編碼,因此特征擴(kuò)展到了12萬6千個(gè)。


平均點(diǎn)擊率


avg_ctr_ad_id, avg_ctr_publisher_id, avg_ctr_advertiser_id, avg_ctr_campain_id, avg_ctr_entity_id_country …

基于一些分類組合和點(diǎn)擊率置信度(詳見之后的第二篇)的平均點(diǎn)擊率(點(diǎn)擊次數(shù)/瀏覽次數(shù))。比如點(diǎn)擊某兩個(gè)分類的概率。


內(nèi)容的相似度


這些特征使用詞頻-逆向文件頻率(TF-IDF)技術(shù)為用戶和頁面建立特征參數(shù),對(duì)客戶喜好和內(nèi)容分別建模。然后利用余弦相似性對(duì)比所有候選文檔與客戶喜好的相似程度。這是一種非常普遍的基于兩個(gè)向量之間夾角,忽略向量量級(jí)的信息檢索方法。

user_doc_ad_sim_categories, user_doc_ad_sim_topics, user_doc_ad_sim_entities

計(jì)算客戶信息和廣告內(nèi)容這兩個(gè)向量的余弦相似度。


doc_event_doc_ad_sim_categories, doc_event_doc_ad_sim_topics, doc_event_doc_ad_sim_entities

計(jì)算事件信息(頁面內(nèi)容)和廣告內(nèi)容這兩個(gè)向量的余弦相似度(TF-IDF)。


我們根據(jù)自己的假設(shè)創(chuàng)建了一些可能會(huì)影響用戶對(duì)點(diǎn)擊內(nèi)容選擇的特征。數(shù)據(jù)已經(jīng)準(zhǔn)備好了,可以開始機(jī)器學(xué)習(xí)建模了!


交叉驗(yàn)證


對(duì)一個(gè)機(jī)器學(xué)習(xí)模型而言,能不能把從訓(xùn)練集得到的規(guī)律推廣到訓(xùn)練集之外的數(shù)據(jù)是非常重要的。交叉驗(yàn)證(Cross-Validation)就是確保這種推廣能力的重要一步。


把原始的訓(xùn)練集clicks_train.csv按照一定比例分成驗(yàn)證集和新的訓(xùn)練集很有必要。驗(yàn)證集占原數(shù)據(jù)集的30%,其余部分是新的訓(xùn)練集。機(jī)器學(xué)習(xí)的訓(xùn)練過程是這樣的,先通過訓(xùn)練集找到模型,然后用該模型對(duì)驗(yàn)證集作出預(yù)測(cè),將預(yù)測(cè)值與驗(yàn)證集中的已知結(jié)論(是否被點(diǎn)擊)進(jìn)行對(duì)比,以評(píng)估模型的準(zhǔn)確性。


我們通過嘗試不同的特征工程,改進(jìn)算法和超參數(shù)調(diào)整這樣的方法,提高用交叉驗(yàn)證的方法得到的準(zhǔn)確率,從而使我們?cè)诟?jìng)賽排行榜上的排名逐漸提高(這其實(shí)也就是增加了用測(cè)試集得到的結(jié)果的準(zhǔn)確率)。


大部分的Kaggle競(jìng)賽,對(duì)于當(dāng)天提交結(jié)果的次數(shù)是有限制的(對(duì)于本次競(jìng)賽,這個(gè)上限是2次/每天)。我們通過交叉驗(yàn)證的方法,也可無限次的檢驗(yàn)我們的模型,不用擔(dān)心這個(gè)限制。


對(duì)于這次競(jìng)賽,我使用的交叉驗(yàn)證方法叫做holdout,這種方法就是簡(jiǎn)單地從原訓(xùn)練集中取固定的一部分作為驗(yàn)證集。此外,還有一些其它常用的交叉驗(yàn)證的方法,比如說k重選擇法。


對(duì)于基于人類行為的機(jī)器學(xué)習(xí)模型,時(shí)間因素也是一個(gè)評(píng)價(jià)模型需要考慮的重要指標(biāo)。有很多數(shù)據(jù)特征會(huì)隨著時(shí)間的變化對(duì)用戶產(chǎn)生新的影響,就像近因效應(yīng),搜索趨勢(shì)還有某些真實(shí)世界發(fā)生的事情等。


如下圖所示,我們觀察到訓(xùn)練和測(cè)試集的數(shù)據(jù)在15天內(nèi),隨時(shí)間分布的圖表。大約有一半的測(cè)試數(shù)據(jù)(來自clicks_test.csv數(shù)據(jù)集)和訓(xùn)練集的數(shù)據(jù)是在同一天進(jìn)行采樣(同步采樣),而另一半的測(cè)試數(shù)據(jù)是在緊隨其后的兩天內(nèi)采樣,以此作為對(duì)于未來的預(yù)測(cè)(非同步采樣)。


訓(xùn)練和測(cè)試集數(shù)據(jù)按天數(shù)的比例分布。數(shù)據(jù)來源于joconnor EDA kernel


基于上述的觀察,我的交叉驗(yàn)證策略如下:我的驗(yàn)證集將采取和測(cè)試集一樣的時(shí)間分布。在下面的代碼片段,你會(huì)看到這種分層抽樣可以很簡(jiǎn)單的通過Spark SQL Dataframe實(shí)現(xiàn)(Spark集群是部署在Google Dataproc上面的)。對(duì)于驗(yàn)證集,除了最后兩天抽取全部的事件外(11和12),其余每天僅僅抽樣數(shù)據(jù)的20%。


基于日期的分層取樣。使用SparkDataframe (Python)


這種精心設(shè)計(jì)的對(duì)于驗(yàn)證集的取樣,在模型訓(xùn)練的時(shí)候很有幫助,因?yàn)槲业慕徊骝?yàn)證得到的分?jǐn)?shù)與排行榜上的分?jǐn)?shù)在四位有效數(shù)字上保持一致。這樣,我可以放心的以我的交叉驗(yàn)證分?jǐn)?shù)作參考進(jìn)行模型的優(yōu)化,然后只有提交顯著提高的模型。


基線模型的預(yù)測(cè)結(jié)果


截至到目前,我用了非常大的精力進(jìn)行試探性數(shù)據(jù)分析,特征工程以及實(shí)現(xiàn)前文所說的交叉驗(yàn)證策略。以我的經(jīng)驗(yàn),處理這些任務(wù)會(huì)花費(fèi)掉整個(gè)機(jī)器學(xué)習(xí)工程的60%-80%的時(shí)間。但是,如果這些前期步驟沒有做對(duì)或者做好,它們會(huì)大大削弱你的模型可能達(dá)到的最大預(yù)測(cè)精度。


現(xiàn)在讓我們換一套想法,開始討論一下模型訓(xùn)練的算法。我的策略注重個(gè)人的學(xué)習(xí)過程,我從最簡(jiǎn)單的模型開始測(cè)試,逐步驗(yàn)證到最強(qiáng)大最前沿的算法,這一樣來我們就可以知道對(duì)于這個(gè)挑戰(zhàn)每種算法預(yù)測(cè)準(zhǔn)確度的上限。


我的第一個(gè)方法已經(jīng)在之前介紹過了,就是簡(jiǎn)單地使用過去的點(diǎn)擊率來對(duì)廣告進(jìn)行排行,這個(gè)方法并不涉及機(jī)器學(xué)習(xí)算法。對(duì)于大多數(shù)競(jìng)賽參與者來說,這是個(gè)非常流行的基線模型,以MAP@12 作為指標(biāo),它在排行榜上給出了0.637的分?jǐn)?shù)。


Kaggle社區(qū)在分享經(jīng)驗(yàn)和方法方面很活躍,即使是在比賽進(jìn)行的階段依然如此。有一位競(jìng)賽參與者在社區(qū)里分享了他發(fā)現(xiàn)的數(shù)據(jù)泄露。這個(gè)數(shù)據(jù)泄露是基于對(duì)page_views.csv數(shù)據(jù)集的分析,揭露了在測(cè)試集中4%的用戶訪問(通過display_ids確定)實(shí)際點(diǎn)擊的廣告。作為一個(gè)機(jī)器學(xué)習(xí)競(jìng)賽來說,分享數(shù)據(jù)泄露是一個(gè)公平的做法,同時(shí)還提供了一個(gè)新的基線模型。我的第二個(gè)方法就是在第一個(gè)方案的基礎(chǔ)上,僅僅調(diào)整了泄露出來的廣告排名,把它們放到別的廣告之前。這樣一來我的分?jǐn)?shù)就一下子上漲到0.65317。和其他競(jìng)賽參與者一樣,我在之后提交的所有結(jié)果都使用了這個(gè)數(shù)據(jù)泄露。


大多數(shù)廣告由于被觀看到的次數(shù)太少(小于10次),從而無法進(jìn)行有效地統(tǒng)計(jì)點(diǎn)擊率。我的直覺是,通過其他分類變量對(duì)點(diǎn)擊率影響的先驗(yàn)知識(shí),可以對(duì)無法觀察到的數(shù)據(jù)進(jìn)行預(yù)測(cè)。這樣,當(dāng)我計(jì)算平均點(diǎn)擊率的時(shí)候,我不單單只考慮廣告編號(hào)的影響,還同時(shí)考慮了其他分類變量對(duì)點(diǎn)擊率的作用。這就是條件概率P(click | category),甚至是兩個(gè)不同的分類變量對(duì)點(diǎn)擊率的協(xié)同作用:P(click | category1, category2)。


在交叉驗(yàn)證中平均點(diǎn)擊率預(yù)測(cè)準(zhǔn)確度更高的的分類變量分別為:


ad_document_id, ad_source_id, ad_publisher_id, ad_advertiser_id, ad_campain_id,


文檔特征 (category_ids, topics_ids, entities_ids) 和上述幾個(gè)變量與event_country_id的結(jié)合。結(jié)合event_country_id的分類變量可以用來模擬各區(qū)域用戶的偏好。


點(diǎn)擊率置信度(CTR confidence)是我在這次競(jìng)賽中設(shè)計(jì)的衡量標(biāo)準(zhǔn),用于衡量分類點(diǎn)擊率預(yù)測(cè)某一特定廣告點(diǎn)擊率的準(zhǔn)確性。


點(diǎn)擊率置信度


在這個(gè)公式中,d代表某一類別中不同廣告的數(shù)量,v代表這些廣告的閱覽量。d的值越高意味著這個(gè)分類對(duì)于某個(gè)特定的廣告太寬泛(比如“主題=政治”),從而導(dǎo)致點(diǎn)擊率置信度較低。


一個(gè)高的v值代表相應(yīng)類別的廣告有很高的閱覽量,從而增加了點(diǎn)擊率的統(tǒng)計(jì)顯著性。比如說,某一特定廣告的點(diǎn)擊率(分類值)可能相比之前采用的廣告商的點(diǎn)擊率(更高的d值)更加準(zhǔn)確。因此,可能這個(gè)廣告沒有足夠的閱覽量達(dá)到統(tǒng)計(jì)顯著性(v<>


對(duì)數(shù)轉(zhuǎn)換同樣也被用來平滑處理一些流行的類別或廣告。最后,我們通過除以m來是特征標(biāo)準(zhǔn)化,使得取值范圍在0到1之間。這是不同廣告的平均瀏覽量(v/d)的一個(gè)參考值,其最大置信度為1。在這次比賽中我用m=100,000。


第三種方法是對(duì)每一個(gè)類別的點(diǎn)擊率的加權(quán)平均,權(quán)重為相應(yīng)的點(diǎn)擊率置信度。這種方法讓我的排行榜分值增加到0.65498.


手動(dòng)計(jì)算這些基線預(yù)測(cè)值后,就可以開始運(yùn)用機(jī)器學(xué)習(xí)的算法來處理這些問題了。


機(jī)器學(xué)習(xí)模型


在這一小節(jié)我將展示我在這次挑戰(zhàn)中嘗試的第一個(gè)機(jī)器學(xué)習(xí)模型:協(xié)同過濾和樹集成。


協(xié)同過濾 – ALS 矩陣分解


協(xié)同過濾可能是推薦系統(tǒng)中最常見的方法。這種方法通過收集其他用戶的喜好或品味的相關(guān)信息(協(xié)同)來預(yù)測(cè)用戶的喜好從而提供個(gè)性化的建議(過濾)。因此,這種方法也自然是第一個(gè)被評(píng)估的。


交替最小二乘(ALS)矩陣分解作為以模型為基礎(chǔ)的協(xié)同過濾方法可應(yīng)用于用戶龐大的信息矩陣。我們使用了Spark交替最小二乘的應(yīng)用,它的突出點(diǎn)在于在一個(gè)群集之中分布運(yùn)行,同時(shí)也支持了內(nèi)在的反饋數(shù)據(jù)(例如,閱覽量,點(diǎn)擊量,購(gòu)買,點(diǎn)贊和分享)和外在的反饋數(shù)據(jù)(例如,電影或書的評(píng)分)。


第一步是去建立一個(gè)稀疏的用戶和文件的效用矩陣(內(nèi)容頁代表每個(gè)廣告)。矩陣中包含每個(gè)用戶對(duì)每個(gè)文件的瀏覽量。對(duì)數(shù)轉(zhuǎn)換在平滑瀏覽量中十分關(guān)鍵,因?yàn)橐恍┯脩簦ɑ驒C(jī)器)在競(jìng)賽提供的十五天的數(shù)據(jù)中瀏覽過同一網(wǎng)站多次。


多次嘗試調(diào)整Spark交替最小二乘矩陣分解中的超參數(shù)后,我發(fā)現(xiàn)最好的模型(見下圖)在交叉驗(yàn)證中平均精度均值(MAP score)有0.56116,比之前的基準(zhǔn)值低很多。因此,我最后的集成解決方法中沒有采用這個(gè)模型。


導(dǎo)致糟糕的結(jié)果的一個(gè)可能的原因是“冷啟動(dòng)”,在兩百萬多頁中平均閱覽量只有2.5,這使協(xié)同過濾的方式去推斷用戶偏好并完成這樣大卻稀疏的矩陣十分困難。


Spark交替最小二乘模型訓(xùn)練(Python)


梯度提升決策樹


標(biāo)準(zhǔn)的協(xié)同過濾只采用了用戶和文件之間的效用矩陣。但這次比賽中還有大量關(guān)于用戶訪問內(nèi)容,登錄頁面和廣告的信息。因此,我們用一種排序?qū)W習(xí)的方法來利用這些信息。


我采用的是梯度提升決策樹模型(GBDT)。這個(gè)機(jī)器學(xué)習(xí)模型是一個(gè)由多個(gè)決策樹(弱學(xué)習(xí)器)組成的集成模型。跟隨機(jī)森林(RF)相似,為了得到不同視角下數(shù)據(jù)的模型,每個(gè)決策樹是通過一個(gè)訓(xùn)練集組成的子樣本(又稱套袋法)和其屬性的子樣本(隨機(jī)選取部分特征) 得到的。與隨機(jī)森林模型不同的是,GBDT模型對(duì)訓(xùn)練集中在前一個(gè)樹模型分類錯(cuò)誤的樣本權(quán)重更高,從而使提高模型的精確度,也使模型成為更穩(wěn)健的分類器。


我測(cè)試了兩個(gè)GBDT框架:XGBoost和LightGBM,它們應(yīng)用在大的數(shù)據(jù)庫(kù)上速度快、所需儲(chǔ)存空間小。在我們所遇到的問題中,它們能夠著重最優(yōu)化某次用戶訪問(由display_id確定)看到的廣告排行,而不是去預(yù)測(cè)每個(gè)廣告是否被點(diǎn)擊。以排行為目的XGBoost方法基于平均精度均值(MAP)的標(biāo)準(zhǔn)(官方的衡量標(biāo)準(zhǔn))進(jìn)行最優(yōu)化學(xué)習(xí)。LightGBM是基于另一個(gè)叫NDCG的標(biāo)準(zhǔn)進(jìn)行最優(yōu)化。


XGBoost模型中的特征,在第一個(gè)帖子中已經(jīng)有詳細(xì)介紹,分別為:類別的獨(dú)熱編碼,各種分類下的平均點(diǎn)擊率和其置信度,上下文相似度(登錄頁面中的分類、主題、主體和廣告信息的余弦相似度)和用戶偏好相似度(用戶信息和廣告信息的余弦相似度)。這些特征變量,尤其是分類的獨(dú)熱編碼,導(dǎo)致特征向量十分稀疏,其維度超過126,000,而且只有40個(gè)非零的特征。


XGBoost的超參數(shù)調(diào)整是一個(gè)比較棘手的問題,這個(gè)調(diào)整參考對(duì)我來說很有幫助。最好的XBGoost模型(方法四)得到了排行榜分值0.66821(超參數(shù)值見下圖),相比基準(zhǔn)模型這是個(gè)巨大的進(jìn)步。訓(xùn)練這個(gè)模型用一個(gè)32CPU和28GB RAM的服務(wù)器用時(shí)大約三小時(shí)(Google GCE上的n1-highmem-32型實(shí)例)。


用自帶的Python API訓(xùn)練最好的XGBoost模型


在LightGBM模型中,我只用了數(shù)值類的信息(點(diǎn)擊率和相似度)作為輸入,沒有用分類數(shù)據(jù),這樣的速度非常快,只用了不到十分鐘。令人驚訝的是,LightGBM(方法五)得到的模型比XGBoost得到的要更好(排行榜分值0.67073)。我的假設(shè)是高維分類的分類變量使獨(dú)熱編碼更難得到一個(gè)對(duì)樹預(yù)測(cè)準(zhǔn)確的隨機(jī)集合。事實(shí)上,一些競(jìng)賽者用原始提供的分類(不是獨(dú)熱編碼或特征哈希)所得到的單一GBDT模型得到了高于0.68的排行榜分值,可能是因?yàn)樯锨€(gè)分類樹模型在GBDT集成中能夠忽略干擾并為這些分類建模。


我用了LightGBM命令行界面訓(xùn)練并預(yù)測(cè)模型,我所得到的最優(yōu)的超參數(shù)展示在下圖。



現(xiàn)在,通過使用一些基礎(chǔ)的統(tǒng)計(jì)和樹集成,我的排行榜分值相比基準(zhǔn)值有顯著的提高。在該文的后半部分中,我將介紹解決預(yù)測(cè)點(diǎn)擊率問題最強(qiáng)大的機(jī)器學(xué)習(xí)模型和集成工具,正是它們讓我上升到排行榜第19位(前2%)。


原文鏈接:https:///unstructured/how-feature-engineering-can-help-you-do-well-in-a-kaggle-competition-part-i-9cc9a883514d


大數(shù)據(jù)文摘編輯部招人啦?。。?/span>


地處宇宙之心

和最聰明的腦袋一起玩耍

擇個(gè)黃道吉日點(diǎn)擊下方二維碼加入我們~

志愿者介紹

回復(fù)志愿者”加入我們


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多