丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
人工智能開發(fā)者 正文
發(fā)私信給MrBear
發(fā)送

0

Kaggle 商品定價(jià)預(yù)測最優(yōu)方案出爐,如何從兩千多支隊(duì)伍中脫穎而出?

本文作者: MrBear 編輯:汪思穎 2018-03-16 14:30
導(dǎo)語:模型并不是越復(fù)雜越好

雷鋒網(wǎng) AI 研習(xí)社按:為了自動(dòng)為商品定價(jià),日本著名的社區(qū)電子商務(wù)服務(wù)提供商 Mercari 在 Kaggle 上舉辦了「Mercari Price Suggestion Challenge」大賽,旨在利用商品的名稱、類型、描述等文本信息為賣家提供定價(jià)建議。

Kaggle 商品定價(jià)預(yù)測最優(yōu)方案出爐,如何從兩千多支隊(duì)伍中脫穎而出?

上面的兩件毛衣,一件價(jià)值 335 美元,另一件價(jià)值 9.99 美元。對(duì)于我們?nèi)祟悂碚f,想要通過上面的描述為毛衣定價(jià)簡直可以說是「不可能完成的任務(wù)」!有了自然語言處理這個(gè)利器,它是否能幫助我們解決這個(gè)問題呢?該比賽圍繞這個(gè)問題展開。雷鋒網(wǎng)將比賽具體細(xì)節(jié)以及冠軍方案編譯整理如下:

比賽簡介

本比賽分為兩個(gè)階段,在這個(gè)比賽的第一階段中,選手被要求提交代碼解決這個(gè)問題,并且代碼需要在 Kaggle 比賽的服務(wù)器上用一個(gè)小時(shí)以內(nèi)的時(shí)間生成答案。而在下一階段中,選手被要求不能修改第一階段使用過的代碼。更為嚴(yán)苛的是,在這個(gè)階段,數(shù)據(jù)規(guī)模增長到了第一階段的 5 倍!這對(duì)項(xiàng)目代碼的魯棒性提出了很高的要求。本比賽采用均方根誤差(RMSLE)作為評(píng)價(jià)選手提交的模型性能的標(biāo)準(zhǔn),具體來說,均方根誤差可以由如下圖所示的方法計(jì)算得到:

Kaggle 商品定價(jià)預(yù)測最優(yōu)方案出爐,如何從兩千多支隊(duì)伍中脫穎而出?

其中,? 是 RMSLE 的值,n 是在公開或者私密的數(shù)據(jù)集中觀察的樣本點(diǎn)的個(gè)數(shù),p是我們預(yù)測的商品價(jià)格,a是商品實(shí)際的價(jià)格,log(x) 是 x 的自然對(duì)數(shù)。

數(shù)據(jù)集

本比賽使用的數(shù)據(jù)由 train.tsv 和 test.tsv 兩個(gè)數(shù)據(jù)文件組成,數(shù)據(jù)文件中的內(nèi)容由 tab 符分隔開來,每個(gè)文件包含以下字段:

  • train_id 和 test_id:條目的編號(hào)

  • name:商品名稱

  • item_condition_id:賣家提供的商品的狀態(tài)

  • category_name:商品的類別

  • brand-name:品牌名稱

  • price:商品曾經(jīng)的售價(jià),這也是我們的預(yù)測目標(biāo)

  • shipping:運(yùn)費(fèi)

  • item_description :對(duì)商品的文字描述

本次比賽獎(jiǎng)池巨大,主辦方一共提供了 10 萬美金的獎(jiǎng)金,吸引到 2384 支參賽隊(duì)伍。Pawel 和 Konstantin 兩位選手在分別提出了性能十分優(yōu)秀的模型后,決定雙劍合璧,取長補(bǔ)短。他們合并而成的隊(duì)伍獲得了本次比賽的大獎(jiǎng)。下面讓我們看看他們拔得頭籌的方案吧!

Pawel 在組隊(duì)之前的解決方案(RMSLE 大約為 0.3950)

在與 Konstantin 組隊(duì)之前,Pawel 曾經(jīng)設(shè)計(jì)了一個(gè)十分復(fù)雜的模型,該模型由三部分組成:

1. 針對(duì)每個(gè)類別的商品建立一個(gè)模型:Pawel 首先針對(duì)每個(gè)類別建立了 3 級(jí)的嶺回歸模型。這個(gè) 3 級(jí)模型可以看作基數(shù) 2 加上如「項(xiàng)目_條件_編號(hào)」這樣形式的偏移。這個(gè)模型訓(xùn)練起來十分快,在 20 分鐘內(nèi)取得了 0.4050 的預(yù)測準(zhǔn)確率。

