如何在spark ml中定义特征列

时间:2016-11-23 18:57:44

标签: scala apache-spark machine-learning

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

干杯

1 个答案:

答案 0 :(得分:0)

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

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

  3. 您可以使用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(请参阅代码示例部分)