Теперь есть конвейер, который включает IDF, CountVectorizer, ChiSqSelector, DecisionTreeClassifier. Я преобразовал этот конвейер, ошибка:
Feature 0 is marked as Nominal (categorical), but it does not have the number of values specified.
Я подумал, что конвейер создал разреженный вектор и поместил этот вектор в DecisionTreeClassifier, поэтому мне нужно преобразовать разреженный вектор в плотный вектор через этот конвейер, а затем подогнатьв DecisionTreeClassifier, как? Я отправил свой код:
val idf = new IDF()
.setInputCol("rawFeatures")
.setOutputCol("idfFeatures")
val cvm = new CountVectorizer()
.setVocabSize(100)
.setInputCol("ngrams")
.setOutputCol("rawFeatures")
val selector = new ChiSqSelector()
.setNumTopFeatures(50)
.setFeaturesCol("idfFeatures")
.setOutputCol("features")
val dt = new DecisionTreeClassifier()
val pipeline = new Pipeline()
val pipeline4 = Array[PipelineStage](cvm, idf, selector, dt)
val paramGrid4 = new ParamGridBuilder()
.addGrid(dt.maxDepth, Array(10))
.baseOn(pipeline.stages -> pipeline4)
.build()
val paramGrid = paramGrid4
val cv = new CrossValidator()
.setEstimator(pipeline)
.setEvaluator(new BinaryClassificationEvaluator)
.setEstimatorParamMaps(paramGrid)
.setNumFolds(3)
.setParallelism(1)
val cvModel = cv.fit(train)