在 pyspark mlib 中运行逻辑回归时出错
Posted
技术标签:
【中文标题】在 pyspark mlib 中运行逻辑回归时出错【英文标题】:Error while running Logistic Regression in pyspark mlib 【发布时间】:2019-12-11 14:06:21 【问题描述】:我有一个数据框(df_ml_nullable),像这样:
+-----+--------------------+
|label| features|
+-----+--------------------+
| 0.0|[127.0,132.0,123....|
| 0.0|[67.0,67.0,67.0,6...|
| 0.0|[-29.0,-30.0,-28....|
| 4.0|[31.0,31.0,31.0,3...|
| 0.0|[39.0,40.0,42.0,4...|
+-----+--------------------+
以下是此数据框的架构: df_ml_nullable.printSchema()
root
|-- label: double (nullable = false)
|-- features: vector (nullable = false)
我尝试像这样运行逻辑回归:
from pyspark.ml.linalg import Vectors
from pyspark.ml.classification import LogisticRegression
lr = LogisticRegression(maxIter=10, regParam=0.01)
(train_d,test_d)=df_ml_nullable.randomSplit([0.7, 0.3])
model1 = lr.fit(train_d)
当我尝试运行它时,我得到了这个错误: IllegalArgumentException: u'requirement failed: Column features must be of type struct,values:array> 但实际上是 struct,values:array>。'
有人遇到过这个问题吗?
【问题讨论】:
您应该检查您使用的矢量类型。根据您的 Spark 版本,spark.mllibs 和 spark.ml 之间可能存在冲突,如果您将一个包的回归与另一个包的向量类型一起使用,则会出现此错误。 @Vincent 非常感谢您的回复。特征列最初是一个双精度数组(collect_list 操作的输出)。我使用下面的 udf 将其转换为向量:def fn(row): ln = len(row) idx = range(ln) sp_vc = Vectors.sparse(ln,idx,row) return(Vectors.dense(row)) #return(sp_vc) usr_fn = F.udf(fn,VectorUDT()) df_indexed_vct = df_indexed.withColumn("features",usr_fn(F.col('pump_sequence')))
那么在 udf 的返回类型中我应该使用不同的向量类型吗?一个愚蠢的问题 - 如何在我的环境中检查 spark.ml 和 spark.mlib 的版本?
【参考方案1】:
问题在于导入。我没有从 ml 导入,而是从 mllib 导入向量。下面的更正起到了作用:
#from pyspark.mllib.linalg import Vectors, VectorUDT
from pyspark.ml.linalg import Vectors,VectorUDT
@Vincent - 感谢您的提示。
【讨论】:
以上是关于在 pyspark mlib 中运行逻辑回归时出错的主要内容,如果未能解决你的问题,请参考以下文章
PySpark MLLib Zeppelin Logistic回归度量标准错误:AssertionError:维度不匹配