日萌社
人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度學習實戰(不定時更新)
5.3 ABTest實驗中心
學習目標
- 目標
- 無
- 應用
- 無
個性化推薦系統、搜索引擎、廣告系統,這些系統都需要在線上不斷上線,不斷優化,優化之後怎麼確定是好是壞。這時就需要ABTest來確定,最近想的辦法、優化的算法、優化的邏輯數據是正向的,是有意義的,是提升數據效果的。
5.3.1 ABTest
有幾個重要的功能
-
一個是ABTest實時分流服務,根據用戶設備信息、用戶信息進行ab分流。
-
實時效果分析統計,將分流後程序點擊、瀏覽等通過hive、hadoop程序統計後,在統計平臺上進行展示。
5.3.2 流量切分
A/B測試的流量切分是在Rank Server端完成的。我們根據用戶ID將流量切分爲多個桶(Bucket),每個桶對應一種排序策略,桶內流量將使用相應的策略進行排序。使用ID進行流量切分,是爲了保證用戶體驗的一致性。
- 實驗參數
from collections import namedtuple
# abtest參數信息
# ABTest參數
param = namedtuple('RecommendAlgorithm', ['COMBINE',
'RECALL',
'SORT',
'CHANNEL',
'BYPASS']
)
RAParam = param(
COMBINE={
'Algo-1': (1, [100, 101, 102, 103, 104], []), # 首頁推薦,所有召回結果讀取+LR排序
'Algo-2': (2, [100, 101, 102, 103, 104], []) # 首頁推薦,所有召回結果讀取 排序
},
RECALL={
100: ('cb_recall', 'als'), # 離線模型ALS召回,recall:user:1115629498121 column=als:18
101: ('cb_recall', 'content'), # 離線word2vec的畫像內容召回 'recall:user:5', 'content:1'
102: ('cb_recall', 'online'), # 在線word2vec的畫像召回 'recall:user:1', 'online:1'
103: 'new_article', # 新文章召回 redis當中 ch:18:new
104: 'popular_article', # 基於用戶協同召回結果 ch:18:hot
105: ('article_similar', 'similar') # 文章相似推薦結果 '1' 'similar:2'
},
SORT={
200: 'LR',
},
CHANNEL=25,
BYPASS=[
{
"Bucket": ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd'],
"Strategy": "Algo-1"
},
{
"BeginBucket": ['e', 'f'],
"Strategy": "Algo-2"
}
]
)
5.3.3 實驗中心流量切分
- 哈希分桶,md5
- 推薦刷新邏輯(通過時間戳區分主要邏輯)
- ABTest分流邏輯實現代碼如下
- import hashlib
- from setting.default import DefaultConfig, RAParam
def feed_recommend(user_id, channel_id, article_num, time_stamp):
"""
1、根據web提供的參數,進行分流
2、找到對應的算法組合之後,去推薦中心調用不同的召回和排序服務
3、進行埋點參數封裝
:param user_id:用戶id
:param article_num:推薦文章個數
:return: track:埋點參數結果: 參考上面埋點參數組合
"""
# 產品前期推薦由於較少的點擊行爲,所以去做 用戶冷啓動 + 文章冷啓動
# 用戶冷啓動:'推薦'頻道:熱門頻道的召回+用戶實時行爲畫像召回(在線的不保存畫像) 'C2'組合
# # 其它頻道:熱門召回 + 新文章召回 'C1'組合
# 定義返回參數的類
class TempParam(object):
user_id = -10
channel_id = -10
article_num = -10
time_stamp = -10
algo = ""
temp = TempParam()
temp.user_id = user_id
temp.channel_id = channel_id
temp.article_num = article_num
# 請求的時間戳大小
temp.time_stamp = time_stamp
# 先讀取緩存數據redis+待推薦hbase結果
# 如果有返回並加上埋點參數
# 並且寫入hbase 當前推薦時間戳用戶(登錄和匿名)的歷史推薦文章列表
# 傳入用戶id爲空的直接召回結果
if temp.user_id == "":
temp.algo = ""
return add_track([], temp)
# 進行分桶實現分流,制定不同的實驗策略
bucket = hashlib.md5(user_id.encode()).hexdigest()[:1]
if bucket in RAParam.BYPASS[0]['Bucket']:
temp.algo = RAParam.BYPASS[0]['Strategy']
else:
temp.algo = RAParam.BYPASS[1]['Strategy']
# 推薦服務中心推薦結果(這裏做測試)
track = add_track([], temp)
return track