2. 殘差模型 MLP:在 1 中提到的模型的基礎(chǔ)上,Pawel 接著在稀疏的輸入數(shù)據(jù)上訓(xùn)練了一個(gè)神經(jīng)網(wǎng)絡(luò)模型。這個(gè)網(wǎng)絡(luò)設(shè)計(jì)損失函數(shù)的總體目標(biāo)是讓預(yù)測值和真實(shí)數(shù)據(jù)之間的差別盡量小。這個(gè)模型的設(shè)計(jì)方法可以被視作強(qiáng)分類器的集成學(xué)習(xí)。

3. 殘差模型 LGBM 模型:想法和 2 一樣。

盡管為每個(gè)類別建立一個(gè)模型的想法似乎很棒,但是實(shí)際上并非如此!訓(xùn)練這樣一個(gè)模型看起來很 cool,但是它會(huì)使每個(gè)模型的性能不能被充分發(fā)揮出來。我們可以這樣想,神經(jīng)網(wǎng)絡(luò)是不能被訓(xùn)練去理解類別、描述、標(biāo)簽之間的交互信息的,這是一個(gè)錯(cuò)誤的假設(shè)。我們的實(shí)驗(yàn)說明了,一個(gè)調(diào)試好的神經(jīng)網(wǎng)絡(luò)能夠?qū)W習(xí)到它想要學(xué)到的知識(shí)。

Konstantin 在組隊(duì)之前的解決方案(RMSLE 大約為0.3920)

在合并之前他建立了兩個(gè)模型:

1. 利用 TensorFlow 實(shí)現(xiàn)了一個(gè)稀疏的 MLP 模型。這個(gè)模型并沒有非常復(fù)雜的數(shù)據(jù)特征,與公開的方案相比,僅僅改變了特征的數(shù)量,并且使用嶺回歸的 eli5 解釋機(jī)制做了單詞化切片的處理。這樣依次訓(xùn)練了 3 個(gè)模型。

2. 在 Keras 框架下實(shí)現(xiàn)了一維卷積組成的卷積神經(jīng)網(wǎng)絡(luò),這與在其它的很多方案中的情況相類似。模型本身的性能并不是非常優(yōu)秀,但是它和 MLP 模型差別十分大,所以這個(gè)模型在集成學(xué)習(xí)框架中起到很好的效果。

融合

在組隊(duì)的時(shí)候,Konstantin 排名第一,Pawel 排名第二。為了能夠很好地繼承各自模型的優(yōu)點(diǎn),并不能盲目地將兩個(gè)解決方案拼湊起來,需要融合兩個(gè)人的思路,創(chuàng)造出新的解決方案。

要讓這個(gè)新的模型在滿足各種約束的條件下正常工作是一件富有挑戰(zhàn)性的事。對(duì)他們來說,訓(xùn)練時(shí)間并不是一個(gè)大麻煩,他們將更多的精力放在了籌集資金上,來購買硬件設(shè)備以便同時(shí)訓(xùn)練 4 個(gè)神經(jīng)網(wǎng)絡(luò)。

他們花了 2 個(gè)星期做出了一個(gè)兩人都贊成的解決方案。結(jié)果表明,兩個(gè)不同的預(yù)處理方案產(chǎn)生了許多解決方案需要的變量,這使得很容易地將準(zhǔn)確率提升了百分之 1,這是一個(gè)很大的突破。

最后,他們一共使用了 3 個(gè)數(shù)據(jù)集,并且在每個(gè)數(shù)據(jù)集上建立了 4 個(gè)模型。他們嘗試著通過以下方式建立更多樣化的模型:

1. 不同的分詞方式,帶詞干的和不帶詞干的

2. Countvectorizer 向量化技術(shù)/Tfidfvectorizer 向量化技術(shù)

構(gòu)建系統(tǒng)

如果不將解決方案分解到各個(gè)模塊中,想要管理整個(gè)項(xiàng)目十分困難。他們針對(duì)自己的代碼創(chuàng)造構(gòu)造系統(tǒng)。最終,他們使用這個(gè)系統(tǒng)寫出了解決方案的 python 程序包。代碼有些奇怪,偽代碼看起來是這樣的:

ENCODED_FILES = {some base64 encoded characters}

