尝试将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条答案
按热度按时间xam8gpfp1#
基本问题:
为什么在featureindexer中调用fit()?
如果调用fit(sampledf),vectorindexer将在sampledf中搜索features列,但是这个数据集没有这样的列。
pipeline的fit()将调用所有的transformator和estimator,因此在assembler上调用fit,然后将结果传递给labelindexer的fit,并将上一步的结果传递给featureindexer的fit。
在管道内部调用的featureindexer.fit()中使用的Dataframe将包含以前的转换器生成的所有列。
在您的代码中,sampledf没有features列,但是,在pipeline fit()期间,此列将由汇编程序添加
qxgroojn2#
文档示例从一开始就有features列。
你必须适应一个有特征列的df,所以用vectorasembler转换你原来的df并把它作为输入。