【发布时间】:2018-03-15 06:39:29
【问题描述】:
我使用 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 管道是一种更好的方法,但我不想放弃我迄今为止所做的所有工作,并在可以帮助的情况下尝试该策略。
【问题讨论】:
-
实际上,如果您有能力创建 LibSVM 文件,那么是什么阻止您自己创建向量并在预测中使用它们?您已经将您的功能放入 filr,所以它们应该已经准备好了...?
-
@Shaido - 是的,我知道如何将特征放入文件中 - 只是不知道如何从文件中读取它们并转换为最终传递给模型的向量。我可以深入研究
MLUtils.loadLibSVMFile来解决这个问题,但我希望我不必这样做(但我最终做到了)
标签: scala apache-spark machine-learning apache-spark-mllib