将VectorAssembler添加到Spark ML Pipeline时出错

时间:2016-10-28 16:40:28

标签: scala apache-spark apache-spark-mllib

尝试将VectorAssembler添加到GBT管道示例中并获取错误,管道无法找到features字段。我引入了一个示例文件而不是libsvm,所以我需要转换功能集。

错误: 线程“main”中的异常java.lang.IllegalArgumentException:字段“features”不存在。

 val df = sqlContext.read
  .format("com.databricks.spark.csv")
  .option("header", "true")
  .option("inferSchema", "true")
  .load("data/training_example.csv")

val sampleDF = df.sample(false,0.05,987897L)

val assembler = new VectorAssembler()
  .setInputCols(Array("val1","val2","val3",...,"valN"))
  .setOutputCol("features")

val labelIndexer = new StringIndexer()
  .setInputCol("label")
  .setOutputCol("indexedLabel")
  .fit(sampleDF)

val featureIndexer = new VectorIndexer()
  .setInputCol("features")
  .setOutputCol("indexedFeatures")
  .setMaxCategories(4)
  .fit(sampleDF)

val Array(trainingData, testData) = sampleDF.randomSplit(Array(0.7, 0.3))

val gbt = new GBTClassifier()
  .setLabelCol("indexedLabel")
  .setFeaturesCol("indexedFeatures")
  .setMaxIter(3)
  .setMaxDepth(5)

val pipeline = new Pipeline()
  .setStages(Array(assembler,labelIndexer,featureIndexer,gbt))

val model = pipeline.fit(trainingData)

val predictions = model.transform(testData)

predictions.show(10)

2 个答案:

答案 0 :(得分:4)

基本问题:

为什么你在featureIndexer中调用fit()?

如果你调用fit(sampleDF),VectorIndexer将搜索sampleDF中的features列,但是这个数据集没有这样的列。

Pipeline的fit()将调用所有变换器和估算器,因此调用汇编程序,然后将结果传递给labelIndexer,并传递上一步结果以适应featureIndexer。

将在Pipeline内部调用的featureIndexer.fit()中使用的DataFrame将包含之前变换器生成的所有列。

在您的代码中,sampleDF没有要素列,但是,在Pipeline fit()期间,此列将由汇编程序添加

答案 1 :(得分:0)

文档示例从一开始就有功能列。

val data = sqlContext.read.format("libsvm").load("data/mllib/sample_libsvm_data.txt")

您必须适合具有功能列的DF。因此,使用VectorAssembler转换原始DF并将其作为输入。