实时笔记本

您可以在 live session Binder 中运行此笔记本,或查看 Github 上的内容。

Dask 用于机器学习

这是一个高层次的概述,展示了 Dask-ML 的一些组件。访问主要的 Dask-ML 文档,查看 dask 教程 笔记本 08,或探索一些其他的机器学习示例。

[ ]:
from dask.distributed import Client, progress
client = Client(processes=False, threads_per_worker=4,
                n_workers=1, memory_limit='2GB')
client

分布式训练

36ce683507fb4107a47b31a5ac58a6d7 8f2e79b2d0ef4f7287b1426848635cc8

Scikit-learn 使用 joblib 进行单机并行处理。这使得您可以在笔记本电脑或工作站的所有核心上训练大多数估计器(任何接受 n_jobs 参数的估计器)。

另外,Scikit-Learn 可以使用 Dask 进行并行处理。这使您可以在不显著改变代码的情况下,利用 集群 的所有核心来训练那些估计器。

这对于在中等规模的数据集上训练大型模型非常有用。当你在搜索许多超参数时,或者在使用包含许多个体估计器的集成方法时,你可能会有一个大型模型。对于太小的数据集,训练时间通常足够短,集群范围的并行性不会有帮助。对于太大的数据集(大于单个机器的内存),scikit-learn估计器可能无法应对(见下文)。

创建 Scikit-Learn 估计器

[ ]:
from sklearn.datasets import make_classification
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
import pandas as pd

我们将使用 scikit-learn 来创建一对小的随机数组,一个用于特征 X,另一个用于目标 y

[ ]:
X, y = make_classification(n_samples=1000, random_state=0)
X[:5]

我们将使用 网格搜索 来找到 \(C\) 超参数的最佳值,拟合一个 支持向量分类器

[ ]:
param_grid = {"C": [0.001, 0.01, 0.1, 0.5, 1.0, 2.0, 5.0, 10.0],
              "kernel": ['rbf', 'poly', 'sigmoid'],
              "shrinking": [True, False]}

grid_search = GridSearchCV(SVC(gamma='auto', random_state=0, probability=True),
                           param_grid=param_grid,
                           return_train_score=False,
                           cv=3,
                           n_jobs=-1)

为了适应通常情况,我们会调用

grid_search.fit(X, y)

要使用集群进行拟合,我们只需使用 joblib 提供的上下文管理器。

[ ]:
import joblib

with joblib.parallel_backend('dask'):
    grid_search.fit(X, y)

我们拟合了48个不同的模型,每个模型对应 param_grid 中的一个超参数组合,这些模型分布在集群中。此时,我们拥有一个常规的scikit-learn模型,可以用于预测、评分等。

[ ]:
pd.DataFrame(grid_search.cv_results_).head()
[ ]:
grid_search.predict(X)[:5]
[ ]:
grid_search.score(X, y)

有关使用分布式 joblib 训练 scikit-learn 模型的更多信息,请参阅 dask-ml 文档

在大数据集上进行训练

scikit-learn 中的大多数估计器设计用于处理内存中的数组。使用更大的数据集进行训练可能需要不同的算法。

Dask-ML 中实现的所有算法都能很好地处理大于内存的数据集,这些数据集可以存储在 dask 数组数据框 中。

[ ]:
%matplotlib inline
[ ]:
import dask_ml.datasets
import dask_ml.cluster
import matplotlib.pyplot as plt

在这个例子中,我们将使用 dask_ml.datasets.make_blobs 来生成一些随机的 dask 数组。

[ ]:
X, y = dask_ml.datasets.make_blobs(n_samples=10000000,
                                   chunks=1000000,
                                   random_state=0,
                                   centers=3)
X = X.persist()
X

我们将使用 Dask-ML 中实现的 k-means 来对点进行聚类。它使用 k-means||``(读作:“k-means 并行”)初始化算法,该算法比 ``k-means++ 具有更好的扩展性。所有的计算,无论是在初始化期间还是之后,都可以并行进行。

[ ]:
km = dask_ml.cluster.KMeans(n_clusters=3, init_max_iter=2, oversampling_factor=10)
km.fit(X)

我们将绘制一组点,这些点根据其所属的簇进行着色。

[ ]:
fig, ax = plt.subplots()
ax.scatter(X[::10000, 0], X[::10000, 1], marker='.', c=km.labels_[::10000],
           cmap='viridis', alpha=0.25);

有关 Dask-ML 中实现的所有估计器,请参阅 API 文档