我想实现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)
此代码针对 rank
和 lambda
的每个组合训练模型,并将 rmse(均方根误差)与 validation set
进行比较。这些迭代提供了一个更好的模型,我们可以说它由(rank,lambda)
对表示。但在那之后test
片场就没有多大作用了。它只是计算设置了"测试"的rmse。
我的问题是如何用test
设置数据进一步调整它。
不,永远不会使用测试数据微调模型。如果您这样做,它将不再是您的测试数据。我推荐吴教授的著名课程中的这一部分,该课程讨论了模型训练过程:https://www.coursera.org/learn/machine-learning/home/week/6
根据您对验证数据集误差值的观察,您可能希望添加/删除特征、获取更多数据或在模型中进行更改,甚至可能完全尝试不同的算法。如果交叉验证和测试 rmse 看起来合理,那么你就完成了模型,你可以使用它来实现最初让你构建它的目的(我会假设一些预测)。