1. 程式人生 > >機器學習---推薦系統效果評估NDCG

機器學習---推薦系統效果評估NDCG

根據作者描述以及提供的程式碼和資料我主要做了一下事情:
(1)進行本地測試執行,同時記錄下程式碼每個大的模組主要邏輯。
(2)特別利用作者提供的NDCG效果評估程式碼,仔細研究了下如何對排序效果進行測評。

1、業務背景

世紀佳緣推薦系統比賽,根據使用者在首頁的互動行為以及使用者的基礎屬性,提高推薦的準確度。主要的操作行為:發件(msg),檢視資料頁(click),曝光(rec),其中動作強度為發件>檢視資料>曝光。主要使用者屬性:性別,年齡,婚姻,學歷,收入等13個。

2、原作者大體推薦方法

“Popularity = msg_weight * msg_times + click_weight * click_times + rec_weight * rec_times”
即根據被推薦使用者的受歡迎度進行排序,最終利用NDCG測評方法與實踐使用者操作行為進行比較。期望好的推薦結果是,被推薦使用者的受歡迎度越大,動作強度越大。

3、程式碼主要模組,和功能:

  • 0資料說明
train.txt : 
             USER_ID_A: 主動方使用者
             USER_ID_B:被曝光使用者,即推薦給A的使用者。
             ROUND: 該使用者A推薦次數
             ACTION:使用者A對使用者B產生的行為,rec(B曝光給A),click(A查看了B的資料頁),msg(A傳送訊息給B)
             注:使用者A對使用者B產生3中行為,train.txt存三條記錄。
    test.txt: 只包含USER_ID_A,USER_ID_B,ROUND
    profile_f.txt:
女性使用者基本資料資訊,共34個特徵。 profile_m.txt: 男性使用者基本資料資訊,共34個特徵 預測:測試集中,使用者A對使用者B的操作行為。(這裡的預測是指,預測已經推給使用者A的使用者B,基於模型重新排序後,使用者的點選情況,不是推出一批新的使用者給A) 注意:預測使用者A對使用者B產生的行為,取行為最強(msg>click>rec)的做為最後預測目標
  • 1.split_data: 訓練資料分為測試集與訓練集
    import split_data
    split_data.split_data('train.txt', 2
, 'train_train.txt', 'train_test.txt') 包含主要步驟: 1)利用隨機數,將train.txt分割為訓練集和測試集51;分別輸出到train_train.txt,train_test.txt佔1/6。 方便後期模型交叉驗證。
  • 2.compute_popularity: 計算userB受歡迎度得分
    import compute_user_popularity
    popDict = compute_user_popularity.compute_user_popularity('train_train.txt', 'user_popularity.txt')
    包含主要步驟:
    1)  計算userB被操作行為,即userB被推薦次數,被點選click次數,收到msg次數。K-v格式儲存: key=“userB action“, v=次數
    2)  計算使用者受歡迎得分: score_b=w1*rec+w2*click+w3*msg,按(userB,score) 存入list
    3)  按得分進行降序排序,後存入user_popularity.txt
  • 3.train_sort
    import train_sort
    result = train_sort.train_sort('train.txt', 'train_sort.txt')
    主要步驟:
    1)對train.txt按user_A,升序排列,並輸出到train_sort.txt
    方便後面對userA的互動使用者B進行處理。
  • 4.labels_train_v2: 訓練集處理
import labels_train
labels_train.labels_train_v2('train_sort.txt', 'labels_train.txt', 'user_recommend.txt')
主要步驟:
1)求與使用者A交往多次的使用者B,B被操作最強的行為。
小樣本測試結果:
    "因records的記錄過長沒法追蹤每個步驟的計算結果,所以擷取少量資料檢視程式碼"
    test_rec=[]
    test_rec=['2 104 76 rec\n',
     '2 104 78 rec\n',
     '2 442 35 rec\n',
     '2 442 64 rec\n',
     '2 523 9 rec\n',
     '2 1445 36 rec\n',
     '2 4101 36 rec\n',
     '2 5386 26 rec\n',
     '2 5386 66 rec\n',
     '2 7143 42 rec\n',
     '10 26047 64 rec\n',
     '10 26047 64 msg\n',
     '10 26047 64 click\n',
     '11 26047 64 click\n']

"""計算後效果如下:"
 labels  ['0 0 0 0 0 0 0', '2', '1']    
 Records ['2 104 442 523 1445 4101 5386 7143', '10 26047', '11 26047']
 也就是求: lables: 與使用者A互動的使用者B,按使用者B去重且取互動動作強的行為儲存。儲存到labels_train.txt
 Records: 與使用者A互動的使用者B,去重後儲存,儲存到user_recommend.txt
"""
  • 5.compute_ranks
import compute_ranks
compute_ranks.compute_ranks_using_popularity('user_recommend.txt', 'user_popularity.txt', 'myranks_train.txt') (這裡的myranks_train.txt ,應該是rank_file)
主要步驟:
1)  計算與使用者A互動過的使用者B的受歡迎度。
2)  在使用者A中,按受歡迎度對B重新進行排序。
3)  按user_recommend.txt使用者A對應的使用者B的排序,儲存使用者A對應的使用者B的排名,並輸出到rank_file

如下: 是某個使用者A,基於模型後的排名
這裡寫圖片描述

  • 6.evaluate
import evaluate
evaluate.evaluate('labels_train.txt', 'myranks_train.txt') (這裡的myranks_train.txt ,應該是rank_file)
主要步驟:
1)  計算模型的DCG
2)  計算理想ideaDCG
3)  求NDCG=DCG/ideaDCG
4)  求總的平均NDCG,作為最後的評判標準,值越大越好。

4、模型NDCG評分

1)主要指標說明
[email protected]指取top10個被推薦使用者進行效果評估,該值越大,排序質量越好。
NDCG=DCG/ideaDCG; 全域性NDCG為總的平均NDCG

這裡寫圖片描述

這裡寫圖片描述
其中,表示模型給出的排序中,排名為的候選會員的實際 ACTION 值(msg=2,click=1,rec=0)
ideaDCG 表示按實際動作強度排序後的DCG

2)計算例項:
注:以下操作行為,做了處理(如果A對B產生多個行為,取行為最強的,msg(2)>click(1)>rec(0))
使用者A對20個使用者操作情況
對應的操作行為 ‘0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1\n
對應基於模型的排名 14 15 8 3 16 19 6 10 13 11 18 5 20 17 1 4 2 12 7 9

a. 模型DCG
這裡寫圖片描述

b. ideaDCG(即基於實際action排名後計算DCG)
這裡寫圖片描述

c. 最終的NDCG
這裡寫圖片描述