我目前正在使用c5.0构建分类器。我有一个8000条目的数据集,每个条目都有自己的i.d号码(1-8000)。在测试分类器的性能时,我必须制作5组10:90(训练数据:测试数据)分割。当然,任何训练案例都不能再出现在测试用例中,并且在任何一组中都不会出现重复。
为了解决为训练数据随机选择示例的问题,并确保不能为测试数据挑选相同的问题,我开发了一种非常慢的方法;
在单独的行中填写1-8000的数字文件。
随机选择一个行号(范围为1-8000)并使用该行的内容作为训练示例的ID号。
将所有未删除的号码写入新文件
将随机数发生器的范围递减1
重做
然后将所有未标记的数字用作测试数据。它有效,但速度很慢。为了加快速度,我可以使用List :: Util'shuffle'来“随机”混乱和这些数字的数组。但随机的是“随机播放”?必须保持相同的准确度。对这篇文章感到抱歉,但是有谁知道'shuffle'实际上是如何运作的。任何帮助都会很棒
答案 0 :(得分:9)
sub shuffle (@) {
my @a=\(@_);
my $n;
my $i=@_;
map {
$n = rand($i--);
(${$a[$n]}, $a[$n] = $a[$i])[0];
} @_;
}
看起来像Fisher-Yates shuffle。