增量学习
目录
增量学习¶
一些估计器可以增量地训练——无需一次性看到整个数据集。Scikit-Learn 提供了 partial_fit
API,可以将批量数据流式传输到可以按批次拟合的估计器中。
通常,如果您将 Dask 数组传递给期望 NumPy 数组的估计器,Dask 数组将被转换为一个大型 NumPy 数组。在单机上,您可能会耗尽 RAM 并导致程序崩溃。在分布式集群中,所有工作节点会将它们的数据发送到一台机器上并导致其崩溃。
dask_ml.wrappers.Incremental
提供了 Dask 和支持 partial_fit
API 的 Scikit-Learn 估计器之间的桥梁。您将底层估计器包装在 Incremental
中。Dask-ML 将按顺序将 Dask 数组的每个块传递到底层估计器的 partial_fit
方法中。
注意
dask_ml.wrappers.Incremental
目前与超参数优化(例如 sklearn.model_selection.GridSearchCV
)配合不佳。如果您需要在大于内存的数据集上进行超参数优化,我们推荐 dask_ml.model_selection.IncrementalSearchCV
。有关介绍,请参见“增量超参数优化”。
增量元估计器¶
|
用于将 Dask 数组分块馈送给估计器的元估计器。 |
dask_ml.wrappers.Incremental
是一个元估计器(接受另一个估计器的估计器),它弥合了期望 NumPy 数组的 scikit-learn 估计器与使用大型 Dask 数组的用户之间的差距。
Dask 数组的每个块都会被馈送到底层估计器的 partial_fit
方法。训练过程完全是顺序的,因此您不会看到并行带来的显著训练时间加速。在分布式环境中,您应该会注意到由于避免了额外的 I/O 以及模型通常比数据小得多因此在机器之间移动更快而带来的一些加速。
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.63)
训练期间学到的所有属性,例如 coef_
,都可以在 Incremental
实例上获取。
In [10]: clf.coef_
Out[10]:
array([[ -0.3064992 , -10.07170288, 24.71029547, -15.27543256,
-54.601333 , 12.01995785, -49.77319929, 33.75115957,
-28.03512523, -10.67417623, 19.43838957, 26.76362077,
-31.38563559, -11.12629895, 56.52341511, 15.66555287,
4.93846571, 6.4390728 , -20.18537403, 4.62001642]])
如有必要,经过训练的实际估计器可作为 Incremental.estimator_
使用。
In [11]: clf.estimator_
Out[11]: SGDClassifier(max_iter=100, random_state=10)