gpt4 book ai didi

scala - 如何在spark ml中定义特征列

转载 作者:行者123 更新时间:2023-11-30 09:10:22 28 4
gpt4 key购买 nike

我正在尝试运行 Spark 逻辑回归函数(ml 不是 mllib)。我有一个数据框,看起来像(仅显示第一行)

+-----+--------+
|label|features|
+-----+--------+
| 0.0| [60.0]|

(现在只是想保持简单,功能中只有一个维度,但稍后会扩展。)

我运行以下代码 - 摘自 Spark ML 文档

import org.apache.spark.ml.classification.LogisticRegression
val lr = new LogisticRegression()
.setMaxIter(10)
.setRegParam(0.3)
.setElasticNetParam(0.8)

val lrModel = lr.fit(df)

这给了我错误 -

org.apache.spark.SparkException: Values to assemble cannot be null.

我不知道如何修复这个错误。我查看了spark github 存储库中的sample_libsvm_data.txt,并在spark ml 文档中的一些示例中使用。该数据框看起来像

+-----+--------------------+
|label| features|
+-----+--------------------+
| 0.0|(692,[127,128,129...|
| 1.0|(692,[158,159,160...|
| 1.0|(692,[124,125,126...|

根据此示例,我的数据看起来应该采用正确的格式,但有一个问题。 692是特征数吗?如果是这样的话,看起来相当愚蠢 - Spark 应该能够查看特征向量的长度来查看有多少个特征。如果我确实需要添加一些功能,我该怎么做? (对于 Scala/Java 来说相当陌生)

干杯

最佳答案

  1. 当任何特征为空时,VectorAssembler 会抛出此错误。请验证您的行不包含空值。如果存在空值,则必须在 VectorAssembling 之前将其转换为默认数值特征。

  2. 关于sample_libsvm_data.txt的格式,它以稀疏数组/矩阵的形式存储。其中数据表示为:0 128:51 129:159 130:253(其中 0 是标签,后续列包含 index:numeric_feature 格式。

您可以使用 Vector 类按以下方式形成单个特征数据框,如下所示(我在 1.6.1 shell 上运行它):

import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.ml.classification.LogisticRegression

val training1 = sqlContext.createDataFrame(Seq(
(1.0, Vectors.dense(3.0)),
(0.0, Vectors.dense(3.0)))
).toDF("label", "features")

val lr = new LogisticRegression().setMaxIter(10).setRegParam(0.3).setElasticNetParam(0.8)
val model1 = lr.fit(training)

有关更多信息,您可以查看示例:https://spark.apache.org/docs/1.6.1/ml-guide.html#dataframe (请参阅代码示例部分)

关于scala - 如何在spark ml中定义特征列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40772255/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com