【问题标题】:inserting training instances to scikit-learn dataset将训练实例插入 scikit-learn 数据集
【发布时间】:2015-12-30 23:35:00
【问题描述】:

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

在我的程序中的某个时刻,我需要将数百万个新数据记录(实例)添加到我的训练数据(随机位置)中。我使用了 vstack 并尝试转换为密集矩阵,但效率低下或未能给出正确的结果(详情如下)。有什么方法可以有效地完成这项任务吗?

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

在以 svmlight 格式加载数据后,我尝试将数据转换为 numpy.matrix 格式。抽样表明它可以帮助我加快速度,但有趣的是,我在转换后的数据集和原始数据集上训练得到的结果似乎彼此不匹配。 sklearn 似乎不像我想的那样与 numpy 矩阵一起工作。我在 sklearn 文档中找不到任何内容。

我认为的另一种方法是从一开始就定义一个更大的数据集,以便在内存中“保留”足够的空间,但是当我使用 sklearn 训练或测试功能时,我会将我的数据集索引到最后的“真实”记录。这样,我想,vstack 不需要在内存中开辟一个新的大空间,这会使整个操作花费更长的时间。对此有何想法?

【问题讨论】:

    标签: python-2.7 numpy scipy scikit-learn


    【解决方案1】:

    FIRST:我猜稀疏数据给出与转换为密集数据的相同数据不同的答案的原因是,我对稀疏的表示是从 1 而不是 0 开始特征索引(因为我以前使用的 oll 库需要所以)。所以我的第一列全为零,当转换为密集时,它没有被保留,这就是使用密集表示时结果稍微好一点的原因。

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

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

    【讨论】:

      猜你喜欢
      • 2016-11-26
      • 2014-09-17
      • 2019-01-07
      • 2020-02-08
      • 1970-01-01
      • 2013-10-31
      • 2015-05-04
      • 2013-05-25
      • 2023-04-09
      相关资源
      最近更新 更多