评分和预测大型数据集

实时笔记本

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

评分和预测大型数据集

有时你会使用一个适合内存的小数据集进行训练,但需要对一个更大的(可能大于内存)数据集进行预测或评分。也许你的 学习曲线 已经趋于平稳,或者你只有数据子集的标签。

在这种情况下,您可以使用 ParallelPostFit 来并行化和分布评分或预测步骤。

[ ]:
from dask.distributed import Client, progress

# Scale up: connect to your own cluster with more resources
# see http://dask.pydata.org/en/latest/setup.html
client = Client(processes=False, threads_per_worker=4,
                n_workers=1, memory_limit='2GB')
client
[ ]:
import numpy as np
import dask.array as da
from sklearn.datasets import make_classification

我们将使用 scikit-learn 生成一个小型的随机数据集。

[ ]:
X_train, y_train = make_classification(
    n_features=2, n_redundant=0, n_informative=2,
    random_state=1, n_clusters_per_class=1, n_samples=1000)
X_train[:5]

我们将使用 dask.array 多次克隆该数据集。X_largey_large 代表我们内存无法容纳的大型数据集。

[ ]:
# Scale up: increase N, the number of times we replicate the data.
N = 100
X_large = da.concatenate([da.from_array(X_train, chunks=X_train.shape)
                          for _ in range(N)])
y_large = da.concatenate([da.from_array(y_train, chunks=y_train.shape)
                          for _ in range(N)])
X_large

由于我们的训练数据集适合在内存中,我们可以使用 scikit-learn 估计器作为训练期间实际拟合的估计器。但我们知道我们希望对大型数据集进行预测,因此我们将使用 ParallelPostFit 包装 scikit-learn 估计器。

[ ]:
from sklearn.linear_model import LogisticRegressionCV
from dask_ml.wrappers import ParallelPostFit
[ ]:
clf = ParallelPostFit(LogisticRegressionCV(cv=3), scoring="r2")

参见 dask-ml 文档中关于何时以及为何需要 scoring 参数的说明:http://www.aidoczh.com/dask-ml/modules/generated/dask_ml.wrappers.ParallelPostFit.html#dask_ml.wrappers.ParallelPostFit.

现在我们将调用 clf.fit。Dask-ML 在这里不做任何处理,因此这一步只能使用适合内存的数据集。

[ ]:
clf.fit(X_train, y_train)

既然训练已经完成,我们将转向对整个(大于内存的)数据集进行预测。

[ ]:
y_pred = clf.predict(X_large)
y_pred

y_pred 是一个 Dask 数组。工作者可以将预测值写入共享文件系统,而无需将数据收集到单个机器上。

或者我们可以检查模型在整个大型数据集上的得分。计算将以并行方式进行,没有任何一台机器需要保存所有数据。

[ ]:
clf.score(X_large, y_large)
[ ]: