向spark ml管道添加矢量汇编程序时出错

a5g8bdjr  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(393)

尝试将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)
xam8gpfp

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()期间,此列将由汇编程序添加

qxgroojn

qxgroojn2#

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

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

你必须适应一个有特征列的df,所以用vectorasembler转换你原来的df并把它作为输入。

相关问题