整个数据集有80
百万个样本,每个样本都有200
密集特征。我们经常用批处理来训练分类器。例如,我们采用clf = sklearn.linear_model.SGDClassifier
,然后我们可以使用clf.partial_fit(batch_data, batch_y)
来用批数据拟合模型。
在此之前,我们应该首先缩放batch_data
。假设我们使用mean-std
规范化。因此,我们应该获得每个特征维度的全局平均值和标准偏差。之后,我们可以使用全局平均值和stds来缩放batch_data。
现在的问题是如何获得整个数据集的均值和std。为了计算全局std,我们可以使用$\sigma^2=E(X^2)-E(X)^2$。然后我们应该通过批处理来计算E(X^2)
和E(X)
。
我认为Hadoop
或Spark
可能适合此任务。对于每一批数据,我们可以启动一个实例来计算部分E(X^2)
和E(X)
,然后将它们简化为全局数据。
在scikit-learn
中,有没有更有效的方法来扩展大型数据集?也许我们可以使用multithreading
或启动多个进程来处理批处理数据,然后减少结果以获得全局均值和标准差。
您可以利用大多数scikit-learn
算法中的n_jobs
选项进行并行处理。
对于这种大小的数据,我建议使用apachespark。