评分和预测大型数据集
实时笔记本
你可以在 live session 中运行此笔记本,或查看 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_large
和 y_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)
[ ]: