首页 文章

将训练实例插入到scikit-learn数据集中

提问于
浏览
1

我有svmlight数据集形式的15M训练实例的数据集 . 我使用sklearn.datasets.load_svmlight_file()读取这些数据 . 数据本身并不稀疏,所以我不介意将其转换为任何其他密集表示(我更喜欢) .

在我的程序中的某些时刻,我需要向我的训练数据(随机位置)添加数百万个新数据记录(实例) . 我使用vstack并尝试转换为密集矩阵,但效率低或无法给出正确的结果(详情如下) . 有没有办法有效地完成这项任务?

我正在实现DAgger算法,并且在第一次迭代中它试图添加大约7M个新训练实例 . 我想在随机位置添加这些新实例 . 我尝试了vstack(鉴于我的数据是csr格式,我期望它至少不会太低效) . 然而,24小时后它还没有完成 .

我尝试在以svmlight格式加载数据之后将数据转换为numpy.matrix格式 . 抽样显示它可以帮助我加快速度,但有趣的是,我从转换数据集和原始数据集的训练得到的结果似乎不相互匹配 . 似乎sklearn不能像我想象的那样使用numpy矩阵 . 我在sklearn文档中找不到任何内容 .

我认为另一种方法是从头开始定义一个更大的数据集,以便它在内存中有足够的空间,但是当我将数据集索引到最后一个"true"记录时 . 通过这种方式,我认为,vstack不需要在内存中打开一个新的大空间,这可能会使整个操作花费更长的时间 . 有什么想法吗?

1 回答

  • 0

    首先:我猜测稀疏数据给出的答案与转换为密集的相同数据的答案不同,是我的稀疏表示是从一个而不是零开始的特征索引(因为我之前使用过的oll库所需) . 所以我的第一列全部为零,当转换为密集时,它没有被保留,这就是使用密集表示时效果略好的原因 .

    第二步:在该比例中向稀疏矩阵添加新行效率不高 . 即使您在开始时保留一个大矩阵(带填充零)也不会在以后替换 . 这可能是因为存在稀疏矩阵的结构(它使用三个数组,如果crs一个用于行号,一个用于行中的非零列索引,一个用于值本身;请查看文档) .

    解决方案:我发现的最佳方法是从头开始使用密集表示(如果这是一个选项) . 收集需要添加到训练集的所有实例 . 将新矩阵实例化为聚合数据的大小,然后开始从最后一个训练集“随机”添加实例,也从您要添加的新实例中添加实例 . 为了使它随机,我生成一个随机位置的排序列表,告诉我何时应该从新实例添加数据,否则从旧实例复制 .

相关问题