一直想總結一下此次的比賽,拖啊拖。。。一直等到如今,趁着如今要找實習,好好總結一下。機器學習
比賽的官方網站在這,IJCAI SocInf'16。學習
此次比賽的題目是給定 2015 年 7 ~ 11 月份的用戶在不一樣地點口碑購買記錄,以及 2015 年 7 ~ 11 月淘寶上用戶的購物行爲數據,來預測 12 月這一整月用戶來到一個地點以後會光顧哪些口碑商鋪。這個比賽有一個頗有意思的地方,就是它關注的是一個用戶來到一個他以前沒有去過的新地點以後,他會去哪些店鋪消費,有一點像推薦系統中經典的冷啓動問題。比賽提供的數據也有這個特色:測試
在測試集中,只有 10 % 的用戶用以前使用口碑的記錄;網站
有 5 % 的用戶雖然有以前使用口碑的記錄,可是在測試集中,這些用戶來到了新的地點;編碼
全部用戶都有他們淘寶購物的行爲數據。orm
若是題目只是這樣的,其實還不算奇怪,奇怪的是題目的評價標準上加上了 budget 這個神奇的東西,先來看看評價指標:htm
$$P = \frac{\sum_i min(|S_i \cap S_i^*, b_i|)}{\sum_i| S_i^* |}$$排序
$$R = \frac{\sum_i min(|S_i \cap S_i^*, b_i|)}{\sum_i min(|S_i, b_i|)}$$get
$$F_1 = \frac{2 \ast P \ast R}{P + R}$$產品
最後考覈的目標是 F1 值。簡單來講一下這個 budget:
咱們的目標是在用戶來到一個地點以後,給他推薦他可能會去的店鋪。這裏,把問題轉換一下,咱們要給不少店鋪來推薦可能會來這裏購物的人。這裏推薦的人數要受到 budget 的限制,即不能超過店鋪的最大承載量以及口碑提供給這家店鋪的優惠券的個數。
先詳細介紹一下比賽提供的數據格式:
Online user behavior before Dec. 2015. (ijcai2016 taobao.csv)
2015 年 7 ~ 11 月淘寶上用戶的購物行爲數據,包括用戶的點擊、購買,購買物品種類等屬性。
Users shopping records at brick-and-mortar stores before Dec. 2015. (ijcai2016 Koubei train.csv)
2015 年 7 ~ 11 月份的用戶在不一樣地點口碑購買記錄,數據格式:(user_id, loc_id, merchant_id, time_stamp)
Merchant information (ijcai2016 merchant info.csv)
不一樣口碑商鋪的位置分佈狀況,有的商鋪有連鎖店,數據格式:(merchan_id, loc_id1:loc_id2:...)
Prediction result. (ijcai2016 Koubei test.csv)
最後要提交的數據格式
user_id, loc_id, merchant_id1:merchant_id2...
對於這個問題,咱們的想法是,要充分利用每個用戶和每個口碑商鋪的歷史數據。更準確的說,咱們要從訓練集中提取足夠的可訓練的特徵,而後利用一些經典的模型,好比 Xgboost 來構建分類模型。同時最須要注意的是,咱們要時刻考慮 budget 的影響。
咱們分析了題目所給的訓練集,而後將數據切分爲兩部分,第一部分是 2015 年 11 月 23 號以前的數據,咱們把這當作本地訓練集;另外一部分是 2015 年 11 月 23 號以後的數據,咱們把這當作本地測試集。經過對這些數據的整理和分析,我發現幾條條重大的規律:
若是地點肯定的話,對於一個用戶,他最有可能去的是他曾經光顧過的店。
從口碑店鋪的角度來說,若是這家店鋪曾經的銷量很好,那麼它也將在將來吸引更多的顧客去消費。
從這兩條觀察出來的規律來看,咱們將探索數據的方向劃分爲兩條道路:一條是從用戶的角度出發;另外則是從口碑商店的角度出發。
基於咱們的觀察,當一我的來到一個他以前去過的地點,他們更傾向於去以前購物過的商店消費。所以,一個在過去的一段時間內在一家商鋪的消費次數可以在很大程度上影響咱們的推薦質量。頻率越高,越能表明這我的在將來會再次來到這家店消費。
咱們作了一個統計,若是一個用戶在過去曾經關顧過一家口碑店鋪超過 6 次的話,當咱們在以後再向這位用戶推薦這家店的話,咱們會獲得超過 90 % 的準確率。
不過從另外一方面說,每一家口碑店鋪都有 budget 限制,這意味着,若是按照用戶以前光顧過哪家店鋪來推薦的話,確定會有部分店鋪的 budget 超標。
咱們在用戶的數據中找尋這樣一個鍵值對 (user, location, merchant),經過計算這樣一個鍵值對出現的頻率,咱們能夠統計出 (user, location, merchant, frequency) 的鍵值對,將這個鍵值對按照 frequency 來從高到低排序,而後按照這個順序,從高到低來給 (user, query) 這樣一個查詢來推薦店鋪,直到這家店鋪的 budget 耗盡爲止。
通過統計發現,平均每個用戶在一個地點只會關顧 1.3 個商家,因此在這裏咱們限制最大的推薦個數爲 4。
通過以前的分析,咱們發現不一樣的店鋪有着不一樣的「受歡迎度」。舉個例子,「820」這個商家在整個訓練集中幾乎出現 1/4。問題是咱們怎麼定義這個「受歡迎度」呢?
爲了解決這個問題,咱們首先定義,在不一樣地點的同一家口碑商鋪是不同。由於在題目給定的數據中,存在大量的連鎖商鋪,可是這些連鎖店鋪在不一樣地點的「受歡迎度」是徹底不一樣的。
接下來咱們設想這樣一種狀況,90 % 來到地點 A 的人都會去 商鋪 B 消費,在這種狀況下,若是咱們給全部的來地點 A 的人都推薦 B 商鋪的話,咱們就能獲得 90 % 的準確率。因此,在一個地點某家店鋪消費的總人數佔該地點全部人數的比例,咱們稱之爲該店鋪的 「受歡迎度」 (Popularity)。
所以咱們將全部店鋪按照 Popularity 從大到小來進行排序,依次推薦來到該地點的全部用戶,直到超過 budget。通過一些線下的實驗,咱們取這個 Popularity 的值的閾值爲 0.25。
咱們以前的推薦徹底沒有用到每一個人的特徵,至關於沒法作到「千人千面」。因而接下來咱們就想辦法,如何利用淘寶的數據來提高推薦質量。
從直觀上並且,淘寶的數據應該頗有幫助,好比,在淘寶上常常瀏覽或者購買電子產品的人每每不太會去關顧口碑商鋪裏面那些賣女式服裝的。受到這個的啓發,咱們就創建了一個這樣的表:若是存在這樣一條記錄,一個用戶在淘寶上瀏覽或者購買的商鋪 A;同時也在線下口碑上的商鋪 B 消費,咱們就把 (A, B) 這個關係鏈表放入表中。基於這樣的表,咱們對那些以前沒有口碑消費記錄的新用戶,若是他們曾在淘寶上購買或瀏覽了商鋪 A, 那麼咱們就只給他推薦在關係鏈表中與 A 相連的口碑商鋪。線上的結果證實,咱們的預測質量提高了。
目前爲止咱們都沒有怎麼用機器學習模型,用普通的規則就能夠在天池上面排一個不錯的名次。可是爲了取得更好的成績,咱們嘗試着去探尋每個用戶、地點和商鋪的各類各樣可能的特徵。下面我將詳細介紹這些咱們的作法。
咱們將這個問題當作是一個二分類問題。咱們的方法是對每個店鋪建模,好比說,在數據集中,用戶 u 在地點 l 的店鋪 m 消費了。咱們能夠產生一個三元組 (u, l, m)。對應於這個三元組,咱們能夠產生一些訓練數據,首先,對於咱們而言,正樣本便是那些消費過的用戶,即 (u, l, m) 是 True;第二,咱們的負例是那些一樣是這個地點的其餘商鋪,好比說 m‘,咱們將 (u, l, m') 定義爲 False。按照這個方法,咱們能夠產生供二分類的訓練集。根據這個道理,對於賽題要咱們預測的用戶來到一個地點以後會去哪些店鋪的狀況,咱們也能夠根據這個三元組,產生一個每個店鋪的預測機率。
這麼作其實負樣本是不少的。。。爲了不正負樣本不平衡的問題,咱們採起採樣的方法去提取負樣本。
特徵工程對應機器學習來講十分重要,俗話說,特徵是模型的上限。咱們觀察到,有些用戶喜歡關顧那些他們以前去過的店,有些喜歡光顧該地點上最熱門的店鋪,有些則喜歡去那些剛開張的店鋪。
因此,針對 (u, l, m) 這樣一個三元組,咱們試圖找尋關於他們其中任意一個的特徵。
咱們找尋的特徵以下:
鍵值對 (u, l, m) 出現的次數,即 frequence,用戶關顧這家店的頻率。
鍵值對 (u, l, m) 是否出現過,True or False。
user_id 的 onehot 編碼。
merchant_id 編碼。
(l, m) 出現次數,即這個地點這個商店的總銷量。
open_interval:店鋪的開業時間。
用戶 u 在淘寶上購物的次數
用戶 u 在淘寶上瀏覽的次數
用戶 u 在淘寶上購買過的商品的種類的 onehot 編碼
用戶 u 在淘寶上購買過的商鋪的 id 的 onehot 編碼
用戶 u 在淘寶上購買的比例 (購買數 / (購買 + 點擊)
用戶 u 在淘寶上購買的次數
用戶 u 在淘寶上點擊的次數
經過 SVD 算出來的用戶 u 的潛在矩陣
經過 SVD 算出來的商店 m 的潛在矩陣
以前的規則能夠得出一個結果,以後的模型也能夠得出一個結果,在比賽的最後階段,咱們對模型進行融合,嘗試各類不一樣的參數,達到了這個名次。