【问题标题】:Run JesterRecommenderEvaluationRunner, but get no results of evaluation运行 JesterRecommenderEvaluationRunner,但没有得到评估结果
【发布时间】:2013-04-03 06:51:43
【问题描述】:

我在 Mahout 中下载了 Jester 示例代码,并尝试在 jester 数据集上运行它以查看评估结果。运行成功,但控制台只有结果:

log4j:WARN No appenders could be found for logger (org.apache.mahout.cf.taste.impl.model.file.FileDataModel).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

我希望看到评估分数范围从 0 到 10。任何人都可以帮助我了解如何获得分数?

我正在使用 mahout-core-0.6.jar,代码如下:

JesterDataModel.java:
package Jester;

import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.regex.Pattern;

import com.google.common.collect.Lists;
import org.apache.mahout.cf.taste.example.grouplens.GroupLensDataModel;
import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
import org.apache.mahout.cf.taste.impl.model.GenericDataModel;
import org.apache.mahout.cf.taste.impl.model.GenericPreference;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.model.Preference;
import org.apache.mahout.common.iterator.FileLineIterator;
//import org.apache.mahout.cf.taste.impl.common.FileLineIterable;

public final class JesterDataModel extends FileDataModel {

  private static final Pattern COMMA_PATTERN = Pattern.compile(",");

  private long userBeingRead;

  public JesterDataModel() throws IOException {
    this(GroupLensDataModel.readResourceToTempFile("\\jester-data-1.csv"));
  }


  public JesterDataModel(File ratingsFile) throws IOException {
     super(ratingsFile);
  }

  @Override
  public void reload() {
     userBeingRead = 0;
    super.reload();
  }

  @Override
  protected DataModel buildModel() throws IOException {
    FastByIDMap<Collection<Preference>> data = new FastByIDMap<Collection<Preference>>  ();
    FileLineIterator iterator = new FileLineIterator(getDataFile(), false);
    FastByIDMap<FastByIDMap<Long>> timestamps = new FastByIDMap<FastByIDMap<Long>>();
    processFile(iterator, data, timestamps, false);
    return new GenericDataModel(GenericDataModel.toDataMap(data, true));
  }

   @Override
  protected void processLine(String line,
                         FastByIDMap<?> rawData,
                         FastByIDMap<FastByIDMap<Long>> timestamps,
                         boolean fromPriorData) {
  FastByIDMap<Collection<Preference>> data = (FastByIDMap<Collection<Preference>>) rawData;
  String[] jokePrefs = COMMA_PATTERN.split(line);
  int count = Integer.parseInt(jokePrefs[0]);
  Collection<Preference> prefs = Lists.newArrayListWithCapacity(count);
  for (int itemID = 1; itemID < jokePrefs.length; itemID++) { // yes skip first one, just a count
   String jokePref = jokePrefs[itemID];
  if (!"99".equals(jokePref)) {
    float jokePrefValue = Float.parseFloat(jokePref);
    prefs.add(new GenericPreference(userBeingRead, itemID, jokePrefValue));
  }
}
data.put(userBeingRead, prefs);
userBeingRead++;

}

}

JesterRecommenderEvaluatorRunner.java
package Jester;

import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.eval.RecommenderEvaluator;
import org.apache.mahout.cf.taste.impl.eval.AverageAbsoluteDifferenceRecommenderEvaluator;
import org.apache.mahout.cf.taste.model.DataModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;

public final class JesterRecommenderEvaluatorRunner {

  private static final Logger log = LoggerFactory.getLogger(JesterRecommenderEvaluatorRunner.class);

  private JesterRecommenderEvaluatorRunner() {
    // do nothing
  }

  public static void main(String... args) throws IOException, TasteException {
    RecommenderEvaluator evaluator = new AverageAbsoluteDifferenceRecommenderEvaluator();
    DataModel model = new JesterDataModel();
    double evaluation = evaluator.evaluate(new JesterRecommenderBuilder(),
                                       null,
                                       model,
                                       0.9,
                                       1.0);
    log.info(String.valueOf(evaluation));
  }

}

【问题讨论】:

    标签: mahout recommendation-engine mahout-recommender


    【解决方案1】:

    Mahout 0.7 很旧,0.6 很旧。以后从 SVN 至少使用 0.7 或更好。 我认为问题正是您所确定的:您的类路径中没有任何 slf4j 绑定。如果您在 Mahout 中使用“.job”文件,您将拥有所有依赖包。然后你会真正看到输出。

    【讨论】:

    • 感谢您的回复。我现在使用github.com/apache/mahout 中发布的最新 cf jester 示例,并导入以下 jar 文件: mahout-core-0.7.jar mahout-core-0.7-job.jar mahout-examples-0.7.jar mahout-examples-0.7 -job.jar mahout-integration-0.7.jar mahout-math-0.7.jar。现在我得到了同样的错误,我下载了 mahout 0.7 发行版,因为它是我能找到的最新版本,我在发行文件夹中找不到你提到的 .job 文件?
    • 运行mvn package 后在target 中查找.job 文件。除了core,你什么都不需要。当然,您也可以通过 Maven 包含所有这些,这更容易——如果您使用 Maven 进行演示。
    • 我实际上找到了三个 .job jar 文件。它们是 mahout-core-0.2-SNAPSHOT.job mahout-examples-0.2-SNAPSHOT.job mahout-utils-0.2-SNAPSHOT.jar 我看到网上有人在谈论 0.8-SNAPSHOT.job,可我找不到地方下载 0.8-SNAPSHOT.job 文件?我在 IBM 网站上的教程示例中找到了这个 0.2 版本。
    • 0.2 是古老的,绝对不要使用它。如果你已经下载了发行版,只需mvn package 按照我所说的创建这些。或者,使用 Maven 将所有这些都包含在您的项目中,您无需构建任何东西。
    猜你喜欢
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2010-10-04
    • 2017-11-17
    • 2015-08-13
    • 2011-07-17
    • 1970-01-01
    • 2013-04-21
    相关资源
    最近更新 更多