ABTest實驗中心

日萌社

人工智能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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章