使用投票分类器
使用投票分类器¶
一个投票分类器模型将多个不同的模型(即子估计器)组合成一个单一模型,该模型(理想情况下)比任何单个模型本身更强大。
Dask 提供了在集群中不同机器上训练单个子估计器的软件。这使得用户能够并行训练比在单台机器上可能训练的更多模型。请注意,用户只有在使用资源多于其单台机器的分布式集群时,才能看到这一好处(因为 sklearn 已经允许用户在单台机器上跨核心并行训练)。
以下是在 dask 中部署投票分类器模型(使用本地集群)的示例。
[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 |
集群信息
LocalCluster
0fb6a26e
仪表盘: http://127.0.0.1:8787/status | 工作节点 2 |
总线程数 2 | 总内存: 6.78 GiB |
状态: 运行中 | 使用进程: True |
调度器信息
调度器
Scheduler-5cd77096-ccb9-489c-8f73-bb70bd3c0de6
通信: tcp://127.0.0.1:37223 | 工作节点 2 |
仪表盘: http://127.0.0.1:8787/status | 总线程数 2 |
启动时间: 刚刚 | 总内存: 6.78 GiB |
工作节点
工作节点: 0
通信: tcp://127.0.0.1:37799 | 总线程数 1 |
仪表盘: http://127.0.0.1:40739/status | 内存: 3.39 GiB |
Nanny: tcp://127.0.0.1:37995 | |
本地目录: /home/runner/work/dask-examples/dask-examples/machine-learning/dask-worker-space/worker-p2j5wsnz |
工作节点: 1
通信: tcp://127.0.0.1:33541 | 总线程数 1 |
仪表盘: http://127.0.0.1:42027/status | 内存: 3.39 GiB |
Nanny: tcp://127.0.0.1:37335 | |
本地目录: /home/runner/work/dask-examples/dask-examples/machine-learning/dask-worker-space/worker-u_ezjujo |
为了训练投票分类器,我们调用分类器的 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 将使我们能够利用多台机器并在其上训练子估计器。