并行元估计器

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.29480178, 0.70519822],
       [0.00464304, 0.99535696],
       [0.00902734, 0.99097266],
       [0.01299259, 0.98700741],
       [0.94285054, 0.05714946],
       [0.70641268, 0.29358732],
       [0.94880928, 0.05119072],
       [0.0203811 , 0.9796189 ],
       [0.02708978, 0.97291022],
       [0.95614693, 0.04385307]])

有关此方法如何针对支持向量分类器进行扩展的示例,请参阅并行化预测

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

dask-ml 重新实现了 scikit-learn 中的一些估计器,例如 dask_ml.cluster.KMeans,或者 dask_ml.preprocessing.QuantileTransformer。这就引出了一个问题:我应该使用重新实现的 dask-ml 版本,还是应该将 scikit-learn 版本包装在元估计器中?这因估计器而异,取决于您对近似解决方案的容忍度以及训练数据的大小。一般来说,如果您的训练数据很小,将 scikit-learn 版本包装在 dask-ml 元估计器中即可。