メインコンテンツ

アンサンブル分類の並列学習

R2026b

この例では、アンサンブル分類の並列学習の方法を示します。モデルには、赤と緑の基底位置が 10 個ずつと、それらの基底位置を中心に正規分布する赤と緑の母集団があります。目的は、それぞれの位置に基づいて点を分類することです。各色の基底位置どうしが近くにある場合もあるため、これらの分類はあいまいです。

各色の基底位置を 10 個ずつ作成してプロットします。

rng default % For reproducibility
grnpop = mvnrnd([1,0],eye(2),10);
redpop = mvnrnd([0,1],eye(2),10);
plot(grnpop(:,1),grnpop(:,2),'go')
hold on
plot(redpop(:,1),redpop(:,2),'ro')
hold off

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

ランダムな基底点を中心とする各色の点を 40,000 個ずつ作成します。

N = 40000;
redpts = zeros(N,2);grnpts = redpts;
for i = 1:N
    grnpts(i,:) = mvnrnd(grnpop(randi(10),:),eye(2)*0.02);
    redpts(i,:) = mvnrnd(redpop(randi(10),:),eye(2)*0.02);
end
figure
plot(grnpts(:,1),grnpts(:,2),'go')
hold on
plot(redpts(:,1),redpts(:,2),'ro')
hold off

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

cdata = [grnpts;redpts];
grp = ones(2*N,1);
% Green label 1, red label -1
grp(N+1:2*N) = -1;

バギング分類アンサンブルをデータに当てはめます。並列学習による比較のために、アンサンブルを逐次的に当てはめて学習時間を取得します。

tic
mdl = fitcensemble(cdata,grp,'Method','Bag');
stime = toc
stime = 
12.6677

当てはめたモデルの out-of-bag 損失を評価します。

myerr = oobLoss(mdl)
myerr = 
0.0572

再現性のある木テンプレートとパラレル サブストリームを使用して並列的にバギング分類モデルを作成します。クラスターに対する並列プールを作成するか、ローカル マシンのスレッド ワーカーの並列プールを作成できます。適切な並列環境の選択については、スレッドベースの環境またはプロセスベースの環境の選択 (Parallel Computing Toolbox)を参照してください。

parpool
Starting parallel pool (parpool) using the 'Processes' profile ...
31-Jul-2026 08:57:58: Job Running. Waiting for parallel pool workers to connect ...
31-Jul-2026 08:58:59: Job Running. Waiting for parallel pool workers to connect ...
31-Jul-2026 09:00:00: Job Running. Waiting for parallel pool workers to connect ...
Connected to parallel pool with 8 workers.

ans = 

 ProcessPool with properties: 

            Connected: true
           NumWorkers: 8
                 Busy: false
              Cluster: Processes (Local Cluster)
        AttachedFiles: {}
    AutoAddClientPath: true
            FileStore: [1x1 parallel.FileStore]
           ValueStore: [1x1 parallel.ValueStore]
          IdleTimeout: 30 minutes (30 minutes remaining)
          SpmdEnabled: true
s = RandStream('mrg32k3a');
options = statset("UseParallel","auto","UseSubstreams",true,"Streams",s);
t = templateTree("Reproducible",true);
tic
mdl2 = fitcensemble(cdata,grp,'Method','Bag','Learners',t,'Options',options);
ptime = toc
ptime = 
6.5968

この 8 コアのシステムでは、並列の学習プロセスの方が高速です。

speedup = stime/ptime
speedup = 
1.9203

このモデルの out-of-bag 損失を評価します。

myerr2 = oobLoss(mdl2)
myerr2 = 
0.0577

誤差率は最初のモデルと同等です。

モデルの再現性を実証するために、乱数ストリームをリセットしてモデルを再度当てはめます。

reset(s);
tic
mdl2 = fitcensemble(cdata,grp,'Method','Bag','Learners',t,'Options',options);
toc
Elapsed time is 3.528188 seconds.

損失が前の損失と同じであることを確認します。

myerr2 = oobLoss(mdl2)
myerr2 = 
0.0577

参考

|

トピック