增量学习

一些估计器可以增量地进行训练——不需要一次性看到整个数据集。Scikit-Learn 提供了 partial_fit API,用于将数据批次流式传输到可以分批次拟合的估计器。

通常情况下,如果你将一个 Dask 数组传递给期望 NumPy 数组的估计器,Dask 数组将被转换为一个单一的大型 NumPy 数组。在单机上,你很可能会耗尽 RAM 并导致程序崩溃。在分布式集群上,所有工作节点都会将其数据发送到一台机器上并使其崩溃。

dask_ml.wrappers.Incremental 提供了 Dask 和 Scikit-Learn 估计器之间的桥梁,这些估计器支持 partial_fit API。您将基础估计器包装在 Incremental 中。Dask-ML 将依次将 Dask 数组的每个块传递给基础估计器的 partial_fit 方法。

备注

dask_ml.wrappers.Incremental 目前与像 sklearn.model_selection.GridSearchCV 这样的超参数优化配合不佳。如果你需要对大于内存的数据集进行超参数优化,我们推荐使用 dask_ml.model_selection.IncrementalSearchCV。请参阅“增量超参数优化”以获取介绍。

增量元估计器

wrappers.Incremental([estimator, scoring, ...])

用于将 Dask 数组分块喂给估计器的元估计器。

dask_ml.wrappers.Incremental 是一个元估计器(一个接受另一个估计器的估计器),它连接了期望 NumPy 数组的 scikit-learn 估计器和拥有大型 Dask 数组的用户。

Dask Array 的每个 都会被传递给底层估计器的 partial_fit 方法。训练是完全顺序进行的,因此你不会注意到并行性带来的大规模训练时间加速。在分布式环境中,你应该会注意到一些加速,这来自于避免额外的IO,以及模型通常比数据小得多,因此在机器之间移动更快。

In [1]: from dask_ml.datasets import make_classification

In [2]: from dask_ml.wrappers import Incremental

In [3]: from sklearn.linear_model import SGDClassifier

In [4]: X, y = make_classification(chunks=25)

In [5]: X
Out[5]: dask.array<normal, shape=(100, 20), dtype=float64, chunksize=(25, 20), chunktype=numpy.ndarray>

In [6]: estimator = SGDClassifier(random_state=10, max_iter=100)

In [7]: clf = Incremental(estimator)

In [8]: clf.fit(X, y, classes=[0, 1])
Out[8]: Incremental(estimator=SGDClassifier(max_iter=100, random_state=10))

在这个例子中,我们创建了一个(小的)随机Dask数组。它有100个样本,分成4个块,每个块有25个样本。分块仅沿着第一个轴(样本)进行。沿着特征轴没有分块。

您可以像往常一样实例化底层估计器。它确实只是一个与 scikit-learn 兼容的估计器,并且将通过其 partial_fit 正常训练。

注意,我们在训练时调用的是常规的 .fit 方法,而不是 partial_fit。Dask-ML 会为你处理将每个块传递给底层估计器的工作。

就像 sklearn.linear_model.SGDClassifier.partial_fit() 一样,我们需要将 classes 参数传递给 fit。一般来说,任何底层估计器 partial_fit 所需的参数都成为包装后的 fit 所需的参数。

备注

注意 Incremental.score() 的行为。大多数估计器继承了回归器的默认 R2 评分方法和分类器的准确率评分方法。对于这些估计器,我们自动使用 Dask-ML 的评分方法,这些方法能够操作 Dask 数组。

如果你的基础估计器使用不同的评分方法,你需要确保该评分方法能够操作Dask数组。你也可以显式传递 scoring= 来传递一个支持Dask的评分器。

我们可以在我们的数据集上获得准确度分数。

In [9]: clf.score(X, y)
Out[9]: np.float64(0.67)

在训练过程中学到的所有属性,如 coef_,都可以在 Incremental 实例上访问。

In [10]: clf.coef_
Out[10]: 
array([[ 19.29072014, -10.47126439, -25.54515176,  -8.30131453,
         22.9456788 , -49.48669359, -26.78332266,   8.66997116,
         48.39199547,  49.02931789,   4.54521469,  -4.91283174,
         24.68488524,  -7.1751935 , -50.32896752, -17.11590144,
         -0.05703433, -12.43436416,  20.75873837,   0.89002428]])

如有必要,实际训练的估计器可通过 Incremental.estimator_ 访问。

In [11]: clf.estimator_
Out[11]: SGDClassifier(max_iter=100, random_state=10)

增量学习与超参数优化

关于如何对内存大于数据集进行超参数优化的更多信息,请参见“增量超参数优化”。