在 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,逻辑回归,如何获得各个特征的系数

PySpark MLLib Zeppelin Logistic回归度量标准错误:AssertionError:维度不匹配

如何使用 PySpark 测量逻辑回归的精度和召回率?

使用 Adam 优化器在 FashionMNIST 上训练逻辑回归时出错

运行pyspark时出错

当我在 pyspark EMR 5.x 中运行用 Java 编写的 hive UDF 时出错