PySpark中MatrixFactorizationModel的缓存因子

时间:2015-08-25 13:37:14

标签: apache-spark pyspark rdd apache-spark-mllib

加载已保存的MatrixFactorizationModel后,我收到警告:   MatrixFactorizationModelWrapper:产品因子没有分区程序。对个别记录的预测可能很慢。   MatrixFactorizationModelWrapper:不缓存产品因子。预测可能很慢。

实际上计算速度慢,不能很好地扩展

如何设置分区器并缓存Product factor?

添加演示问题的代码:

from pyspark import SparkContext
import sys

sc = SparkContext("spark://hadoop-m:7077", "recommend")    
from pyspark.mllib.recommendation import ALS, MatrixFactorizationModel, Rating
model = MatrixFactorizationModel.load(sc, "model")
model.productFeatures.cache()

我得到:

追踪(最近一次通话):   文件" /home/me/recommend.py" ;,第7行,in     model.productFeatures.cache() AttributeError:'功能'对象没有属性'缓存'

1 个答案:

答案 0 :(得分:4)

关于缓存,就像我在评论框中写的那样,您可以缓存您的rdd执行以下操作:

rdd.cache() # for Scala, Java and Python

编辑:userFeatures和productFeatures都是RDD [(Int,Array [Double])类型。 (参考Official Documentation

要缓存productFeature,您可以执行以下操作

model.productFeatures().cache() 

当然我认为加载的模型叫做模型。

示例:

r1 = (1, 1, 1.0)
r2 = (1, 2, 2.0)
r3 = (2, 1, 2.0)

ratings = sc.parallelize([r1, r2, r3])

from pyspark.mllib.recommendation import ALS

model = ALS.trainImplicit(ratings, 1, seed=10)
model.predict(2, 2)

feats = model.productFeatures()

type(feats)

>> MapPartitionsRDD[137] at mapPartitions at PythonMLLibAPI.scala:1074
feats.cache()

至于有关分区程序的警告,即使你对模型进行分区,也可以通过.partitionBy()的功能来说明它以平衡它仍然是太昂贵的性能。

有关此问题的JIRA票证(SPARK-8708)应在下一版Spark(1.5)中解决。

尽管如此,如果您想了解有关分区算法的更多信息,我邀请您阅读此故障单SPARK-3717中的讨论,其中讨论了DecisionTree和RandomForest算法中的功能划分。