【问题标题】:Spark mllib : how to convert string categorical features into int for Rating to acceptSpark mllib:如何将字符串分类特征转换为 int 以供 Rating 接受
【发布时间】:2016-12-03 21:53:06
【问题描述】:

我想使用 spark mllib 和协同过滤技术中的 ALS 算法构建一个推荐应用程序。我的数据集具有字符串形式的用户和产品特征,例如:

[{"user":"StringName1", "product":"StringProduct1", "rating":1},
 {"user":"StringName2", "product":"StringProduct2", "rating":2},
 {"user":"StringName1", "product":"StringProduct2", "rating":3},..]

Rating 方法似乎只接受用户和产品功能的 int 值。这是否意味着我必须构建一个单独的字典来将每个字符串映射到一个 int?我的数据集将包含用户和产品的重复条目。mllib 库本身是否有内置解决方案?

感谢您的帮助!

编辑:不,这不是重复的,因为该问题的答案似乎不适合我的情况。 spark.ml.recommendation.ALS.Rating 库似乎不支持 useritem 的字符串值。我需要这种支持。

【问题讨论】:

  • 表格或数据集是什么?是RDD[(String, String, Float)]吗?
  • @JohnTitusJungao 是的。
  • @void JohnTitusJungao 的回答应该足够了。你不会在这里期待别的,对吧?
  • @zero323 不,这对我有好处。只是想知道 ml 模块是否有一个解决方案可以接受用户或项目的字符串值,因为您将其标记为重复。
  • 其实我错了。我以为字符串有specialized ALS 版本,但它只有IntLong。不过,您可以使用 StringIndexer 和管道。

标签: scala apache-spark apache-spark-mllib collaborative-filtering


【解决方案1】:

让我试试。假设data: RDD[(String, String, Float)]

import org.apache.spark.mllib.recommendation.Rating

val data = sc.parallelize(Array(("StringName1", "StringProduct1", 1.0), ("StringName2", "StringProduct2", 2.0), ("StringName3", "StringProduct3", 3.0)))

//get distinct names and products and create maps from them
val names = data.map(_._1).distinct.sortBy(x => x).zipWithIndex.collectAsMap
val products = data.map(_._2).distinct.sortBy(x => x).zipWithIndex.collectAsMap

//convert to Rating format
val data_rating = data.map(r => Rating(names(r._1).toInt, products(r._2).toInt, r._3))

应该这样做。基本上,您只需创建一个从 string 到 long 的映射,然后将 long 转换为 int。

【讨论】:

  • 但是在这样做之后,我如何在训练后进行预测?假设我有一个 (names, products) 元组来预测评级。如何将名称映射到训练集中的相应索引?
  • 如果你有new_data: RDD[(String, String)],你必须创建val new_data_rating = new_data.map(r =>(names(r._1).toInt, products(r._2).toInt)),然后把它输入model.predict。
  • 最后一个问题。那么,如果在我的new_data_rating 中,有一个名称不存在于训练集中怎么办。这应该是由ALS算法处理的,但这里我必须处理它?
  • 这是个好问题。基本上,ALS 算法所做的是使用它已经看到的行和列来分解由data 形成的矩阵。当你对一个新的(name, product) 对执行预测时,它会搜索名称的因子和产品的因子,然后计算相应的评分。
  • @void 如果训练数据中不存在用户或产品,则 ALS 无法处理此问题。
猜你喜欢
  • 2016-03-01
  • 2017-03-24
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 2016-02-25
  • 2016-12-10
  • 2017-07-01
相关资源
最近更新 更多