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) 
    }