【问题标题】:Apache Mahout not giving any recommendationApache Mahout 没有给出任何建议
【发布时间】:2017-09-14 07:06:57
【问题描述】:

我正在尝试使用 mahout 进行推荐但没有得到任何建议。

我的数据集:

0,102,5.0
1,101,5.0
1,102,5.0

代码:

      DataModel datamodel = new FileDataModel(new File("dataset.csv"));
        // Creating UserSimilarity object.
        UserSimilarity usersimilarity = new PearsonCorrelationSimilarity(datamodel);

        // Creating UserNeighbourHHood object.
        UserNeighborhood userneighborhood = new ThresholdUserNeighborhood(0.1, usersimilarity, datamodel);

        // Create UserRecomender
        UserBasedRecommender recommender = new GenericUserBasedRecommender(datamodel, userneighborhood, usersimilarity);

        List<RecommendedItem> recommendations = recommender.recommend(0, 1);

        for (RecommendedItem recommendation : recommendations) {
            System.out.println(recommendation);
        }

我使用的是 Mahout 版本:0.13.0

理想情况下,应该推荐item_id = 101' to 'user_id = 0' asuser = 0anduser = 1have item 102 common show it should recommenditem_id = 101touser_id = 0`

日志:

18:08:11.669 [main] INFO org.apache.mahout.cf.taste.impl.model.file.FileDataModel - Creating FileDataModel for file dataset.csv
18:08:11.700 [main] INFO org.apache.mahout.cf.taste.impl.model.file.FileDataModel - Reading file info...
18:08:11.702 [main] INFO org.apache.mahout.cf.taste.impl.model.file.FileDataModel - Read lines: 3
18:08:11.722 [main] INFO org.apache.mahout.cf.taste.impl.model.GenericDataModel - Processed 2 users
18:08:11.738 [main] DEBUG org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender - Recommending items for user ID '0'

【问题讨论】:

  • Scala/v0.13.0 是一个选项吗? v 0.10 已经过时了。 (昨晚下降了 0.13.0)。
  • 确定尝试使用 v0.13
  • 不走运,仍然一无所获

标签: java dictionary machine-learning mahout mahout-recommender


【解决方案1】:

Mahout 中的 Hadoop Mapreduce 代码已被弃用。新的推荐代码以 @rawkintrevo 的示例开头。如果您是 Scala 程序员,请关注他们。

大多数工程师想要一个无需修改即可工作的系统,Mahout 算法封装在构建于 Apache PredictionIO 之上的 Universal Recommender 中。它有一个服务器来接受事件,就像你的例子中的那样,它有内部事件存储和一个结果查询服务器。对旧的 Mapreduce 代码有许多改进,包括使用实时用户行为来提出建议。无论是新的 Mahout 还是旧的包含用于输入和查询的服务器,Universal Recommender 都具有两者的 REST 端点。

鉴于您使用的代码将被弃用,我强烈建议您深入研究 Mahout 代码(@rawkintrevo 的示例)或查看完整的端到端系统 The Universal Recommender。

  • 使用“单机”设置安装 PredictionIO here 或使用我们预先打包的 AWS AMI here 真正快捷地设置它包括预安装的 PIO 和 Universal Recommender。
  • 添加 UR 模板here
  • 用于向推荐者发送事件的 Java SDK here

完成此设置后,您可以处理配置、REST 或 Java SDK 和 PIO CLI。无需 Scala 编码。

【讨论】:

  • 是预测 Io 下一个版本的 mahout
  • 不,0.13.1 是。 PredictionIO 具有通用推荐器,后者又是端到端管道。由于您无法运行简单的示例,因此 pat 建议您尝试使用更多的交钥匙功能。
【解决方案2】:

我有三个基于版本 0.13.0 的示例(以及轮回所需的 Scala,R-Like Scala DSL Mahout 使用 v0.10+)

步行

第一个例子是一个非常缓慢的遍历: https://gist.github.com/rawkintrevo/3869030ff1a731d43c5e77979a5bf4a8 并且是作为 Pat Ferrels 博客文章/幻灯片的伴侣。 http://actionml.com/blog/cco

