使用数据生成器训练时如何处理预处理(StandardScaler、LabelEncoder)?

数据挖掘 机器学习 喀拉斯 scikit-学习 特征缩放 标签
2021-09-22 12:58:52

所以,我有一个太大的数据集,无法一次全部加载到内存中。因此,我想使用生成器来加载批量数据进行训练。

在这种情况下,如何使用来自 scikitlearn 的 LabelEncoder + StandardScaler 执行特征缩放?

更多上下文:

我在数据库中有超过 1000 万个具有 23 个特征和 1 个标签列的数据样本。

我的设置曾经是(当它是大约 300 万个样本时)使用 sql 加载 pandas,执行更多特征提取,在某些特征上使用 LabelEncoder,进行训练/测试拆分,然后在训练特征上使用 StandardScaler。然后适合我的 keras 模型。

但是,由于数据量大,这个工作流程在我的机器上不再可行。(内存错误。)

我正在研究使用 keras.utils.Sequence 来加载批量数据而不是一次加载内存中的所有内容,这样我只需要拥有完整的索引列表,并且一次在内存中加载一个完整的批次。

但是,我将如何进行 LabelEncoding,更重要的是:在这种情况下,我将如何进行特征缩放?鉴于上下文,这是一种正确的方法吗?

1个回答

这是标准化训练功能的正确方法。这样,您可以确保不将测试集中的任何信息提供给训练集。

关于特征缩放,如果您有太多样本无法同时适合您的缩放器,您可以使用 sklearn 中的partial_fit(参见此处)方法StandardScaler按顺序加载您的训练特征并执行 partial_fit。完成后,您的定标器即可用于您的训练/测试批次。

关于标签编码,要么你已经有一个包含所有标签的数组,所以你可以适合你的LabelEncoder,或者你必须在适合之前依次加载所有数据以获取所有不同的标签(LabelEncoder没有partial_fit方法)。