背景
電商領域中經常需要計算或預測一些轉化率指標,如最典型的CTR(點擊率,Click-Through Rate)。這些轉化率可以是模型的預測值,也可以作爲模型的特徵(feature)使用。以商品點擊率預測爲例,CTR的值等於點擊量(Click)除以曝光量(Impression或Exposure)。以表示點擊率,
.
但在實際應用過程中會碰到兩個問題:
-
新商品點擊率的預測與計算
對於新上線的商品,其曝光爲0,點擊量也爲0,此時這件商品的CTR應該設爲0還是賦一個初始值? -
不同商品點擊率之間的比較
有兩件商品A和B,其點擊率分別爲和,,但商品A的曝光只有10次,商品B的曝光有100次,這樣比較是否合理?
第一個問題,初始值設0是可以的,但不太合理。當CTR作爲特徵使用時,表示這個商品完全沒有點擊,不太符合日常推斷,通常是賦一個大於0的初始值。第二個問題,不合理,通常會認爲曝光次數少的商品權重應該低一些。
解決以上兩個問題可以使用平滑的技術解決。最簡單的方法是在計算CTR的公式中分子分母同時加上一個數,加上之後可避免這兩個問題。
但(2)式中和的值如何確定? 這兩個數可以人爲設定,但若設置得不合理會出現數據被放大的情況。本文介紹如何通過歷史數據來計算有統計意義的和,即貝葉斯平滑。
貝葉斯平滑
貝葉斯平滑的思想是給CTR預設一個經驗初始值,再通過當前的點擊量和曝光量來修正這個初始值。如果某商品的點擊量和曝光量都是0,那麼該商品的CTR就是這個經驗初始值;如果商品A和商品B的曝光量差別很大,那麼可以通過這個經驗初始值來修正,使得曝光量大的商品的權重增大。
貝葉斯平滑就是確定這個經驗值的過程。貝葉斯平滑是基於貝葉斯統計推斷的,因此經驗值計算的過程依賴於數據的分佈情況。
貝葉斯平滑的推導涉及貝葉斯參數估計,如果對貝葉斯參數估計不熟悉,可以先參考這篇文章:貝葉斯參數估計的理解及其在電商算法中的應用
點擊率貝葉斯平滑的假設
對於一件商品或一條廣告,對於某次曝光,用戶要麼點擊,要麼沒點擊,這符合二項分佈。因此下文中對於點擊率類的貝葉斯平滑,都是基於以下假設:對於某件商品或廣告,其是否被點擊是一個伯努利分佈(Bernoulli)。
其中表示某個廣告是否被點擊,點擊取1,未被點擊取0,是某件商品被點擊的概率,即點擊率。
對於不符合二項分佈的比值類數據,也可以通過貝葉斯參數估計的方法計算平滑參數,但是數據分佈假設需要修改,後文有說明。
點擊率的極大似然估計
在(3)式的假設下,可以使用極大似然法計算出點擊率的估計值。從用戶日誌中隨機抽取條記錄,對任一條記錄都有
那麼所有記錄的點擊數的聯合概率密度就是上式的連乘。將連乘後的式子對求導,並令其等於0,可以解出的值,就是點擊率的極大似然估計。當某件商品的點擊次數或曝光量等於0時,可以用當成它的初始值。它解決了最開始提出的第一個問題,但沒有解決第二個問題。
上述的計算沒有用到歷史信息。所謂歷史信息是指:雖然我們不知道的具體取值,但是可以知道取值的範圍,更精確地,我們可以假設服從某個分佈。要將這些信息融入到的估計中需要用到貝葉斯參數估計。關於貝葉斯參數估計的具體內容可以參考:貝葉斯參數估計的理解及其在電商算法中的應用。
點擊率的貝葉斯估計
在貝葉斯框架下,我們假設點擊率服從某個分佈:
因爲這是基於經驗的,這個分佈稱爲先驗分佈。貝葉斯參數估計可以同時解決最開始提出的兩個問題。其過程是基於經驗或歷史數據先給出一個的估計值,然後基於現有的數據在這個估計值上修正,得到最終的點擊率估計,此時的估計值已經是修正過的。更美好的是我們可以分離出修正參數(即(2)式中的和)。
既然有先驗分佈,就有後驗分佈。的後驗分佈記作。其中表示輸入數據或特徵,對於點擊率預測,就是點擊次數和曝光量。因爲已經看到了數據,才確定的分佈,因此叫做『後驗』分佈。**貝葉斯估計的實質就是求後驗分佈。**即基於當前的點擊次數和曝光量,求點擊率的分佈;而未看到數據之前點擊率的分佈是。下面講解如何計算後驗分佈.
貝葉斯估計的過程可以簡單認爲:
用歷史數據根據估計,記作;用當前數據根據估計,記作,然後用修正。
平滑係數的計算
的後驗分佈是個概率密度函數,無法知道確切的值。需要求出最接近真實情況的需要損失函數來約束。
適用於點擊率的損失函數有:
貝葉斯參數估計的過程可以簡單描述爲:求,使得損失函數在的後驗分佈上的期望最小。
這句話的數學公式是:
整個過程的推導可以參考:貝葉斯參數估計的理解及其在電商算法中的應用。
要計算上式需要知道的形式,然而的形式一般不知道的,但是可以知道的形式(經驗值嘛,我們指定的,例如點擊率就是伯努利分佈)。此外,數據的分佈我們也是知道的(通過樣本得知),其概率密度函數(pdf)記爲,表示數據的分佈跟參數有關,是要求解的參數,在這裏就是點擊率。
這時可以根據貝葉斯公式計算出:
其中,
上式好複雜,但索性一些常見的分佈都可以求出上式積分的具體形式。然而實際計算時通常不用去計算積分,因爲滿足一定條件,跟有一樣的形式。是已知的,如果形式一樣,也就容易求得了,這個條件就是共軛。下面介紹共軛先驗的概念。
共軛先驗:如果找到一個,它是的共軛先驗,那麼的後驗分佈和先驗分佈會有一樣的形式。
『軛』是指駕車時套在牲口脖子上的曲木。古代拉扯的牲口通常有兩隻,因此軛是連接兩隻牲口的工具。在這裏共軛是指和通過聯繫起來了。
之前假設廣告是否點擊服從伯努利分佈,參數爲;對於點擊次數,服從的是二項分佈,即。二項分佈的共軛先驗是Beta分佈,Beta分佈的參數是和,即。根據共軛先驗的定義,的後驗分佈的形式跟其先驗分佈一樣,即。
對於點擊率預測,求出,帶入公式(6),當時,
(8)式就是點擊率估計(平滑)的最終形式。該式的具體求解過程可以參考貝葉斯參數估計最後二項分佈的例子。其中和就是點擊次數和曝光量,即爲公式(2)中的,是公式(2)中的。和是從歷史數據中得到的。
上面的內容給出了爲什麼很多文章會假設點擊率服從Beta分佈的理由,因爲最終的平滑的因子是Beta分佈(先驗分佈)中的兩個參數。那麼如何計算(估計)這兩個參數?
貝葉斯平滑因子的工程實踐
綜上,貝葉斯平滑的最終落腳點是要估計Beta分佈(點擊率服從的分佈)中的參數和,帶入(8)式,得到平滑後的點擊率。下面給出比較直觀的矩估計的方法。
矩估計
Beta分佈的期望是,方差是. 我們可以用樣本的均值代替期望,樣本的方差代替總體的方差,此時就可以解出和的值。是樣本均值,是樣本方差,則:
這裏的樣本指的就是我們能觀察到的商品的點擊情況。
工程實踐
實際操作時可以連續取一段時間的數據,比如一週,然後在每天的數據中計算每件商品或廣告的點擊率,之後求出這些點擊率的均值和方差,帶入公式(9)和公式(10),可以得到每天的和. 最後求這段時間和的均值作爲最終的平滑參數。
也可以每天計算前一天的和,用於當天的點擊率預測平滑。
實際應用時根據歷史數據得到的和可以幫助確定平滑參數的大致範圍,防止設置參數時偏離過大。通常可以調整和的範圍達到預期的效果。
下圖是某件商品在兩週時間內的點擊率。黃色線是每天根據點擊次數和曝光量計算得到的真實點擊率;藍色線是根據一週的歷史數據計算得到的和帶入公式(8)得到的平滑後的點擊率;綠色線是自定義平滑參數的點擊率,,,設置得比較誇張。可以看到如果平滑參數設置的不合理,會放大數據的表現,有時候甚至會扭曲數據的走勢,數據預處理時需要考慮這樣的情況。
非二項分佈的貝葉斯平滑
公式(8)的結論適用於數據是二項分佈的情況,如點擊率。對於不是二項分佈的數據公式(8)不適用。如果數據不是二項分佈,那麼其先驗概率就不是Beta分佈了。比如某件商品一天的點擊量與一週的點擊量的比值,這個數據不符合二項分佈,因此不適用公式(8)。但這個數據有可能是高斯分佈。如果數據是高斯分佈,那麼其先驗概率是逆Gamma分佈(invers Gamma)分佈,進而其後驗概率也是逆Gamma分佈,此時公式(8)會有不一樣的形式,視數據的具體情況而定。