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