2013-12-09 66 views
4

任何人都可以告訴我mahout的RecommenderIRStatsEvaluator是如何工作的?更具體地說,它是如何隨機分配培訓和測試數據以及比較結果的數據?根據我的理解,您需要某種理想/預期的結果,您需要將其與推薦算法的實際結果進行比較,以找出TP或FP,從而計算精確度或召回率。但它看起來像mahout提供了精度/召回分數沒有理想/結果。mahout的推薦評估人員如何工作

回答

9

將數據分成訓練和測試集,使用您在RecommenderIRStatsEvaluator類的evaluate方法中提供的某個相關性閾值。如果這個值是null有計算它的方法(computeThreshold)。將數據分成訓練和測試的班級是​​。如果您仔細查看代碼,您可以看到首先每個用戶的首選項按照降序排序,並且只有那些價值大於relevanceThreshold的用戶才被認爲是相關的。另請注意,最多隻能將at放入此組。

@Override 
    public FastIDSet getRelevantItemsIDs(long userID, 
             int at, 
             double relevanceThreshold, 
             DataModel dataModel) throws TasteException { 
    PreferenceArray prefs = dataModel.getPreferencesFromUser(userID); 
    FastIDSet relevantItemIDs = new FastIDSet(at); 
    prefs.sortByValueReversed(); 
    for (int i = 0; i < prefs.length() && relevantItemIDs.size() < at; i++) { 
     if (prefs.getValue(i) >= relevanceThreshold) { 
     relevantItemIDs.add(prefs.getItemID(i)); 
     } 
    } 
    return relevantItemIDs; 
    } 

如何計算精度和召回率,您可以在RecommenderIRStatsEvaluator.evaluate方法中看到。簡而言之就是這樣的: 首先一次只評估一個用戶。他的偏好值被分成相關的(如上所述)和其他。相關的被用作測試集,其他用戶被用作訓練。然後top-at建議爲此用戶生成。接下來,該方法看起來有些已採取留作測試集的項目是否出現在推薦,又有多少:

int intersectionSize = 0; 
     List<RecommendedItem> recommendedItems = recommender.recommend(userID, at, rescorer); 
     for (RecommendedItem recommendedItem : recommendedItems) { 
     if (relevantItemIDs.contains(recommendedItem.getItemID())) { 
      intersectionSize++; 
     } 
    } 

精度比計算如下:

(double) intersectionSize/(double) numRecommendedItems 

哪裏numRecommendedItems是通常你的at,如果推薦人產生至少at建議,否則更小。

類似,召回計算如下:

(double) intersectionSize/(double) numRelevantItems 

numRelevantItems其中在該用戶的測試集的項目數量。

最終精度和召回率是所有用戶的所有精度和召回的宏觀平均值。

希望這回答你的問題。

編輯:要繼續您的問題,評估推薦系統的IR統計數據(精確度和召回率)非常棘手,尤其是如果您的用戶偏好數量較少。在這book你可以找到非常有用的見解。它說,

它通常假定不喜歡的項目就一直沒 ,即使他們已建議即它們是無趣或無用的,用戶喜歡。然而,這可能並非如此,因爲不喜歡的項目可能包含一些用戶沒有選擇的有趣項目。例如,用戶可能不喜歡某個項目,因爲他不知道它的存在,但是在該建議暴露該項目之後,用戶可以決定選擇它。在任何情況下,當使用IR統計數據時,FP的數量都會超出估計值。

+0

非常感謝您的詳細解釋。我希望我有一天能夠回報你的幫助。 – rusho1234

+0

我很高興我能幫到你。 –