Jim*_*cks 4 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)
Run Code Online (Sandbox Code Playgroud)
基本问题:
为什么要在 featureIndexer 中调用 fit()?
如果你调用 fit(sampleDF),VectorIndexer 会在 sampleDF 中搜索 features 列,但是这个数据集没有这样的列。
管道的 fit() 将调用所有的变换器和估计器,因此在汇编器上调用 fit,然后将结果传递给 labelIndexer 的 fit 并将上一步的结果传递给 featureIndexer 的 fit。
将在流水线内部调用的 featureIndexer.fit() 中使用的 DataFrame 将具有由先前转换器生成的所有列。
在您的代码 sampleDF 中没有 features 列,但是,在 Pipeline fit() 期间,此列将由汇编程序添加
| 归档时间: |
|
| 查看次数: |
2243 次 |
| 最近记录: |