基於文本特徵的價格模型
作者:閑魚技術-歸禾
摘要:
二手市場相對於新品市場的核心競爭力在於其價格優勢。 對於二手市場的消費者的核心訴求是找到保證質量的前提下找到價格優惠的商品。但相較於新品市場,二手市場作為C2C市場,商品更加非標準化,交易場景更加非標準化,因此給二手商品提供的合理的定價, 引導買賣雙方在合理的價格區間達成交易,能極大提高二手交易的效率。
在開展這個項目時,我們無意在Kaggle發現一個類似的競賽題目。日本大型的電商APP Mercari發起並贊助了Mercari Price Suggestion Challenge,詳細請參考(https://www.kaggle.com/c/mercari-price-suggestion-challenge)。 競賽的內容是根據Mercari提供的商品描述、題目、類目等信息預估商品的價格。Evaluation metric是模型的RMSLE (Root Mean Squared Logarithmic Error),具體的細節我們會在下文展開。
競賽的first place winner在測試數據集上的RMSLE達到了0.3875。由於這個競賽跟我們的課題非常類似,因此我們也在Mercari提供的數據集上進行了一些嘗試。我們的模型精度達到0.3873,與第一名的結果基本持平。下面我們會展開我們對這個問題的解決思路和詳細的結果。
正文
數據分析和處理
Mercari提供的價格數據包括如下信息:商品的標題、商品的描述、商品的類目、商品的新舊程度(離散變數),商品是否包郵,商品的價格。現在我們有訓練集和測試集兩個數據集,其中訓練集有118.6萬數據,測試集有29.6萬數據。
建模前我們首先解決以下兩個問題:(1)如何選擇合適的loss function(2)如何處理數據作為模型的輸入.
首先,我們的目標是預測商品的價格,是一個回歸模型, 所以我們的loss function應該用RMSE; 另外商品的價格是一個非負的實數,所以價格模型及其loss function都應該是在logarithmic scale上的。同時log scale把小的數值拉的更遠,讓大的數值之間拉的更近。也就是說log(10)與log(20)之間的距離等同於log(100)與log(200)之間的距離。這樣我們的模型就不會被少數價格高的商品的數據所主導。結合以上兩點,我們選取RMSLE(如下所示)作為loss function是合適的, 其中是預測價格,是真實價格。
其次,數據應該以什麼形式作為模型的輸入, 商品的類目、商品的新舊程度,商品是否包郵作為離散標量,我們可以直接用one hot key encoding將其向量化,商品的標題和商品的描述作為文本輸入,可以有多種處理方式,我們嘗試了兩種方案,(1)用其TFIDF vector作為文本的向量化表示, (2)基於word embedding的GRU模型。 下面我們展開介紹這兩個方案。
基於TFIDF特徵的多層神經網路模型(MLP)
影響商品的價格的文本信息包括商品標題和商品和描述,商品標題通常是關鍵詞的堆砌,商品描述中對價格影響比較大的通常也是商品的型號、品牌、新舊程度等關鍵詞, 因此在價格預估模型中TFIDF的performance要優於sequential模型(例如LSTM或GRU模型)。 但並不是說GRU模型對於優化價格模型完全沒有增益,之後我們會提到,GRU模型能夠很大的提高ensemble模型的準確度。
2.1基於TFIDF的MLP模型
模型的第一步是把商品的文本特徵變換成TFIDF特徵向量表示,我們可以用sklearn package中的函數tfidfvectorizer實現這一點。 同時這裡我們把商品的標題獨立於商品的描述,單獨extract其TFIDF,主要原因是相比描述,標題對商品價格有更大的影響作用。 然後基於商品的向量化表示,我們建了一個五層的神經網路,採用RELU激活函數。具體結構如下圖表示:
我們發現把模型在同一訓練樣本上訓練多次,然後emsemble多個模型的結果可以提高模型在測試集上的預測效果。同時我們可以把文本的TFIDF向量二值化,即所有的非0輸入設為1,為0的輸入依舊為0, 這樣我就會增加一個訓練集。 因此我們把MLP模型在原始訓練集上訓練兩次,在二值化後的訓練集上訓練兩次。發現基於原數據的MLP單模型在測試集上的RMSLE為0.4138, 基於二值化後的數據的MLP單模型在測試集上的RMSLE為0.4179,4個模型emsemble後的RMSLE為0.3952
2.2 MLP模型的變種
常識告訴我們商品標題的文本信息與商品的類目是密切相關的,通過數據分析我們也發現不同的關鍵詞在不同類目下的分布完全不同。雖然一個好的神經網路模型可以catch到不同變數之間的相關性,但我們依然嘗試了人為地加入了標題和類目間的交叉結構,其模型結構如下:
類似的我們把該MLP模型在原始樣本上訓練兩次,在二值化後的樣本上訓練兩次。基於原始樣本的單模型在測試集上的RMSLE為0.4151, 基於二值化後的數據的單模型在測試集上的RMSLE為0.4166 ,四次訓練emsemble後的RMSLE為0.3977
基於GRU的循環神經網路模型
LSTM和GRU是比較常用的基於文本序列的模型,相較於LSTM, GRU模型的參數少,訓練比較快,這裡我們採用了GRU模型。雖然GRU模型的單模型performance相比基於TFIDF的多層神經模型要差些,但由於GRU模型的模型結構和TFIDF模型的模型結構有很大差異,可以極大的提高ensemble模型的準確率。
以商品的標題為例,首先通過padding(right padding)把所有商品標題變為同一長度,標題太短的情況下右邊補0, 然後通過one hot key的編碼方式將每個word轉換為向量形式,向量的維度為詞典的大小, 然後連接一個word embedding層對其進行降維,商品標題中的每個詞依次進入GRU層,產出一個向量代表商品標題;用這種方式把商品標題和描述都轉化為其相應的向量表示,然後跟其他特徵一起輸入到下一層。具體的結構如下
在GRU模型中標題和商品描述可以共用一個word embedding layer,這樣可以減少模型參數,提高訓練速度。我們發現GRU模型單模型的RMSLE為0.4223,同一模型在訓練數據上訓練四次,然後ensemble其預測結果,得到ensemble模型的RMSLE為0.4152。
模型Ensemble
通過以上實驗我們發現,由於商品的描述,尤其是標題通常是關鍵詞的堆疊,基於TFIDF的MLP模型更適用於解決『基於商品描述預測商品價格』的問題。但由於GRU模型的模型結構完全不同於MLP模型,所以三個結構迥異的模型ensemble後,反而會顯著的模型整體的準確率。 這裡ensembling的方法我們採用的是不同模型的加權平均。模型2.1和模型2.2 ensemble後的rmsle降低為0.3916(the ensembled prediction is average of the outputs from model 2.1 and model 2.2),三個模型ensemble後rmsle降低為0.3873 (the final ensembled prediction is weighted average of the outputs from the first ensembling step with weight 3/4 and the outputs from model 3 with weight 1/4)。
總結
基於文本信息的價格預估模型的商業化應用目前不是很多,我們看到基於文本的模型很好的解決了商品數據非結構化的問題, 未來還可以結合商品的圖片特徵,以及優化ensemble method 例如嘗試 boosting and stacking(another prediction model is built on top of the base models and take the predictions from the base models as input)等方法,進一步對模型進行優化。
http://weixin.qq.com/r/Pi4nIyXEpO3YKWFAb3u6 (二維碼自動識別)
推薦閱讀:
※2015 年出品了哪些值得收藏的手辦/玩具/模型/人偶?
※變形金剛玩具月旦評——2018年3月篇
※1/350比例的軍艦模型,比較好看又適合新人是哪一個?
※SU 渲染手工模型效果參數怎麼弄啊?