Data Mining Final Project - Mercari Price Suggestion Challenge

Group 1 - Benchmark

Project Introduction

competition-image

一、題目說明

Dataset: Kaggle - Mercari Price Suggestion Challenge

Macari為一個網路二手交易平台, 而這次的dataset便是其提供於kaggle上的資料,資料包含了商品名稱、商品狀態、貨運、拍賣者描述、商品類別等... 其中許多attributes都是文字, 所以這次的project主要考驗的是如何處裡文字, 已達到準確的價格預測。



二、Evaluation

The evaluation metric for this competition is Root Mean Squared Logarithmic Error.

The RMSLE is calculated as

RMSLE formula

Where:

ϵ is the RMSLE value (score)

n is the total number of observations in the (public/private) data set,

pi is your prediction of price, and

ai is the actual sale price for i.

log(x) is the natural logarithm of x

Features Overview

ㄧ、欄位概觀

資料中, 欄位不多, 只有八欄, 基本上就是購物網站上會看到的那些資訊, 如產品名稱、分類、品牌、產 品新舊、價格、是否含運費及商品敘述。 產品新舊的部分是從1-5分等級的; 而產品分類欄位內包括了三個分類由斜線分開; 是否含運費的部分由1代表價格含運費, 0代表運費自付。 絕大部分的欄位都是文字, 包括了產品名稱、分類、品牌及商品敘述。資料中, training set跟testing set都只有分類及品牌有null值

Column id name Item_condition_id Category_name brand_name price shipping Item_description
Type string string int64 string string numeric binary string

二、價錢與敘述長度Scatter plot

這裡可以看到, 其實商品新舊1-3的商品價格分布差異並不大, 只有新舊為4-5的商品明顯價格較低; 而關於商品敘述的長度的話, 基本上長度超過500之後的商品就不太出現高價品了。


三、General category 價錢分布

以美妝、電子產品及古著還有女裝最多高價商品, 但是主要分類的商品平均價格相差不多, 而橘色為含運的商品, 藍色為不含運費的商品, 基本上並沒有除了上述的四種分類, 其他的品項有含運的商品價格偏高。

( 0 : Beauty 1 : Eletronics 2 : Handmade 3 : Home 4 : Kids 5 : Men 6 : No category 7 : Others 8 : Sports & outdoors 9 : Vintage & Collectibles 10 : Women )


四、Category cluster 結果

其中個數比較少的群其實群內的分類都十分相似, 如第12群['Outdoors', 'Artwork', 'Posters & Prints', 'Painting', 'Paintings', 'Drawings', 'Magazines', 'Patterns', 'Sculptures', 'Magnets', 'Bookmark', 'Photographs', 'Postcard', 'Illustration', 'Frames', 'Collages', 'Portraits'] 及第19群 ['NFL', 'MLB', 'NCAA', 'NBA', 'Bowl', 'NHL', 'Pitcher', 'Draft Stoppers']


五、Correlation plot

這裡可以看到, General category與價格關係的正相關最大, 而商品名稱及敘述長度為負相關, 而有含運費的商品事實上價格並沒有比較高。

Preprocessing

ㄧ、Log Price

由於price的值普遍偏低,我們將其+1(smoothing)取log後再train,也的確能夠提升準確率。


二、Missing Value

由圖中可以發現brand_name的missing比例非常高(約0.45)。

missing_value

由於miss的data都是文字,故我們處裡的方法為將nan的欄位填上"missing"的字串。

missing_valu_observed

For all string variables:

nan => ‘missing’

‘no description’ => ‘no description’

fillna

三、LabelEncoding

在label encoding的過程,我們將unique的字串,map到單一的編號上,並將這對應的編號存到新的features "brand"及"category"中,並保留原本的feature做後續的preprocess。

doing labelencoding onto brand_name & category_name

unique category name: 1311

encode category to a number between [0, 1310]

unique brand name: 5290

encode brand to a number between [0, 5289]


四、Spliting category

在category_name的欄位中,可能同時包含多個tag,在Spliting category的過程,我們將這些tags分開來,已獲得更精確的feature。 接著,將分開出的tags做labelencoding。 Example: Women/Beauty/Handmade -> [15, 24, 1552]


