crossvalidator.fit()-illegalargumentexception:列预测的类型必须等于[数组< double>,数组< double>],但类型为double

lkaoscv7  于 2021-07-14  发布在  Spark
关注(0)|答案(1)|浏览(415)

以下是我用于python 3.9和spark 3.1.1的包:

from pyspark.ml import Pipeline
from pyspark.ml.feature import VectorAssemble, StringIndexer
from pyspark.ml.tuning import CrossValidator, ParamGridBuilder
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.evaluation import MultilabelClassificationEvaluator

我正在尝试推送一个矢量化的数据集 df_vec 由2列组成,其中包含crossvalidator函数的默认名称: features -矢量汇编程序中的矢量 label -从stringindexer索引的字符串数字。
这是一个带有6个标签的多项式logistic回归问题。 df_vec.printSchema() :

root
 |-- features: vector (nullable = true)
 |-- label: integer (nullable = true)

运行以下步骤来设置crossvalidator:

mlr = LogisticRegression()
mlr_evaluator = MultilabelClassificationEvaluator()
paramGrid = ParamGridBuilder() \
    .addGrid(mlr.maxIter, [200]) \
    .build()

cross_validator = CrossValidator(
    estimator=mlr,
    estimatorParamMaps=paramGrid,
    evaluator=mlr_evaluator
)

正在尝试将crossvalidator对象与 df_vec 引发异常: cv_model = cross_validator.fit(df_vec) :

pyspark.sql.utils.IllegalArgumentException: requirement failed:
Column prediction must be of type equal to one of the following types:
[array<double>, array<double>] but was actually of type double.

我能够确认仅使用mlr()转换的数据集的输出就有一列 prediction 带双字。

x = mlr.fit(df_vec).transform(df_vec)
x.printSchema()

root
 |-- features: vector (nullable = true)
 |-- label: integer (nullable = true)
 |-- rawPrediction: vector (nullable = true)
 |-- probability: vector (nullable = true)
 |-- prediction: double (nullable = false) <---

因此,crossvalidator似乎出于某种原因希望使用另一种格式。如果crossvalidator()是细粒度的,我可以尝试转换 prediction 使用 VectorAssembler ,但事实并非如此。
有人知道怎么解决这个问题吗?

y53ybaqx

y53ybaqx1#

你可以用 MulticlassClassificationEvaluator . 只有一个标签是整数,所以使用多标签求值器是没有意义的。

相关问题