1

我试图在我的数据库上运行MLlib算法之一,即LogisticRegressionWithLBFGS。Apache Spark MLlib LabeledPoint空标签问题

该算法将训练集作为LabeledPoint。由于LabeledPoint需要双重标签(LabeledPoint(双标签,Vector特征)),而且我的数据库包含一些空值,我该如何解决这个问题?

在这里你可以看到一段代码与此相关的问题:

val labeled = table.map{ row => 
    var s = row.toSeq.toArray   
    s = s.map(el => if (el != null) el.toString.toDouble) 
    LabeledPoint(row(0), Vectors.dense((s.take(0) ++ s.drop(1)))) 
    } 

和错误,我得到:

error : type mismatch; 
found : Any 
required: Double 

不使用LabeledPoint我可以运行此算法或哪能克服这个“空值”问题?

回答

2

一些原因,这个代码不能工作:

  • Row.toSeq() => Seq[Any]型的,所以是s
  • ,因为你只覆盖不为空的情况下el => if (el != null) el.toString.toDoubleT => AnyVal型(其中T的话)。如果elnull它将返回Unit
  • 即使它不是您将它分配给类型的var这正是您所得到的。这种或那种方式是不是Vectors.dense
  • Row.apply有效输入是Int => Any类型,这样的输出不能用作标签

应工作,但没有任何效果:

  • s.take(0)

可能停止在Spark 2.0中工作

  • map over DataFrame - 我们现在所做的并不多,因为Vector类没有可用的编码器。

你可以如何处理这个:

  • 或者过滤器完成行或使用DataFrameNaFunctions填写例如遗漏值:

    // You definitely want something smarter than that 
        val fixed = df.na.fill(0.0) 
        // or 
        val filtered = df.na.drop 
    
  • 使用VectorAssembler建设载体:

    import org.apache.spark.ml.feature.VectorAssembler 
    
    val assembler = new VectorAssembler() 
        .setInputCols(df.columns.tail) 
        .setOutputCol("features") 
    
    val assembled = assembler.transform(fixed) 
    
  • 转换为LabledPoint

    import org.apache.spark.mllib.regression.LabeledPoint 
    
    
    // Assuming lable column is called label 
    
    assembled.select($"label", $"features").rdd.map { 
        case Row(label: Double, features: Vector) => 
        LabeledPoint(label, features) 
    }