4

初歩的な質問で申し訳ありませんが、私は MAHOUT を初めて使用するので、MovieLens データセットでいくつかのテストを行う必要があります。u1base.csv を使用してレコメンダーをトレーニングし、u1test.csv を使用してレコメンダーをテストして精度と再現率を判断できるかどうか知りたいことは何ですか?

評価について見つけた例は、データをスリップさせるだけですが、u1base を使用してトレーニングし、u1test をテストしたいと考えています。

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());
  }

どんな助けでも大歓迎です

4

1 に答える 1

1

GenericRecommenderIRStatsEvaluator (デフォルト) は、異なるテストおよびトレーニング データセットをサポートしていません。しかし、本当にこれが必要な場合は、カスタム Evaluator を作成できます。これを行うには、IRStatsEvaluator の内部を理解する必要があります。

エバリュエーターは、すべてのユーザーに対して、最も関連性の高いアイテム、つまり上位(たとえば 10 個) のアイテムを取得しようとします。次に、このユーザーのレコメンダーを構築して実行し、レコメンデーションでトップなります。

A = 最も関連性の高いアイテムのセット = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

B = 推奨アイテムのセット = {1,2, 11, 12, 13}

ここで精度は、関連する推奨アイテムの割合です。(レコメンデーション内の項目のうち、関連する項目の数) つまり、精度 = A 交差 B / カウント (B) = 5 のうちの 2 つ、つまり 0.4

再現率は、おすすめ商品に含まれる該当商品の割合です。つまり、リコール = A 交差点 B / count(A) = 10 のうち 2、つまり 0.2

したがって、ここでのロジックは 2 セットのアイテム (最も関連性が高く、最も推奨される) を取得します。IRStatsEvaluator のデフォルトの実装は、単一の datamodel に基づいて、これら 2 つのセットを見つけます。そして、これを次の方法でカスタマイズする必要があります。

  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);
    .......

}

これらの変更以外は、すべてそのままにしておいてください。それが動作します!!!

于 2014-10-16T09:14:40.117 に答える