DECODE_FILES

INSTALL THE MERCARI PACKAGE

RUN MAIN FUNCTIONS

值得注意的是,按順序執(zhí)行這 3 個(gè)程序十分重要。這是因?yàn)?python 很有可能在執(zhí)行了某些操作之后并不會(huì)清理內(nèi)存,尤其是在數(shù)據(jù)預(yù)處理過程中。

數(shù)據(jù)預(yù)處理

有一些簡單的數(shù)據(jù)處理技巧十分有效:

1. 基于名字字符的 N 元模型:盡管不能完全明白其背后的技術(shù)原理,但是使用基于項(xiàng)目名稱字符串的 N 元模型(N-gram)能夠有效地提升預(yù)測的 RMSLE??赡苁且?yàn)檫@樣得到了相對(duì)更稠密的數(shù)據(jù)特征。

2. 詞根化算法:使用了標(biāo)準(zhǔn)的 PorterStemmer 分詞算法。

3. 數(shù)值向量化:諸如「10 data 5 scientists」這樣的數(shù)據(jù)描述是一個(gè)重要的錯(cuò)誤來源,這樣的數(shù)據(jù)描述往往被直觀地向量化表示為(data=10, scientists=5)。他們僅僅在一個(gè)數(shù)據(jù)集中應(yīng)用了這種向量化方法,并且使總體的 RMSLE 得分提升了 0.001。但他們沒有更多的時(shí)間去驗(yàn)證這個(gè)想法。

4. 文本鏈接技術(shù):為了減小直接將文本鏈接起來后的文本域的數(shù)據(jù)維度,他們測試了改變名字(name)、項(xiàng)目描述(item_description)、種類(category)、品牌(barnd)等參數(shù)之后的模型效果。通過這個(gè)步驟,RMSLE 得分提升了 0.37xx。

除此之外,一些自認(rèn)為很棒的特征工程技術(shù)并不十分奏效。在這里,簡單舉幾個(gè)例子:

1. 抽取諸如「for [Name]」這樣的數(shù)據(jù)特征:他們注意到,很多數(shù)據(jù)項(xiàng)目僅僅出現(xiàn)在某些人的數(shù)據(jù)中。他們不能確定這究竟意味著什么,但它似乎很重要,可以創(chuàng)建一個(gè)特征類別。他們利用 nltk 工具創(chuàng)建了一個(gè)品名列表,并且通過 AhoCorasick 算法搜索相似的字符串。

2. 他們注意到,在商品的描述中有一些由于換行引起的問題。只要有人在描述中使用換行符,就會(huì)連接這樣的單詞。

3. 拼寫檢查

使用神經(jīng)網(wǎng)絡(luò)做特征提取就好比「好吧!我猜我能在這里用你做特征工程,你能提升 0.0003 的 RMSLE 得分」(意在說明神經(jīng)網(wǎng)絡(luò)是一個(gè)黑盒技術(shù))

模型

Pawel 發(fā)現(xiàn),當(dāng)建立了一個(gè)經(jīng)過精心調(diào)試之后的稀疏多層感知機(jī)(MLP)模型后,如果在不同的數(shù)據(jù)集上訓(xùn)練相同的模型會(huì)比在相同的數(shù)據(jù)集上訓(xùn)練不同的模型整體上得到更加多樣化的結(jié)果。因此,他們決定堅(jiān)持做出一個(gè)「精品」模型,這也確實(shí)簡化了解決方案。

最基本的模型是一個(gè)有著稀疏輸入的多層前饋神經(jīng)網(wǎng)絡(luò),這個(gè)模型貌似平凡無奇,但令人意外的是,它確實(shí)很有效。他們認(rèn)為,這個(gè)模型之所以性能優(yōu)秀的一個(gè)原因可能是,它比其它的方法都要更高效。具體而言,數(shù)據(jù)集十分大的,所以模型必須能夠處理大量的數(shù)據(jù),并且能夠捕獲特征之間的相互作用。在相同時(shí)間內(nèi),一個(gè)一維卷積神經(jīng)網(wǎng)絡(luò)只能訓(xùn)練 4 個(gè)嵌入了 32 個(gè)節(jié)點(diǎn)的計(jì)算核心,他們的模型卻能夠訓(xùn)練 4 個(gè)有 256 個(gè)隱含節(jié)點(diǎn)的多層感知機(jī)模型。

