【问题标题】:pyspark ML LabeledPoint not working with LinearRegressionpyspark ML LabeledPoint 不适用于 LinearRegression
【发布时间】:2021-04-01 07:38:06
【问题描述】:

我正在使用 pyspark 研究 Spark 3.0.1,并且已经为使用简单的 OLS 回归设置了一些数据

data = results.select('OrderMonthYear', 'SaleAmount').rdd.map(lambda row: LabeledPoint(row[1], [row[0]])).toDF()

OrderMonthYear 是我的特征列 (int),SaleAmount 是响应 (float)。 LabeledPoint 方法是从 pyspark.mllib.regression 导入的。然后我尝试用

拟合回归模型
from pyspark.ml.regression import LinearRegression
lr = LinearRegression()
modelA = lr.fit(data, {lr.regParam:0.0})

获取此异常

IllegalArgumentException: requirement failed: Column features must be of type struct<type:tinyint,size:int,indices:array<int>,values:array<double>> but was actually struct<type:tinyint,size:int,indices:array<int>,values:array<double>>.

这显然不是很有帮助,因为所需和传递的功能似乎是相同的结构。我在网上搜索过,只为 java 或为自己构建结构的人找到了这个问题的答案。该异常是从一个 util 函数中抛出的,该函数刚刚抛出了一个 java 异常 (#Hide where the exception came from that shows a non-Pythonic JVM exception message.),所以我无法进一步调试。

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-mllib apache-spark-ml


    【解决方案1】:

    MLlib 和基于 RDD 的 MLlib 函数已弃用。我建议使用 ML 的向量汇编器:

    from pyspark.ml.feature import VectorAssembler
    from pyspark.ml.regression import LinearRegression
    
    data = spark.createDataFrame([[0,1],[1,2],[2,3]]).toDF('OrderMonthYear', 'SaleAmount')
    
    va = VectorAssembler(inputCols=['SaleAmount'], outputCol='features')
    data2 = va.transform(data)
    
    lr = LinearRegression(labelCol='OrderMonthYear')
    model = lr.fit(data2)
    

    【讨论】:

    • 谢谢。我正在关注的培训视频是 2.0.1,所以我看到很多变化。我很高兴看到 RDD 函数被弃用。
    【解决方案2】:

    对于学习同一 LI 学习课程的其他人,基于对上述已接受答案的一些修改,以便更符合我在课程中看到的内容,Cmd 4 单元格应如下所示:

    # convenience for specifying schema
    from pyspark.ml.feature import VectorAssembler
     
    data = VectorAssembler(inputCols=['OrderMonthYear'], outputCol='features').transform(results.select("OrderMonthYear", "SaleAmount")).drop('OrderMonthYear').withColumnRenamed('SaleAmount', 'label')
      
    display(data)
    

    或者,您也可以使用以下方法:

    from pyspark.ml.linalg import Vectors
    data = results.rdd.map(lambda r: (Vectors.dense(r[0]), r[1])).toDF(["features","label"])
    display(data)
    

    那么你应该很高兴。请注意,您还需要在笔记本 4.4 和 4.5 中对 Cmd 4 进行相同的更改。希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-20
      • 2020-04-24
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多