PySpark 中 MatrixFactorizationModel 的缓存因子

Caching factor of MatrixFactorizationModel in PySpark

加载保存的 MatrixFactorizationModel 后,我收到警告: MatrixFactorizationModelWrapper:乘积因子没有分区器。对个别记录的预测可能很慢。 MatrixFactorizationModelWrapper:未缓存乘积因子。预测可能会很慢。

而且计算确实很慢,而且无法很好地扩展

如何设置分区程序并缓存产品因子?

添加演示问题的代码:

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 行,位于 model.productFeatures.cache() AttributeError: 'function' 对象没有属性 'cache'

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

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

EDIT: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 算法中按特征进行分区。