【发布时间】:2019-12-20 07:26:40
【问题描述】:
给定一个“分割比率”,我试图将一个数据集随机分成两组。问题是,我事先不知道数据集包含多少项目。我的库从输入流中一一接收数据,并期望将数据返回到两个输出流。理想情况下,生成的两个数据集应完全按照给定的拆分比例拆分。
插图:
┌─► stream A
input stream ──► LIBRARY ──┤
└─► stream B
例如,给定30/70 的拆分比率,流 A 应接收来自输入流的 30% 的元素,流 B 接收剩余的 70%。订单必须保留。
到目前为止我的想法:
想法 1:为每个元素“掷骰子”
显而易见的方法:对于每个元素,算法随机决定该元素应该进入流 A 还是 B。问题是,生成的数据集可能与预期的拆分比率相差甚远。给定50/50 的拆分比率,生成的数据拆分可能有些遥远(对于非常小的数据集,甚至可能是100/0)。目标是使得到的分流比尽可能接近所需的分流比。
思路2:使用缓存,随机化缓存数据
另一个想法是在传递它们之前缓存固定数量的元素。这将导致缓存 1000 个元素并打乱数据(或它们相应的索引以保持顺序稳定),将它们拆分并传递结果数据集。这应该工作得很好,但我不确定随机化对于大型数据集是否真的是随机的(我想在查看分布时会有模式)。
这两种算法都不是最优的,所以希望你能帮助我。
背景
这是关于基于层的数据科学工具,其中每一层通过流从前一层接收数据。该层预计在传递数据(向量)之前将其拆分为训练和测试集。输入数据的范围可以从几个元素到永无止境的数据流(因此,流)。代码是用 JavaScript 开发的,但是这个问题更多的是关于算法而不是实际的实现。
【问题讨论】:
-
阅读您的问题并向您提出我的第一个提示,但不会想太多:每次您收到 X 行。您检查数据集 A 和 B 的数字并计算比率。根据这个比率和预期比率,定义你必须如何分割你的 X 行以匹配预期比率?
-
这里很难保持随机性。您不知道全部范围,您仍然必须预测您将拥有多少项目以保持比率。在某些时候,您可能与预期比率相差太远,然后必须平衡流量。这打破了随机性。您可能会考虑根据我提出的当前比率定义权重?它可以保持随机性并更多地重定向流程。仍然可以预测......但有点少。我了解您想要实现的目标,如果有答案,我想知道答案。
-
顺便说一句很好的问题格式:)
-
您想要对这些比率进行精确拆分,还是只是应该为每个流保留的概率?
-
@ThomasDondorf :你最终得到了什么?我很好奇……
标签: javascript algorithm random split data-science