在pysp中转换ALS的输入数据

2024-05-15 12:09:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我的推荐输入数据如下:

[(u'97990079', u'18_34', 2),
 (u'585853655', u'11_8', 1),
 (u'1398696913', u'6_20', 1),
 (u'612168869', u'7_16', 1),
 (u'2272846159', u'11_17', 2)]

其格式为(user_id, item_id, score)。在

如果我理解正确的话,spark中的ALS必须在训练前将user_iditem_id转换成整数?如果是这样的话,我现在唯一能想到的解决方案就是使用字典,并将每个user_id和{}映射为整数

^{pr2}$

但我想知道有没有其他优雅的方法可以做到这一点?谢谢!在


Tags: 数据方法id字典格式整数解决方案item
1条回答
网友
1楼 · 发布于 2024-05-15 12:09:34

处理这个问题的一种方法是使用ML转换器。首先,将数据转换为数据帧:

ratings_df = sqlContext.createDataFrame([
    (u'97990079', u'18_34', 2), (u'585853655', u'11_8', 1),
    (u'1398696913', u'6_20', 1), (u'612168869', u'7_16', 1),
    (u'2272846159', u'11_17', 2)],
    ("user_id", "item_id_str", "rating"))

接下来我们需要一个StringIndexer

^{pr2}$

最后,使用索引器转换数据帧:

from pyspark.sql.functions import col

transformed = (indexer
    .fit(ratings_df)
    .transform(ratings_df)
    .withColumn("user_id", col("user_id").cast("integer"))
    .select("user_id", "item_id", "rating"))

并转换为RDD[Rating]

from pyspark.mllib.recommendation import Rating

ratings_rdd = transformed.map(lambda r: Rating(r.user_id, r.item_id, r.rating))

在Spark的新版本中,您可以跳过转换,直接使用ml.recommendation.ALS

from pyspark.ml.recommendation import ALS

als = (ALS(userCol="user_id", itemCol="item_id", ratingCol="rating")
  .fit(transformed))

相关问题 更多 >