阅读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?
答案 0 :(得分:3)
首先,向模型添加另一个观察的唯一方法是将该数据点合并到训练数据中,在本例中为train
变量。为了实现这一点,您可以将该点转换为DataFrame
(显然只有一条记录),然后使用unionAll
方法。不过,您必须使用这个新数据集重新训练模型。
但是,要使用您的模型对观察进行分类,您必须将未分类的数据转换为DataFrame
,其结构与您的训练数据相同。然后使用模型的transform
方法。顺便说一下,请注意模型具有该方法,因为它们是Transformer
的子类。
最后,您必须使用Double
,因为这是定义LabeledPoint类的方式。它会收到Double
标签和SparseVector
或DenseVector
作为功能。我不知道确切的动机,但根据我自己的经验,这并不宽,所有分类和回归算法都适用于浮点数。此外,梯度下降算法,广泛用于适合大多数模型,使用数字而不是字母或类来计算每次迭代中的错误。