尝试将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)
答案 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并将其作为输入。