我的数据集变得太大了,我正在寻找sklearn中的在线学习解决方案,他们称之为核心外学习。
他们提供了一些使用部分拟合API的类,这基本上允许您将数据的子集保存在内存中并对其进行操作。但是,许多预处理阶段(例如数据缩放)在训练数据的拟合阶段保留参数,然后将其用于转换。
例如,如果使用最小-最大缩放器将特征绑定到 [-1, 1] 或标准化数据,则它们学习并最终用于转换数据的参数是从它们碰巧在给定迭代中操作的训练数据的子集中学习的。
这意味着在拟合阶段对一个训练数据子集学习的参数可能与训练数据的另一个子集不同,因为它们是特定于训练集的。这就是我问题的核心:
当使用在线/核心外学习时,当学习的参数是训练数据的函数时,如何组合在预处理步骤的拟合阶段学习的参数?
StandardScaler
实例放在足够大的子集上,该子集可以同时放入 RAM(例如几 GB 的数据),然后重复使用缩放器的同一固定实例来一次转换其余数据。您应该能够在几千个样本上很好地估计每个特征的平均值和标准值,因此无需仅针对缩放器计算完整数据的实际拟合。
StandardScaler
类添加一个partial_fit
方法,实现流式均值和方差估计以实现完整性,这仍然很好。
但是,即使StandardScaler
有partial_fit
方法,您仍然需要执行多个数据路径(并可选择将预处理的数据存储在驱动器上以供以后重用):
- 第一遍:对所有原始数据块调用
standard_scaler.partial_fit()
- 第二次传递:对原始数据的每个块调用
standard_scaler.transform
,然后将结果传递给model.partial_fit
方法。