我正在尝试运行spark logistic回归函数(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的功能数量是多少?如果是这样似乎相当愚蠢 - 火花应该能够查看特征向量的长度以查看有多少特征。如果我确实需要添加功能的数量,我该怎么做? (Scala / Java新手)
干杯
答案 0 :(得分:0)
当任何功能为空时,VectorAssembler会抛出此错误。请验证您的行不包含空值。如果存在空值,则必须在VectorAssembling之前将其转换为默认数字要素。
关于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(请参阅代码示例部分)