【问题标题】:how to define features column in spark ml如何在 Spark ml 中定义特征列
【发布时间】:2016-11-24 17:47:01
【问题描述】:

我正在尝试运行 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 repo 中的 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 的新手)

干杯

【问题讨论】:

  • 您是否在任何地方使用 VectorAssembler?此类异常仅由此 calss 引发,我没有从 LogisticRegression 中看到对它的任何引用

标签: scala apache-spark machine-learning


【解决方案1】:
  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(请参阅代码示例部分)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-28
    • 2017-08-13
    • 2019-05-17
    • 2017-12-11
    • 2015-12-12
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多