細(xì)心學(xué)習(xí)進(jìn)度調(diào)優(yōu)是十分關(guān)鍵的:最重要的是,他們?cè)诿恳惠喌蠖紝⑴幚頂?shù)據(jù)的規(guī)模擴(kuò)大到之前的兩倍。這使得他們的模型在每一輪迭代之后都能夠被訓(xùn)練地更快,這也讓模型最終獲得了更好的性能。除了讓批處理數(shù)據(jù)的規(guī)模加倍,他們還降低了學(xué)習(xí)率。

之前所做的這些工作讓他們的模型在第二次迭代之后,在模型驗(yàn)證過程中獲得了最高的 RMSLE 分?jǐn)?shù)。之后,在第三次迭代之后,就出現(xiàn)了過擬合的情況。這樣的情況讓模型的整體性能更好。

和之前的方案(https://www.kaggle.com/lopuhin/mercari-golf-0-3875-cv-in-75-loc-1900-s)相比,他們?cè)谝韵碌膸讉€(gè)方面進(jìn)行了調(diào)整:

1. 使用了模型的變體:第一個(gè)是通過 Huber loss 作為損失函數(shù)訓(xùn)練的,這樣做可以使得模型對(duì)于數(shù)據(jù)中的離群點(diǎn)不那么敏感;另外一個(gè)是把這個(gè)任務(wù)當(dāng)作了一個(gè)分類問題而非回歸問題。

對(duì)于這個(gè)回歸問題,他們將所有的價(jià)格分配到 64 個(gè)區(qū)間內(nèi),并且為最終的分類預(yù)測制訂了一個(gè)靈活的目標(biāo):他們首先計(jì)算了每個(gè)區(qū)間的中心之間的 L2 范數(shù),之后對(duì)其應(yīng)用 softmax 函數(shù),這個(gè) softmax 函數(shù)帶有更高的 softmax 溫度參數(shù) T(溫度參數(shù) T 是一個(gè)超參數(shù))。當(dāng) T 很大時(shí),所有的激活值對(duì)應(yīng)的激活概率趨近于相同(激活概率差異性較?。?,而當(dāng) T 很低時(shí),不同的激活值對(duì)應(yīng)的激活概率差異也就越大。由于過擬合得到了緩解,這個(gè)分類模型本身能夠獲得更高的 RMSLE 分?jǐn)?shù),也使得預(yù)測的多樣性更強(qiáng)。

2. 在每個(gè)數(shù)據(jù)集上,對(duì)于 4 個(gè)模型中的 2 個(gè),他們?cè)谟?xùn)練和預(yù)測的過程中將所有的非零值設(shè)置為了 1,從而對(duì)于輸入數(shù)據(jù)進(jìn)行了二值化處理(離散化成 0 和 1)。這有點(diǎn)類似于得到一個(gè)通過二值的 CountVectorizer 技術(shù)產(chǎn)生的額外的數(shù)據(jù)集,而不是用 TFIDF 技術(shù)產(chǎn)生的數(shù)據(jù)大小沒有約束的數(shù)據(jù)集。這個(gè)想法很贊!他們也試著通過其它非零的閾值進(jìn)行二值化處理,但是這些做法都沒有帶來很大的性能提升。

3. 他們僅僅在第一層中使用了 L2 正則化項(xiàng),這也將模型性能提升了一點(diǎn)點(diǎn)。他們發(fā)現(xiàn),在 TensorFlow 環(huán)境下編寫的模型使用 PRELU 作為激勵(lì)函數(shù)時(shí),會(huì)比使用 RELU 激勵(lì)函數(shù)時(shí)取得更好的效果。

這個(gè)比賽除了對(duì)模型的理論構(gòu)建有很高的要求,對(duì)于數(shù)據(jù)集的大小也有著非常嚴(yán)格的限制,讓訓(xùn)練過程變得更加高效十分重要。擴(kuò)大第一個(gè)隱藏層的節(jié)點(diǎn)數(shù)目很有可能提升預(yù)測的準(zhǔn)確率得分。除了對(duì)數(shù)據(jù)集進(jìn)行預(yù)處理,他們還訓(xùn)練了 12 個(gè)模型。最終,他們成功地在 200K 的數(shù)據(jù)上訓(xùn)練了 12 個(gè)有著 256 個(gè)隱藏節(jié)點(diǎn)的模型。以下是具體的實(shí)施方案:

