2016-11-23 50 views
1

我想运行火花逻辑回归函数(ml不是mllib)。我有一个数据帧,它看起来像(只显示第一行)如何定义火花ml中的特征列

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

(现在只是试图保持简单,在功能只有一个维度,但将在稍后展开。)

我运行下面的代码 - 从星火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个功能是多少?看起来相当愚蠢 - 如果是这样的话 - 火花应该能够看看特征向量的长度,看看有多少功能。如果我确实需要添加功能的数量,我该怎么做? (漂亮的新斯卡拉/ JAVA)

干杯

+0

你在任何地方使用VectorAssembler吗?这种异常仅仅是由这个问题引发的,我没有看到LogisticRegression对它的任何引用 –

回答

0
  1. 此错误是由VectorAssembler时抛出的任何功能都无效。请确认你的行不包含空值。如果存在空值,则必须在VectorAssembling之前将其转换为默认数字要素。

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

可以形成在您的单个特征数据帧。以下使用Vector类如下方式(我跑了它在1.6.1壳):

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(请参见代码示例