5

嗨,我是 MLlib 的新手,我正在阅读 Spark 网站上有关它的文档。我很难理解为什么在下面的代码中我们需要缓存“0”用于训练和“1”用于测试:

  val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)
  val training = splits(0).cache()
  val test = splits(1)

谁能帮我理解原因?据我所知,我们需要正负样本,所以“1”可以是正的,“0”可以是负的,为什么要这样划分?

谢谢!

4

1 回答 1

7

这与正面和负面的例子无关。这些应该已经存在(两种)数据集中。

您正在随机拆分数据以生成两组:一组在 ML 算法训练期间使用(训练集),第二组用于检查训练是否有效(测试集)。这是一个广泛使用的方法,也是一个非常好的主意,因为它可以捕捉到过度拟合,否则会让人觉得您拥有一个出色的 ML 解决方案,而实际上它实际上只是有效地记住了每个数据点的答案并且无法进行插值或泛化。

事实上,我建议如果您将合理数量的数据分成三个数据集,那么您可以在其上运行 ML 算法的“训练”;“测试”,您可以使用它来检查您的培训进展情况;和“验证”,除非您认为您的整个 ML 流程已优化,否则您永远不会使用它。(优化可能需要多次使用测试集,例如检查收敛性,这使其在某种程度上适合数据集,因此通常很难确定您是否真的避免了过度拟合。将验证集保留到最后是最好的检查方法(或者,如果你可以收集新数据,你可以这样做)。)

请注意,拆分是随机的,以避免不同数据集包含统计上不同数据的问题;例如,早期数据可能与晚期数据不同,因此获取数据集的前半部分和后半部分可能会导致问题。

于 2014-07-21T04:27:24.157 回答