Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 所有返回都为空_Apache Spark_Machine Learning_Pyspark_Rdd_Apache Spark Mllib - Fatal编程技术网

Apache spark 所有返回都为空

Apache spark 所有返回都为空,apache-spark,machine-learning,pyspark,rdd,apache-spark-mllib,Apache Spark,Machine Learning,Pyspark,Rdd,Apache Spark Mllib,我有以下Python测试代码(ALS.train的参数在别处定义): 这是有效的,因为预测变量和输出的计数为1: [(2, 1)] 1 ParallelCollectionRDD[2691] at parallelize at PythonRDD.scala:423 但是,当我尝试使用RDD时,我使用以下代码创建了自己的RDD,它似乎不再工作: model = ALS.train(ratings, rank, numIter, lmbda) validation_data = validati

我有以下Python测试代码(ALS.train的参数在别处定义):

这是有效的,因为预测变量和输出的计数为1:

[(2, 1)]
1
ParallelCollectionRDD[2691] at parallelize at PythonRDD.scala:423
但是,当我尝试使用
RDD
时,我使用以下代码创建了自己的RDD,它似乎不再工作:

model = ALS.train(ratings, rank, numIter, lmbda)
validation_data = validation.map(lambda xs: tuple(int(x) for x in xs))
predictions = model.predictAll(validation_data)

print validation_data.take(1)
print predictions.count()
print validation_data
哪些产出:

[(61, 3864)]
0
PythonRDD[4018] at RDD at PythonRDD.scala:43

如您所见,
predictAll
在传递映射的
RDD
时返回为空。输入的值都是相同的格式。我能看到的唯一明显的区别是,第一个示例使用parallelize并生成一个
ParallelCollectionRDD
,而第二个示例只使用一个map,它生成一个
PythonRDD
predictAll
是否仅在通过某种类型的
RDD
时才起作用?如果是,是否可以在
RDD
类型之间进行转换?我不知道该怎么做

在两种基本条件下,
MatrixFactorizationMode.predictAll
可能返回的RDD项目数低于输入:

  • 培训集中缺少用户
  • 培训集中缺少产品
您可以很容易地重现这种行为,并检查它是否与RDD的创建方式无关。首先,让我们使用示例数据构建模型:

from pyspark.mllib.recommendation import ALS, MatrixFactorizationModel, Rating

def parse(s):
    x, y, z  = s.split(",")
    return Rating(int(x), int(y), float(z))

ratings = (sc.textFile("data/mllib/als/test.data")
  .map(parse)
  .union(sc.parallelize([Rating(1, 5, 4.0)])))

model = ALS.train(ratings, 10, 10)
接下来,让我们看看培训数据中存在哪些产品和用户:

set(ratings.map(lambda r: r.product).collect())
## {1, 2, 3, 4, 5}

set(ratings.map(lambda r: r.user).collect())
## {1, 2, 3, 4}
现在让我们创建测试数据并检查预测:

valid_test = sc.parallelize([(2, 5), (1, 4), (3, 5)])
valid_test
## ParallelCollectionRDD[434] at parallelize at PythonRDD.scala:423

model.predictAll(valid_test).count()
## 3
到目前为止还不错。接下来,让我们使用与代码中相同的逻辑对其进行映射:

valid_test_ = valid_test.map(lambda xs: tuple(int(x) for x in xs))
valid_test_
## PythonRDD[497] at RDD at PythonRDD.scala:43

model.predictAll(valid_test_).count()
## 3
还好。接下来,让我们创建无效数据并重复实验:

invalid_test = sc.parallelize([
  (2, 6), # No product in the training data
  (6, 1)  # No user in the training data
])
invalid_test 
## ParallelCollectionRDD[500] at parallelize at PythonRDD.scala:423

model.predictAll(invalid_test).count()
## 0 

invalid_test_ = invalid_test.map(lambda xs: tuple(int(x) for x in xs))
model.predictAll(invalid_test_).count()
## 0
正如预期的那样,没有对无效输入的预测

最后,您可以通过使用完全独立于Python代码的训练/预测的ML模型来确认这一点:

from pyspark.ml.recommendation import ALS as MLALS

model_ml = MLALS(rank=10, maxIter=10).fit(
    ratings.toDF(["user", "item", "rating"])
)
model_ml.transform((valid_test + invalid_test).toDF(["user", "item"])).show()

## +----+----+----------+
## |user|item|prediction|
## +----+----+----------+
## |   6|   1|       NaN|
## |   1|   4| 1.0184212|
## |   2|   5| 4.0041084|
## |   3|   5|0.40498763|
## |   2|   6|       NaN|
## +----+----+----------+

正如您所看到的,培训数据中没有相应的用户/项目意味着没有预测。

不幸的是,第一段代码没有任何意义。您有2个入口评级和1个预测输出。这是两个小的评估任何东西。至于第二部分,不清楚你的评分是多少。他们有多少人?您的秩超参数使用什么值,或者您的训练应该执行多少次迭代,等等?根据提供的信息,您的问题不太可能得到解决。请阅读要点,虽然第一段代码中的预测不相关,但它仍会生成预测。第二段代码使用相同的秩和迭代,不会生成预测。验证数据包含8000个用户、产品id。您可以在第二个输出中看到它们的样子:[(613864)]。对于ALS模型,两者都使用相同的训练数据。很好的解释。让我意识到我的培训集缺少用户。
from pyspark.ml.recommendation import ALS as MLALS

model_ml = MLALS(rank=10, maxIter=10).fit(
    ratings.toDF(["user", "item", "rating"])
)
model_ml.transform((valid_test + invalid_test).toDF(["user", "item"])).show()

## +----+----+----------+
## |user|item|prediction|
## +----+----+----------+
## |   6|   1|       NaN|
## |   1|   4| 1.0184212|
## |   2|   5| 4.0041084|
## |   3|   5|0.40498763|
## |   2|   6|       NaN|
## +----+----+----------+