【问题标题】:Pyspark KMeans clustering features column IllegalArgumentExceptionPyspark KMeans 聚类特征列 IllegalArgumentException
【发布时间】:2019-08-05 09:00:52
【问题描述】:
pyspark==2.4.0

这是给出异常的代码:

LDA = spark.read.parquet('./LDA.parquet/')
LDA.printSchema()

from pyspark.ml.clustering import KMeans
from pyspark.ml.evaluation import ClusteringEvaluator

kmeans = KMeans(featuresCol='topic_vector_fix_dim').setK(15).setSeed(1)
model = kmeans.fit(LDA)


|-- ID:字符串(可为空 = true)
|-- topic_vector_fix_dim: 数组(可为空=真)
| |-- 元素:double (containsNull = true)

IllegalArgumentException: '要求失败:列 topic_vector_fix_dim 的类型必须等于以下类型之一:[struct ,values:array >, array , array ] 但实际上是 array 类型。'

我很困惑 - 它不喜欢我的array <double>,但说它可能是输入。
topic_vector_fix_dim 的每个条目都是浮点数的一维数组

【问题讨论】:

    标签: python pyspark


    【解决方案1】:

    特征列的containsNull应设置为False

    new_schema = ArrayType(DoubleType(), containsNull=False)
    udf_foo = udf(lambda x:x, new_schema)
    LDA = LDA.withColumn("topic_vector_fix_dim",udf_foo("topic_vector_fix_dim"))
    

    之后一切正常。

    【讨论】:

      【解决方案2】:

      containsNull 的答案对我不起作用,但这样做:

      vectorAssembler = VectorAssembler(inputCols = ["x1", "x2", "x3"], outputCol = "features")
      df = vectorAssembler.transform(df)
      df = df.select(['features', 'Y'])
      

      【讨论】:

      • 在问题中,输入功能已经是单列。问题不在于将多列转换为单列。
      • @ArturSokolovsky 但它确实解决了问题。唯一有意义的是该库没有明确它,但它在训练 Estimator 时仅在内部识别 VectorAssembler 的数组。
      猜你喜欢
      • 2019-11-19
      • 2015-02-26
      • 2018-05-15
      • 2018-05-15
      • 2019-12-01
      • 2020-07-14
      • 2020-05-13
      • 2014-12-27
      • 2014-05-20
      相关资源
      最近更新 更多