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

标签 scala apache-spark machine-learning

我正在尝试运行 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/

相关文章:

machine-learning - 我可以在 CRF 模型中使用数值特征吗

machine-learning - 当只有一个测试实例时,如何处理机器学习模型部署中的特征扩展情况?

python - Pyspark 错误与 UDF : py4j. Py4JException: 方法 __getnewargs__([]) 不存在错误

scala - Groupby 类似于 Python 的 itertools.groupby

scala - 不符合 lambda 类型的种类

scala - 关键字 'implicit' 放在 lambda 表达式参数前面是什么意思?

apache-spark - StreamingQuery.awaitTermination 的目的是什么?

python - 遍历 Spark RDD

machine-learning - 小批量梯度只是在线梯度的总和吗?

scala - 使用 foreach 行在数据框中捕获和写入字符串