抓取

第二个例子更“真实”一点,因为它利用了SimilarityAnalysis.cooccurrencesIDSs(...,这是 CCO 算法的专有接口。

https://gist.github.com/rawkintrevo/c1bb00896263bdc067ddcd8299f4794c

运行

这里我们使用“真实”数据。 MovieLens 数据集没有足够的内容来展示 CCO 的多模式能力(推荐多种用户行为的能力)。在这里,我们加载“真实”数据并生成推荐。 https://gist.github.com/rawkintrevo/f87cc89f4d337d7ffea80a6af3bee83e

结论 我知道您特别要求 Java,但是 Apache Mahout 目前不适合 Java。从理论上讲,您可以将 Scala 导入您的 Java,或者将这些函数包装在另一个对 Java 更友好的函数中……我在深夜(或可能在梦中)听到谣言说某些地方的一些研究生正在研究 Java API,但目前不在后备箱中,也没有 PR,也不是路线图中的子弹。

希望以上内容能提供一些见解。

附录

最简单的 Stackoverflow 示例(您可以通过键入 $MAHOUT_HOME/bin/mahout spark-shell 在 Mahout spark shell 中以交互方式运行此示例(假设设置了 SPARK_HOME、JAVA_HOME 和 MAHOUT_HOME):

val inputRDD = sc.parallelize(Array(  ("u1", "purchase",    "iphone"),
  ("u1","purchase","ipad"),
  ("u2","purchase","nexus"),
  ("u2","purchase","galaxy"),
  ("u3","purchase","surface"),
  ("u4","purchase","iphone"),
  ("u4","purchase","galaxy"),
  ("u1","category-browse","phones"),
  ("u1","category-browse","electronics"),
  ("u1","category-browse","service"),
  ("u2","category-browse","accessories"),
  ("u2","category-browse","tablets"),
  ("u3","category-browse","accessories"),
  ("u3","category-browse","service"),
  ("u4","category-browse","phones"),
  ("u4","category-browse","tablets")) )



import org.apache.mahout.math.indexeddataset.{IndexedDataset, BiDictionary}
import org.apache.mahout.sparkbindings.indexeddataset.IndexedDatasetSpark

val purchasesIDS = IndexedDatasetSpark.apply(inputRDD.filter(_._2 == "purchase").map(o => (o._1, o._3)))(sc)
val browseIDS = IndexedDatasetSpark.apply(inputRDD.filter(_._2 == "category-browse").map(o => (o._1, o._3)))(sc)

import org.apache.mahout.math.cf.SimilarityAnalysis

val llrDrmList = SimilarityAnalysis.cooccurrencesIDSs(Array(purchasesIDS, browseIDS),
  randomSeed = 1234,
  maxInterestingItemsPerThing = 3,
  maxNumInteractions = 4)

val llrAtA = llrDrmList(0).matrix.collect

IndexedDatasetSpark.apply( 需要RDD[(String, String)],其中第一个字符串是“行”(例如用户),第二个字符串是“行为”,因此对于“购买矩阵”,列将是“产品”,但这也可以是一个“性别”矩阵,有两列(男性/女性)

然后将 IndexedDataSets 数组传递给SimilarityAnalysis.cooccurrencesIDSs(

【讨论】:

  • 这很酷,但请你帮我处理我上面的数据集。 Java 和 scala 是相似的,如果你用任何一种语言举个例子都不难。但问题是,对于某些数据集,我得到了输出,而对于某些数据集却没有。所以这就是我发布非常简单的数据集的原因。
  • 您能描述一下您的数据集吗?是用户 ID、操作、产品 ID 吗?
  • 是 userId,productId,preferenceValue
  • 查看 pat 的答案,但尝试将您的输入重构为 userID、action、productID
  • 我很惊讶为什么这个非常简单的用例不适用于 Mahout
猜你喜欢
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 2013-05-10
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
相关资源
最近更新 更多