Pyspark Logistic回归拟合RDD对象没有属性_jdf错误

时间:2019-06-06 08:09:34

标签: python numpy apache-spark machine-learning pyspark

我正在使用python创建Logistic回归,并将其设置为mllib以提高性能

我安装了spark和pyspark。

我的数据存储在numpy数组中,我可以轻松地将其转换为pandas数据框。

我试图创建一个Spark数据框来填充模型,但是创建数据框太慢了,而使用常规Sklearn总体上就快了

我发现使用带conf的Arrow算法

  

('spark.sql.execution.arrow.enabled','true')

可以使其更快,但是它仍然太慢了,甚至没有利用内核(我检查了我的配置,并且执行程序和驱动程序都设置为具有多个内核,但是没有被利用)

我尝试使用RDD代替具有此代码的数据框

d = [row.tolist() for row in encoded_data] 
d = [LabeledPoint(label, row) for label, row in zip(y_train, d)]
rdd = spark.parallelize(d)
lr.fit(rdd)

但我一直收到此错误

  

AttributeError:“ RDD”对象没有属性“ _jdf”

我发现了https://firebase-php.readthedocs.io/en/latest/user-management.html个关于类似问题的问题,但这并不能解决我的问题,我的数据不是来自文本文件,而是来自一个numpy数组,我可以将数据写入文件,然后读取它,但在我的用例中没有意义。

我想找到一种使用numpy数组中的数据的更好方法-我有两个数组-一个比(n * m)个要素尺寸数组编码的数据,以及一个(n * 1)个标签数组的y_train 。我需要将其反馈到Logistic回归中,以缩短培训时间。

数据密集是有原因的,它们是数字特征向量,而不是热点,我转向Spark的原因是利用了Sklearn训练中未使用的局部核。

谢谢。

1 个答案:

答案 0 :(得分:2)

错误的根源是使用不兼容的API。

Spark提供了两个ML API:

  • 用于pyspark.mllib的旧RDD
  • 新的pyspark.ml旨在与DataFrame s一起使用

lr对象显然属于后者,而parallelizeRDD。请参阅评论中的建议What's the difference between Spark ML and MLLIB packages

另外,您的整个前提是错误的。如果您可以使用标准Python库轻松地在单个节点上的本地数据上训练模型,那么Spark ML将没有机会在这里赢得胜利。 Spark的全部目的是将流程扩展到大型数据集,而不是减少延迟。

请参见Why is Apache-Spark - Python so slow locally as compared to pandas?

最重要的是,使用密集结构(我想这就是NumPy数组的意思)来表示一键热编码的数据效率非常低,并且总体上会显着影响性能(Spark带有自己的Pipeline API) ,该工具与其他工具一起提供one-hot-encoder产生稀疏表示)。

最终并行化本地集合是一种测试和开发工具,而不是生产解决方案。