并行元估计器

dask-ml 提供了一些元估计器,这些元估计器可以并行化和扩展某些任务,这些任务在 scikit-learn 本身中可能无法并行化。例如,ParallelPostFit 将并行化 predictpredict_probatransform 方法,使它们能够处理大型(可能超出内存)的数据集。

并行预测与转换

wrappers.ParallelPostFit 是一个用于并行化后拟合任务(如预测和转换)的元估计器。它可以包装任何 scikit-learn 估计器,以提供并行的 predictpredict_probatransform 方法。

警告

ParallelPostFit 不会并行化训练步骤。底层估计器的 .fit 方法会正常调用。

由于只包装了 predictpredict_probatransform 方法,wrappers.ParallelPostFit 在训练数据集相对较小(适合单机内存),而预测或转换必须在更大的数据集(可能大于单机内存)上进行的情况下最为有用。

In [1]: from sklearn.ensemble import GradientBoostingClassifier

In [2]: import sklearn.datasets

In [3]: import dask_ml.datasets

In [4]: from dask_ml.wrappers import ParallelPostFit

在这个例子中,我们将制作一个小的1,000样本训练数据集

In [5]: X, y = sklearn.datasets.make_classification(n_samples=1000,
   ...:                                             random_state=0)
   ...: 

训练与直接调用 estimator.fit(X, y) 完全相同。除了复制学习到的属性外,ParallelPostFit 所做的就是这些。

In [6]: clf = ParallelPostFit(estimator=GradientBoostingClassifier())

In [7]: clf.fit(X, y)
Out[7]: ParallelPostFit(estimator=GradientBoostingClassifier())

此类适用于预测或转换大型数据集。我们将创建一个更大的 dask 数组 X_big,每个块包含 10,000 个样本。

In [8]: X_big, _ = dask_ml.datasets.make_classification(n_samples=100000,
   ...:                                                 chunks=10000,
   ...:                                                 random_state=0)
   ...: 

In [9]: clf.predict(X_big)
Out[9]: dask.array<_predict, shape=(100000,), dtype=int64, chunksize=(10000,), chunktype=numpy.ndarray>

这返回了一个 dask.array。像任何 dask 数组一样,实际的 compute 将导致调度器并行计算任务。如果你已经连接到一个 dask.distributed.Client,计算将在你的机器集群中并行化。

In [10]: clf.predict_proba(X_big).compute()[:10]
Out[10]: 
array([[0.24519988, 0.75480012],
       [0.00464304, 0.99535696],
       [0.00902734, 0.99097266],
       [0.01299259, 0.98700741],
       [0.95183049, 0.04816951],
       [0.75588097, 0.24411903],
       [0.93480418, 0.06519582],
       [0.0203811 , 0.9796189 ],
       [0.021179  , 0.978821  ],
       [0.94211917, 0.05788083]])

参见 并行预测 以了解支持向量分类器如何扩展的示例。

与其他 dask-ml 中的估计器的比较

dask-ml 重新实现了 scikit-learn 中的一些估计器,例如 dask_ml.cluster.KMeansdask_ml.preprocessing.QuantileTransformer。这引发了一个问题,我应该使用重新实现的 dask-ml 版本,还是应该将 scikit-learn 版本包装在一个元估计器中?这因估计器而异,并取决于您对近似解的容忍度和训练数据的大小。一般来说,如果您的训练数据较小,您可以放心地将 scikit-learn 版本包装在 dask-ml 元估计器中。