如何在apache spark模型训练后对新的训练样例进行分类?

时间:2016-03-14 22:01:46

标签: scala apache-spark

阅读https://spark.apache.org/docs/1.5.2/ml-ann.html的src:

import org.apache.spark.ml.classification.MultilayerPerceptronClassifier
import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.sql.Row

// Load training data
val data = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_multiclass_classification_data.txt").toDF()
// Split the data into train and test
val splits = data.randomSplit(Array(0.6, 0.4), seed = 1234L)
val train = splits(0)
val test = splits(1)
// specify layers for the neural network: 
// input layer of size 4 (features), two intermediate of size 5 and 4 and output of size 3 (classes)
val layers = Array[Int](4, 5, 4, 3)
// create the trainer and set its parameters
val trainer = new MultilayerPerceptronClassifier()
  .setLayers(layers)
  .setBlockSize(128)
  .setSeed(1234L)
  .setMaxIter(100)
// train the model
val model = trainer.fit(train)
// compute precision on the test set
val result = model.transform(test)
val predictionAndLabels = result.select("prediction", "label")
val evaluator = new MulticlassClassificationEvaluator()
  .setMetricName("precision")
println("Precision:" + evaluator.evaluate(predictionAndLabels))

模型经过培训后,如何对新培训示例进行分类?

是否可以将新的培训示例添加到未设置标签的model,分类器会尝试根据培训数据对此培训示例进行分类?

为什么要求数据框标签的类型为Double?

1 个答案:

答案 0 :(得分:3)

首先,向模型添加另一个观察的唯一方法是将该数据点合并到训练数据中,在本例中为train变量。为了实现这一点,您可以将该点转换为DataFrame(显然只有一条记录),然后使用unionAll方法。不过,您必须使用这个新数据集重新训练模型。

但是,要使用您的模型对观察进行分类,您必须将未分类的数据转换为DataFrame,其结构与您的训练数据相同。然后使用模型的transform方法。顺便说一下,请注意模型具有该方法,因为它们是Transformer的子类。

最后,您必须使用Double,因为这是定义LabeledPoint类的方式。它会收到Double标签和SparseVectorDenseVector作为功能。我不知道确切的动机,但根据我自己的经验,这并不宽,所有分类回归算法都适用于浮点数。此外,梯度下降算法,广泛用于适合大多数模型,使用数字而不是字母或类来计算每次迭代中的错误。