2014-01-27 97 views
4

對不起,如果這是一個noob問題,但我是MAHOUT的新手,我必須用MovieLens數據集做一些測試。我想知道是否可以使用u1base.csv訓練推薦人,並使用u1test.csv測試推薦人來確定精確度和召回率?用MAHOUT測試和訓練不同的數據集

我發現關於評估的例子,他們只是拖動數據,但我想用u1base來訓練和測試。

u1base.csv和u1test.csv具有相同的格式「UserId,Item,Rating」。

Java代碼,我有:

 File userPreferencesFile = new File("u1base.csv"); 
     File userTeste = new File("u1test.csv"); 
     RandomUtils.useTestSeed(); 

     DataModel dataModel = new FileDataModel(userPreferencesFile); 
     DataModel testModel = new FileDataModel(userTeste); 


     RecommenderIRStatsEvaluator recommenderEvaluator = new GenericRecommenderIRStatsEvaluator(); 

     RecommenderBuilder recommenderBuilder = new RecommenderBuilder() { 
      @Override 
      public Recommender buildRecommender(DataModel dataModel) throws TasteException { 
       UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(dataModel); 
       UserNeighborhood userNeighborhood = new NearestNUserNeighborhood(10, userSimilarity, dataModel); 

       return new GenericUserBasedRecommender(dataModel, userNeighborhood, userSimilarity); 
      } 
     }; 

     IRStatistics statistics = 
       recommenderEvaluator.evaluate(
         recommenderBuilder, null, dataModel, null, 2, GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD, 1.0); 
     System.out.format("The recommender precision is %f%n", statistics.getPrecision()); 
     System.out.format("The recommender recall is %f%n", statistics.getRecall()); 
    } 

任何幫助將非常感激

回答

1

GenericRecommenderIRStatsEvaluator(默認)不支持不同的測試&訓練數據集。但如果我們真的想要這樣,我們可以編寫我們的自定義評估器。爲此,我們需要了解IRStatsEvaluator的內部結構。

對於每個用戶,評估者試圖獲取最相關的項目,即頂部(比如10)項目。然後它會建立&運行該用戶的推薦人&獲得頂部建議。

A =設定最相關的項= {1,2,3,4,5,6,7,8,9,10}

B =組推薦項= {1,2,11的,12,13}

現在精度是相關推薦項目的比例。 (有多少在建議的項目是相關的) 即精度= A交點B /計數(B)= 2 OUF 5即0.4

召回的是相關的項目中包括的推薦項的比例。 即召回=交點B /計數(A)= 2(即10)即0.2

因此,這裏的邏輯是獲得兩組物品(最相關的&最推薦)。 IRStatsEvaluator的默認實現將基於單個數據模型找到這兩組。我們需要在下面的方式來定製這樣的:

  1. 相關項目應根據測試數據集
  2. 推薦的項目來計算應根據訓練集計算。

以下是有關項目計算的地方。因此,而不是數據模型將測試數據模型傳遞給dataSplitter.getRelevantItemsIDs()。

//GenericRecommenderIRStatsEvaluator 
public IRStatistics evaluate(RecommenderBuilder recommenderBuilder, 
           DataModelBuilder dataModelBuilder, 
           DataModel dataModel, 
           IDRescorer rescorer, 
           int at, 
           double relevanceThreshold, 
           double evaluationPercentage) throws TasteException { 
    ....... 
    FastIDSet relevantItemIDs = dataSplitter.getRelevantItemsIDs(userID, at, theRelevanceThreshold, dataModel); 
    ....... 

} 

//CustomizedRecommenderIRStatsEvaluator  
public IRStatistics evaluate(RecommenderBuilder recommenderBuilder, 
           DataModelBuilder dataModelBuilder, 
           DataModel trainDataModel, 
           DataModel testDataModel, 
           IDRescorer rescorer, 
           int at, 
           double relevanceThreshold, 
           double evaluationPercentage) throws TasteException { 
    ....... 
    FastIDSet relevantItemIDs = dataSplitter.getRelevantItemsIDs(userID, at, theRelevanceThreshold, testDataModel); 
    ....... 

} 

除這些變化之外,其他所有事情都保持原樣。它會工作!

+0

對不起,我們不會爲這些信息提供指導。我一行一行地下載了mahout和調試過的所有源代碼。在我看來,這是瞭解任何框架內部的最佳方式。 我相信我們也可以通過調試瞭解上述問題的答案。 – Rajkumar

+0

舉個例子,我把它作爲10,10是相關項目的數量,即getRelevantItemIds()方法的輸出,其取得基於數據模型的所有相關項目。 5是推薦人給出的建議。我們只會指定推薦人提取的最大推薦數。而且,評估者不用於生產。其目的是比較不同的推薦人,並選擇適合我們領域的最佳人選。一旦我們決定合適的推薦人,我們將在我們的應用程序中使用它。 – Rajkumar

相關問題