1. TensorFlow 可以使用多個(gè)計(jì)算核心,但這并不是讓模型性能線性增長,特別是對(duì)于稀疏的數(shù)據(jù)作為輸入的模型。因此更好的解決方案是,每個(gè)模型使用一個(gè)計(jì)算核心,并行訓(xùn)練模型。具體而言,他們通過「OMP_NUM_THREADS=1」指令將 TensorFlow 環(huán)境下每個(gè)計(jì)算核心上的線程數(shù)設(shè)置為 1。接著,他們使用 TensorFlow 的配置變量,通過非正式的「use_per_session_treads=1」指令,允許 TensorFlow 使用多個(gè)核心線程。這就意味著不需要啟動(dòng)多個(gè)進(jìn)程,還能使用更少的內(nèi)存。

2. 結(jié)果表明 MXNet 框架能夠在 CPU 上實(shí)現(xiàn)一個(gè)更高效的稀疏 MLP 模型。這是因?yàn)?MXNet 支持稀疏更新(當(dāng)然,TensorFlow 也許支持,但是他們?cè)谶@里沒有使用 TensorFlow 的這個(gè)功能)。Pawel 寫了一個(gè) MXNet 版本,并且將速度提升了兩倍。之后他們添加了 TensorFlow 模型提取出的所有特征,使它性能更好。一個(gè)值得注意的問題是,MXNet 的執(zhí)行引擎不是線程安全的,如果你嘗試使用線程來做并行計(jì)算,最終只能得到一個(gè)可用的計(jì)算核心,或者引發(fā)段錯(cuò)誤(Segfault)。因此,他們不得不轉(zhuǎn)而使用多進(jìn)程計(jì)算。由于 MXNet 生成了大量的副本,并且使用了太多內(nèi)存,他們也需要編寫自己的數(shù)據(jù)生成器。我們還有一個(gè)版本,將數(shù)據(jù)放入共享內(nèi)存中,但磁盤空間不足,所以也不得不放棄這個(gè)版本。

總的來說,MXNet 解決方案的速度更快,在不犧牲速度的條件下,允許使用較小的初始批處理數(shù)據(jù)規(guī)模。但使用了更大的內(nèi)存,因此看起來不那么可靠。在最后,他們使用同樣的數(shù)據(jù)集提交了兩個(gè)版本。一個(gè)使用 MXNet(0.37758 private LB / 0.37665 public),另一個(gè)使用 TensorFlow(0.38006 private / 0.37920 public)。

最后,他們獲得了 12 組預(yù)測結(jié)果,需要將其融合。平均之后效果會(huì)很好,調(diào)整混合權(quán)重更好。因此,他們使用了 1% 的數(shù)據(jù)集進(jìn)行驗(yàn)證(其中 5% 來自本地),并且使用 Lasso 模型調(diào)整權(quán)重。Lasso 模型使用了 L1 正則化。

除此之外,他們將一些效果較差的模型列舉如下:

1. 混合專家模型(MoE):這里有一篇很棒的論文(https://arxiv.org/abs/1701.06538),這篇文章描述在使用相同的計(jì)算資源時(shí),如何訓(xùn)練一個(gè)模型得到更大的容量。但是很不幸,最終結(jié)果表明,TensorFlow 對(duì)一些操作缺乏稀疏支持。

2. 他們嘗試加入一些外部的混合模型,例如:在同樣的架構(gòu)中將 FM 和 MLP 模型合并,并且在 MLP 的輸出中添加一個(gè)線性回歸的 skip 層。這些最終都會(huì)收斂到一個(gè)簡單的 MLP 模型。

只有使用更大的 MLP 網(wǎng)絡(luò)才能提高模型性能,但是由于比賽限制,顯然不能這么做。只有添加更多的數(shù)據(jù)/特性時(shí),模型才會(huì)得到改進(jìn)。

比賽地址:https://www.kaggle.com/c/mercari-price-suggestion-challenge

方案地址:https://www.kaggle.com/c/mercari-price-suggestion-challenge/discussion/50256

雷鋒網(wǎng)編譯整理。

雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知

Kaggle 商品定價(jià)預(yù)測最優(yōu)方案出爐,如何從兩千多支隊(duì)伍中脫穎而出?

分享:
相關(guān)文章

知情人士

當(dāng)月熱門文章
最新文章
請(qǐng)?zhí)顚懮暾?qǐng)人資料
姓名
電話
郵箱
微信號(hào)
作品鏈接
個(gè)人簡介
為了您的賬戶安全,請(qǐng)驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請(qǐng)驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號(hào)信息
您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說