原文:http://closure.blog.ustc.edu.cn/?p=117
阿里這次天貓推薦算法大賽題目的核心是給定用戶對品牌的四個月的操作記錄,預測下個月哪些用戶對哪些品牌產生購買行為,這可以抽象為一個01分類問題,更確切的可以抽象為一個點擊率預估(CTR)。與其說這是一次比賽,我覺得更多的是一次認識,一次對大數據價值的深刻認識,在分享自己的體會之前,我真心的感謝阿里,給我們提供這樣一種機會,讓我們在學校里可以接觸真實的數據業務需求,讓所學的理論可以有一次真實的實踐機會。
關於這次比賽,我想簡單分享下幾個比較重要的點:
第一點:特征提取,也稱特征工程
在真實的業務場景中,特征和模型一樣重要,花費同樣的人力物力,做特征工程有可能比作模型和算法優化來的有效。天貓的大數據競賽可以簡單抽象為一個點擊率預估問題,給定用戶對品牌的操作行為,判斷下個月買的可能性為多少。這里特征工程做的核心工作即構建用戶對品牌的特征體系:因為原始數據集是關於用戶對品牌在某個時間的某個行為操作,它是一個四維的張量,所以在提取feature的時候要充分考慮到這四個維度張量的信息。我們最終的目標是把這四維張量壓縮為一個二維的feature矩陣,並在這個feature上做模型的訓練和預測。如何把這四維張量的信息經過加工提取形成一個二維的feature矩陣,這應該是做好比賽的第一步,而且是重要的一步。現在大部分選手用的都是基於業務、經驗或者嘗試來進行手工提取,所以這個比賽誰的業務理解深刻,經驗足可能會有更好的結果。
下面我說下我們組的特征提取的過程:
我們把特征集分為三個部分:第一是用戶對品牌的直接特征體系,包括點擊購買收藏和購物車,第一次點擊購買,最后一次點擊購買等;第二是用戶的特征體系,包括用戶總購買,總點擊,點擊轉化比等;第三是品牌的特征體系,包括品牌購買用戶,購買次數,點擊轉化比等等。為了把時間這一張量加入到特征體系中,我們按照時間分片,每個片里面提取相應的特征體系。基於一種觀察,用戶對品牌的購買行為和他最近的行為較為相關,所以時間片的划分應該滿足最近的時間分片較細,較遠的時間片划分粗粒度一些;這樣就把時間這一張量的信息粗糙構建到feature中。
當然這只是一個很粗糙的一個特征體系的構建,還有很多的優化空間。
下面我說下幾個優化的點,這幾點對我們的成績都有不小的提升:
第一點:關於品牌或者用戶的特征挖掘,簡單的統計雖然對整個結果的准確性有一定提升,但是絕對不是最大的提升,一個很簡單的例子:A和B兩個品牌都被買了1000次,但是A品牌中很多人買了再買,然后再買,但是B品牌大部分買了一次都不再買了,這是個很大的區別,也就是說在對品牌進行特征建模的時候,把用戶的因素更加深刻的結合到品牌中挖掘更加本質的特征,有點類似於尋找最優解一樣,總有個方向最快通向最優解,但是如何找到這個最有方向,需要我們深層去思考,這可能就是業務吧。
還有一點,A用戶對B1和B2兩個品牌都產生過一次操作,並且這兩個品牌的特征體系基本相同,那如何判斷對哪個品牌買的可能性更大呢?這個基於簡單統計的可能就難以去做,但是我們深層的考慮下,通過協同過濾,我們發現A用戶曾經買的品牌中很多和B1產生一種聯系,但是和B2品牌沒啥聯系,這樣明顯的A用戶買B1的可能性就更大一些。
所以在做特征工程的時候,除了簡單的數學統計外,我們還是要深入思考整個業務場景,挖掘更加本質的特性,才會有更大的提升。
做好了特征工程,下面一個重要的一點就是模型選擇和優化:
一般來說,好的特征體系,不同的模型都會有不錯的效果,但是我們還是要根據不同模型的特點做特定的優化。我們在比賽中主要用到了邏輯回歸、隨機森林、梯度增強回歸樹。首先說下我們在邏輯回歸上遇到的一個大坑,對於邏輯回歸要求特征具有線性可比較,一個簡單的例子,一個用戶對一個品牌點擊了10次和100次,是不是點擊100次的那個品牌一定比點擊10的那個品牌要買的可能性大10倍,我想肯定不是,可能買的可能性就大那么一點點而已,所以我們要對特征進行一些變換,讓其具有線性可比較性,我們采取的措施是進行log變換,效果比原始數據要好很多。隨機森林,雖然它可以適應與連續和離散的特征,且不需要特征具有線性化特征,但是連續特征給模型的訓練帶來很大的開銷,且容易出現過擬合,如果對特征進行離散化,也許會有更好的效果,常見的就是等距和等頻分箱,進行離散化處理,感覺效果也不錯。當然還有其他優化,比如邏輯回歸中正則化調整,隨機森林和GBRT的參數調優等,都會對結果有一定提升。
然后還要說一點,關於模型融合,這一點對於比賽來說,可能是決賽的最后一步:
關於模型融合,可能是比賽最后階段最重要的環節,這一環節我們沒有做的很好,但是還是分享下組里的一些思路:其實gbrt和隨機森林本身就是兩個融合模型,一個是基於boosting的集成學習,一個是基於bagging的集成學習。下面說下模型的融合方案,可以分成兩大方面:第一是模型內部的融合;第二是模型和模型之間的融合。關於模型內部融合,可以從以下方面考慮,第一是多次采樣,進行結果融合;第二是不同特征子空間進行訓練,結果進行融合;第三是簡單模型級聯融合,以線性回歸為例,構建級聯的線性model,每個新的線性model是以前一個線性model的誤差為目標,做到誤差的級聯消除。關於模型之間的融合,可以利用最小二乘計算最優的模型權重系數,然后進行融合。總體來說,模型融合我們可能需要再去深入研究下。
最后說一些我們沒來得及做,但是值得嘗試的方向:
首先關於特征提取,我們可以對特征進行組合,形成一定富特征,也許可以提升分類器的精度,至於如何組合,目前我還沒有自動化組合學習的思路,但是人工組合是一個可行的方法。
關於上述我們介紹的從四維張量到二維特征矩陣的提取,是不是有更加自動的方法去做自動特征提取,這一方面,我調研了兩個方案:一個是張量分解,把高維轉化為幾個低維的乘積;另外一個是深度學習,無監督自學習特征,當然這兩點可能做的難度要大很多。
關於gbrt,天池默認的是最小二乘的回歸模型,其實這種基於gradient boosting的增強學習模型可以通過簡單的轉化,轉化為分類模型,比如mlr(多分類邏輯回歸)實際上就是一種gradient boosting的分類模型,這樣可能比把分類問題強行轉化為回歸問題更靠譜一些。
我們隊是“沖刺了!”,二階段第51名,雖然名次有點遺憾,但是學到了太多東西,感謝阿里!附我們隊合影,感謝可愛的隊友。