五、One_hot encoding

1. 將training data & test data的文字欄位(category_name, item_description, name), 集合成一個corpus 2. 利用這個corpus對此三個欄位做onehot_encoding

Apply Models

一、XGBoost

Performance: 0.61

Reason:

Memory: X should be calculated in advance. One hot for each term => word2vec

XGBoost: not good at Linear model.

起初,由於課堂上並沒有對深度學習進行介紹,因此先使用比較傳統祭器學習的方法XGBoost找出Baseline。不過實做過後發現效果非常不好,主要分析原因有二,其一文字為基礎的變數,由於記憶體有限的因素,沒有辦法使用onehot encoding準確地將每一個字變成一個維度,並將每一個句子在空間中的位置找出來,而使用word2vec的情況下,將導致太多個字的句子(主要發生在name以及item_description兩個欄位)在直接將每一個字的向量相加的情況下,導致不好的效果。其二,由於Random Forest原先僅能被設計出來僅能處理分類問題,有網路上的評論說XGBoost因此在處理線性問題時,其效果並沒有在處理分類問題來的好。


二、RNN+DNN

Performance: 0.44

Reason:

Embedding layer help to save memory.

RNN helps to memorize all words in the sentence.

DNN helps to predict precise price.

(一)特徵值:

由於整個深度學習的模型龐大複雜,因此在此畫圖解釋。首先,我們透過特徵值工程(Feature Engineering)篩選出七個主要的特徵值,其中有三個作文純文字特徵值、三個類別型特徵值、一個布林值。這邊必須特別說明的是,有一些特徵值並沒有被我們放入最終的模型中。 文字欄位的word2vec: 其一,因為要將每一個字的向量都加起來,運算時間上非常吃力,且比賽有一個小時運算時間的限制,因此,最終並沒有將其納入滲度學習的模型Input中。 category_split欄位: 上面的category是直接將帶有斜線的原始類別集合(如'Women/Beauty/Handmade')作為一個類別,至於做過split的類別,由於其在計算上並沒有辦法增加模型的表現效果,就沒有將其放入我們最後的模型中了。

(二)DNN Input:

回到模型的建構上,以下分別針對不同型態的欄位說明之。 純文字型態: 首先透過Keras中內建的texts_to_sequences,把所有文字編碼,並將文字轉換成編碼。再來,編碼本身會作為模型的Input,模型會直接將編碼轉換成特定長度的Embedding向量。第三部則是,透過Keras中的GRU,使用RNN模型預測一個特定長度的向量作為DNN的Input。 類別型態: 首先將每一個類別Embedding到特定長度的向量上,再將其作為DNN的Input。 布林值: 直接作為DNN的Input。

(三)DNN:

最後,建置一個三層的DNN模型,前面兩層皆使用Relu作為激發函數(activiate function),最後一層因為要預測的是連續變數price,因此使用linear作為激發函數。

(四)總結:

總體而言,最後這個模型的表現效果相對較好,主要原因在於,在深度學習的模型中,Input只要放入轉換成Index的文字,而不需真正的轉化出一個非常高維度的向量(onehot encoding),再放入模型中訓練,因此整個name以及description中每一個字都很精準的考慮進去。此外,RNN模型使用上,將文字前後的意義考慮進去之後,比較可以精準的對於文義進行理解再做出預測。最後,DNN在於連續型變數的預測上有比較多參數調整的空間,也較XGBoost來的彈性。 不過,仍然很難達到很精準預測的效果,其主要原因來自於,二手交易商品的價格本身就具有一定程度的不穩定性,比賽中給予的特徵值仍然很難有效的解釋商品的價格。舉例來說,商品已經使用多久、商品的折舊程度、商品的受損情形或是商品圖片,可能都會是很重要的決定二手商品價格的資訊,但是這些資訊有時候很難量化紀錄,或是在比賽中提供。

Group Members: 王選仲(法科碩二)、王韋勝(地政四)、張銘仁(資科三)、林建甫(資科三)、張為淳(資管五)