当数据集太大而无法存储时,如何执行分类编码?

数据挖掘 Python scikit-学习 预处理 分类数据
2021-09-19 05:53:44

我通常在使用 Scikit-Learn 拟合估计器之前进行预处理。我的最新项目使用的数据比我过去使用的要多得多,虽然我知道我可以使用 Keras using.fit_generator()或 sklearn using在线学习.partial_fit(),但我对如何执行分类编码步骤感到有点茫然这样的场景。显然,OrdinalEncoder 需要了解功能中每个可能的值才能完全适合自己……但我不能给出它,因为我无法将数据加载到内存中。

我没有尝试过,但有可能一次加载一个分类特征并在该数据上训练一个编码器,然后从内存中删除它并加载下一个特征来训练另一个编码器。这似乎很笨拙,尽管实际上没有任何理由像分类编码器这样的东西不能以迭代方式部分学习类别,但我在 sklearn 中找不到任何可以适应这种情况的东西。

预处理数据是否没有等效的“在线学习”?

2个回答

您可以逐行(或逐块)读取文件,假设它是可以完成的格式,并跟踪类别的唯一值。

可以在 1 次数据传递中处理多个字段,而不是像下面的代码那样处理 1 个字段。

当然,最简单的方法是获取更多内存或移动到集群。逐行解决方案不会是最快的。

在伪代码中

unique_values_in_field_1 = set()

file = open(input)
while not EOF
    line = readline(file) 
    # can also read a block of lines and adjust the code accordingly
    field_1 = line.field_1
    # make a function to handle multiple fields during the same pass of reading the file
    if field_1 not in unique_values_in_field_1:
       unique_values_in_field_1.add(field_1)

close(file)

# now have all of the unique values in this field. Do whatever is needed to transform them.

我没有尝试过,但有可能一次加载一个分类特征并在该数据上训练一个编码器,然后从内存中删除它并加载下一个特征来训练另一个编码器。

最后,我只是这样做了。