5

推奨用の入力データは次のようになります。

[(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_id,item_idを整数に変換する必要がありますか? もしそうなら、私が今考えることができる唯一の解決策は、辞書を使用して、すべてを整数にマップするuser_idことitem_idです

dictionary for item_id : {'18_34': 1, '18_35':2, ...}
dictionary for user_id : {'97990079':1, '585853655':2, ...}

しかし、それを行うための他のエレガントな方法があるかどうか疑問に思っていましたか? ありがとう!

4

1 に答える 1

6

これを処理できる 1 つの方法は、ML トランスフォーマーを使用することです。まず、データを DataFrame に変換します。

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

from pyspark.ml.feature import StringIndexer

indexer = StringIndexer(inputCol="item_id_str", outputCol="item_id")

最後に、インデクサーを使用して DataFrame を変換します。

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))
于 2015-11-15T20:42:10.900 に答える