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