廣告日誌系統日誌回溯時長的分析
在廣告的CTR預估系統中,無論是離線學習還是在線學習,我們都非常依賴廣告的日誌;尤其是在線系統,需要對點擊和曝光日誌進行對齊,而這個對齊必須基於窗口實現,指定多長的窗口期比較合適呢,因此需要對點擊曝光日誌的回溯時長進行分析。
一條點擊日誌包含兩個時間,投放端投放發生的時間戳和用戶發生點擊行為後日誌系統接收到點擊的時間戳,中間的間隔對應點擊的回溯時長。
一條曝光日誌也包含兩個時間,投放發生時間和曝光發生後日誌系統接收到曝光的時間戳,間隔對應曝光的回溯時長。
對點擊曝光日誌進行對齊,除了前面兩個時長以外,還包含第三個時長,即曝光和點擊之間的的間隔;理論上,曝光行為一定是先於點擊行為發生的,所以這個間隔時長一定是個正數,但實際生產環境中,由於不同的日誌的流傳流程存在不同,受限於延遲等因素的影響,這個間隔也可能是負的(也就是說先收到點擊日誌,才收到曝光日誌),在我們的日誌系統中,就觀測到大概有2%左右的點擊是先於曝光的。
點擊和曝光時長服從一個什麼樣的分布呢?第一反應,覺得這應該是一個指數分布:
用指數分布進行擬合:
import matplotlib.pyplot as plotfrom scipy import statsimport seabornimport numpya = numpy.array(map(lambda x: int(x[1] / 1000), read_logs()))print size:, len(a)print average:, numpy.average(a)print var:, numpy.var(a)ax = seaborn.distplot(a, bins=300, kde=False, fit=stats.expon)plot.title(ax)plot.show()
發現存在一定的bias,可見指數分布存在一定的偏差;查閱資料發現,實際中通常使用weibull分布對這類模型進行更加精確的建模。
在SciPy的stats中,有一個weibull_min分布,對應這種分布,擬合結果如下:
可以看到擬合得非常好了。
需要強調的是,從投放開始到曝光的時長和從投放開始到點擊的時長分別服從參數不同的weibull分布,曝光-點擊時長服從的分布是兩個weibull分布的差。
統計發現,87%的曝光點擊日誌間隔不超過2min,99%的不超過30min,同時,平均間隔在一分半左右。
使用Python估計超時的概率:
# a為時長的統計數組,單位ms# window_size為窗口時長,單位mindef timeout_rate(a, window_size): l = len(a) p_sum = 0 last_r = 0 for i in range(window_size * 60): l1 = len(filter(lambda x: x < 1000 * i, a)) r = float(l1) / l p_sum += (r + last_r) / 2 last_r = r return 1 - p_sum / (window_size * 60)
如果取時間窗口為30min,平均CTR取1%,那麼,一條曝光日誌被錯誤認為是負樣本(即這條曝光日誌未來會被點擊,但在窗口期內無法觀測到)的概率為:
推薦閱讀:
※了解一點模型部署與上線
※從懵逼到菜逼------菜逼來談數據挖掘
※手把手教你快速構建自定義分類器
※數據挖掘和網路爬蟲有什麼關聯區別?
※Community Preserving Network Embedding閱讀報告