使用投票分类器

实时 Notebook

您可以在实时会话中运行此 Notebook Binder,或在Github 上查看。

使用投票分类器

一个投票分类器模型将多个不同的模型(即子估计器)组合成一个单一模型,该模型(理想情况下)比任何单个模型本身更强大。

Dask 提供了在集群中不同机器上训练单个子估计器的软件。这使得用户能够并行训练比在单台机器上可能训练的更多模型。请注意,用户只有在使用资源多于其单台机器的分布式集群时,才能看到这一好处(因为 sklearn 已经允许用户在单台机器上跨核心并行训练)。

以下是在 dask 中部署投票分类器模型(使用本地集群)的示例。

Dask logo

[1]:
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import SGDClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC

import sklearn.datasets

我们创建一个合成数据集(包含 1000 行和 20 列),可以将其提供给投票分类器模型。

[2]:
X, y = sklearn.datasets.make_classification(n_samples=1_000, n_features=20)

我们将 VotingClassifier 指定为 (名称, 子估计器) 元组列表。在数据上拟合 VotingClassifier 会依次拟合每个子估计器。我们将 n_jobs 参数设置为 -1,这指示 sklearn 使用所有可用核心(请注意,我们尚未在此处使用 dask)。

[3]:
classifiers = [
    ('sgd', SGDClassifier(max_iter=1000)),
    ('logisticregression', LogisticRegression()),
    ('svc', SVC(gamma='auto')),
]
clf = VotingClassifier(classifiers, n_jobs=-1)

我们调用分类器的 fit 方法来训练分类器。

[4]:
%time clf.fit(X, y)
CPU times: user 15.6 ms, sys: 28 ms, total: 43.6 ms
Wall time: 1.05 s
[4]:
VotingClassifier(estimators=[('sgd', SGDClassifier()),
                             ('logisticregression', LogisticRegression()),
                             ('svc', SVC(gamma='auto'))],
                 n_jobs=-1)

创建 Dask client 通过仪表盘提供性能和进度指标。由于 Client 没有提供参数,其输出指的是本地集群(而不是分布式集群)。

运行单元格后,可以通过点击链接查看仪表盘。

[5]:
import joblib
from distributed import Client

client = Client()
client
[5]:

客户端

Client-aab9cc32-0de1-11ed-a68c-000d3a8f7959

连接方法: 集群对象 集群类型: distributed.LocalCluster
仪表盘: http://127.0.0.1:8787/status

集群信息

为了训练投票分类器,我们调用分类器的 fit 方法,但将其封装在 joblib 的 parallel_backend 上下文管理器中。这会将子估计器的训练分布到集群中。

[6]:
%%time
with joblib.parallel_backend("dask"):
    clf.fit(X, y)

print(clf)
VotingClassifier(estimators=[('sgd', SGDClassifier()),
                             ('logisticregression', LogisticRegression()),
                             ('svc', SVC(gamma='auto'))],
                 n_jobs=-1)
CPU times: user 203 ms, sys: 79.1 ms, total: 282 ms
Wall time: 1.12 s

请注意,由于我们使用的是本地集群而非分布式集群,并且 sklearn 已经使用了我计算机的所有核心,因此使用 dask 并未看到优势。如果使用分布式集群,dask 将使我们能够利用多台机器并在其上训练子估计器。