以下是我用于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
,但事实并非如此。
有人知道怎么解决这个问题吗?
1条答案
按热度按时间y53ybaqx1#
你可以用
MulticlassClassificationEvaluator
. 只有一个标签是整数,所以使用多标签求值器是没有意义的。