gpt4 book ai didi

scala - 如何使用以 LibSVM 格式训练的 Spark MLlib 模型进行预测

转载 作者:行者123 更新时间:2023-11-30 09:50:12 25 4
gpt4 key购买 nike

我使用 LibSVM 格式的训练数据文件训练了我的模型,如此处所述 http://spark.apache.org/docs/2.2.0/mllib-linear-methods.html 。具体来说我使用了这部分

val data = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt")

// Split data into training (60%) and test (40%).
val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)
val training = splits(0).cache()
val test = splits(1)

// Run training algorithm to build the model
val model = new LogisticRegressionWithLBFGS()
.setNumClasses(10)
.run(training)

但我的问题是,如何在预测时为以这种方式训练的模型准备特征?我想出的解决方案是以 libsvm 格式保存中间文件(带有虚拟标签,因为我只想预测)并使用 MLUtils.loadLibSVMFile 加载它。然后将结果应用到训练好的模型中进行预测。然而,这种策略效率相当低,并且在我的系统中,这需要非常昂贵的 collect()称呼。有什么方法可以将我的数据放入正确的LabeledPoint中格式而不首先将其放入 LibSVM 格式(需要中间文件)?我希望我不必深入研究 MLUtils.loadLibSVMFile 的内部结构弄清楚 libSVM 格式的行如何转换为 LabeledPoint对象。

PS:看起来 Spark 的 ML 管道是执行此操作的更好方法,但我不想放弃迄今为止所做的所有工作,并在可以帮助的情况下尝试该策略。

最佳答案

当您完成模型训练并只想用它进行预测时,您不需要使用 LabeledPoint 格式的数据。您唯一需要的是一个向量(密集或稀疏,请参阅 here 了解更多信息)来进行预测。

val prediction = model.predict(features)

当然,也可以转换为 LabeledPoint,尽管不是必需的。一个小例子:

val rdd = sc.parallelize(Array(
(1, List(1.0,4.0,8.0)),
(2, List(3.0,3.0,8.0)),
(3, List(5.0,5.0,9.0))))

val rdd2 = rdd.map{ case(k, vs) =>
LabeledPoint(k.toDouble, Vectors.dense(vs.toArray))
}
<小时/>

可以在 LibSVM 格式和 Spark 向量之间进行转换。在 LibSVM 文件中,每一行都具有以下格式:

<label> <index1>:<value1> <index2>:<value2> ... <indexN>:<valueN>

索引,其中 是特征向量中的索引(训练和预测的顺序相同)。 MLUtils.loadLibSVMFile() 将在此之后创建 LabeledPoint,即每个LabeledPoint 将如下所示:

LabeledPoint(label, Vectors.sparse(N, Array(index1-1, index2-1, ...), Array(value1, value2, ...)))

示例中使用了 SparseVector,因为 LibSVM 文件指定了索引和值。

在 LibSVM 中,索引从 1 开始,而更常见的约定(包括创建 SparseVector )是从 0 开始,因此,在转换时需要从索引中减去 1 LibSVM 格式。

接下来,您可以轻松地自己创建向量来进行预测。

关于scala - 如何使用以 LibSVM 格式训练的 Spark MLlib 模型进行预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46555208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com