使用“randomSplit”进行机器学习目的,了解在Scala中拆分数据的问题

时间:2014-07-21 04:13:17

标签: scala apache-spark apache-spark-mllib

您好,我是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"可能是否定的,为什么会这样划分?

谢谢!

1 个答案:

答案 0 :(得分:6)

这与积极和消极的例子无关。那些应该已经存在(两种)数据集中。

您将随机分割数据以生成两组:一组用于训练ML算法(训练集),另一组用于检查训练是否正常(测试集)。这是一个非常好的想法,因为它捕获过度拟合,否则可能使你看起来像你有一个很好的ML解决方案,它实际上只是记住每个数据点的答案,不能插入或推广。

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

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