如何使用训练,测试和验证数据集训练Apache Spark MLlib的ALS中的矩阵分解模型

时间:2015-06-12 06:07:08

标签: java apache-spark apache-spark-mllib collaborative-filtering

我想实现Apache Spark的ALS机器学习算法。我发现应该选择最佳模型以获得最佳效果。我已经将培训数据分成三组Training, Validation and Test作为论坛上的建议。

我找到了以下代码示例来训练这些集合的模型。

val ranks = List(8, 12)
val lambdas = List(1.0, 10.0)
val numIters = List(10, 20)
var bestModel: Option[MatrixFactorizationModel] = None
var bestValidationRmse = Double.MaxValue
var bestRank = 0
var bestLambda = -1.0
var bestNumIter = -1
for (rank <- ranks; lambda <- lambdas; numIter <- numIters) {
  val model = ALS.train(training, rank, numIter, lambda)
  val validationRmse = computeRmse(model, validation, numValidation)
  if (validationRmse < bestValidationRmse) {
    bestModel = Some(model)
    bestValidationRmse = validationRmse
    bestRank = rank
    bestLambda = lambda
    bestNumIter = numIter
  }
}

val testRmse = computeRmse(bestModel.get, test, numTest)

此代码训练ranklambda的每个组合的模型,并将rmse(均方根误差)与validation set进行比较。这些迭代提供了一个更好的模型,我们可以说它由(rank,lambda)对表示。但是在test集之后它没有做太多。 它只是用`test'设置来计算rmse。

我的问题是如何使用test设置数据进一步调整。

1 个答案:

答案 0 :(得分:2)

不,人们永远不会使用测试数据对模型进行微调。如果这样做,它将不再是您的测试数据。 我建议安德鲁·吴教授的着名课程的这一部分讨论模型培训过程:https://www.coursera.org/learn/machine-learning/home/week/6

根据您对验证数据集的错误值的观察,您可能希望添加/删除功能,获取更多数据或在模型中进行更改,或者甚至可能尝试使用不同的算法。如果交叉验证和测试rmse看起来合理,那么你完成了模型,你可以将它用于目的(一些预测,我会假设),这使你首先构建它。