阅读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中吗?
为什么要求dataframe标签类型为Double?
发布于 2016-03-14 23:22:56
首先,向模型添加另一个观察的唯一方法是将该数据点合并到培训数据中,在这种情况下,将其添加到train变量中。为了实现这一点,您可以将该点转换为DataFrame (显然只有一条记录),然后使用unionAll方法。不过,您必须使用这个新的数据集重新培训模型。
但是,要使用模型对观测数据进行分类,您必须将未分类的数据转换为具有与培训数据相同结构的DataFrame。然后使用模型的transform方法。顺便说一句,请注意模型有这个方法,因为它们是Transformer的子类。
最后,您必须使用Double,因为这是定义LabeledPoint类的方式。它接收Double作为标签,SparseVector或DenseVector作为特性。我不知道确切的动机,但根据我自己的经验(并不广泛),所有的classification和回归算法都与浮点numbers.Furthermore、梯度下降算法(广泛用于拟合大多数模型)一起工作,在每次迭代中使用数字而不是字母或类来计算误差。
https://stackoverflow.com/questions/35998935
复制相似问题