Main Content

不均衡データでの分類

この例では、あるクラスに他のクラスよりはるかに多くの観測値が含まれる場合に分類を実行する方法を示します。このようなケースに対処するように設計されているので、はじめに RUSBoost アルゴリズムを使用します。不均衡なデータを処理する方法には、名前と値のペアの引数 'Prior' または 'Cost' を使用するものもあります。詳細については、アンサンブル分類における不均衡データまたは一様ではない誤分類コストの処理を参照してください。

この例では、UCI 機械学習アーカイブの "Cover type" データ (詳細については https://archive.ics.uci.edu/ml/datasets/Covertype を参照) を使用します。このデータでは、森林被覆の種類を、標高、土壌の種類、水源までの距離などの予測子に基づいて分類しています。このデータには 500,000 件を超える観測値と 50 を超える予測子があるため、分類器の学習や使用に時間がかかります。

Blackard と Dean [1] がこのデータのニューラル ネット分類について説明しています。これによると、分類精度は 70.6% と見積もられています。RUSBoost の分類精度は 81% を超えます。

データの取得

データをワークスペースにインポートします。最後のデータ列を抽出して Y という名前の変数に格納します。

gunzip('https://archive.ics.uci.edu/ml/machine-learning-databases/covtype/covtype.data.gz')
load covtype.data
Y = covtype(:,end);
covtype(:,end) = [];

応答データの調査

tabulate(Y)
  Value    Count   Percent
      1    211840     36.46%
      2    283301     48.76%
      3    35754      6.15%
      4     2747      0.47%
      5     9493      1.63%
      6    17367      2.99%
      7    20510      3.53%

データ点は何十万個もあります。クラス 4 に含まれているのは全体の 0.5% 未満です。このような不均衡なデータには、RUSBoost アルゴリズムが適切です。

品質評価用のデータの分割

データの半分は分類器の当てはめに使用し、残りの半分は生成された分類器の品質評価に使用します。

rng(10,'twister')         % For reproducibility
part = cvpartition(Y,'Holdout',0.5);
istrain = training(part); % Data for fitting
istest = test(part);      % Data for quality assessment
tabulate(Y(istrain))
  Value    Count   Percent
      1    105919     36.46%
      2    141651     48.76%
      3    17877      6.15%
      4     1374      0.47%
      5     4747      1.63%
      6     8684      2.99%
      7    10254      3.53%

アンサンブルの作成

深いツリーを使用してアンサンブルの精度を上げます。これを行うため、決定分岐の最大数が N になるように木を設定します。N は学習標本内の観測値の数です。また、LearnRate0.1 に設定し、精度が高くなるようにします。データは大規模で、深いツリーがあるため、アンサンブルの作成に時間がかかります。

N = sum(istrain);         % Number of observations in the training sample
t = templateTree('MaxNumSplits',N);
tic
rusTree = fitcensemble(covtype(istrain,:),Y(istrain),'Method','RUSBoost', ...
    'NumLearningCycles',1000,'Learners',t,'LearnRate',0.1,'nprint',100);
Training RUSBoost...
Grown weak learners: 100
Grown weak learners: 200
Grown weak learners: 300
Grown weak learners: 400
Grown weak learners: 500
Grown weak learners: 600
Grown weak learners: 700
Grown weak learners: 800
Grown weak learners: 900
Grown weak learners: 1000
toc
Elapsed time is 242.836734 seconds.

分類誤差の検査

アンサンブルのメンバー数に対して分類誤差をプロットします。

figure;
tic
plot(loss(rusTree,covtype(istest,:),Y(istest),'mode','cumulative'));
toc
Elapsed time is 164.470086 seconds.
grid on;
xlabel('Number of trees');
ylabel('Test classification error');

このアンサンブルは、使用しているツリー数が 116 以上の場合に、分類誤差が 20% 未満となっています。500 本以上の木のため、分類誤差はよりゆっくり低下します。

各クラスの混同行列を、真のクラスのパーセンテージとして調べます。

tic
Yfit = predict(rusTree,covtype(istest,:));
toc
Elapsed time is 132.353489 seconds.
confusionchart(Y(istest),Yfit,'Normalization','row-normalized','RowSummary','row-normalized')

クラス 2 を除くすべてのクラスで分類精度が 90% を超えています。ただし、クラス 2 はデータの約半分を占めているため、全体の精度はそれほど高くなりません。

アンサンブルの圧縮

アンサンブルは大きくなっています。メソッド compact を使ってデータを除去します。

cmpctRus = compact(rusTree);

sz(1) = whos('rusTree');
sz(2) = whos('cmpctRus');
[sz(1).bytes sz(2).bytes]
ans = 1×2
109 ×

    1.6579    0.9423

圧縮されたアンサンブルのサイズは、元のアンサンブルの約半分です。

ツリーの半分を cmpctRus から削除します。この操作による予測性能への影響は最小限になると考えられます。これは、1000 本の木のうち 500 本を使用すればほぼ最適な精度が得られるという観測に基づいています。

cmpctRus = removeLearners(cmpctRus,[500:1000]);

sz(3) = whos('cmpctRus');
sz(3).bytes
ans = 452868660

圧縮されたアンサンブルで消費されるメモリは、完全な状態のアンサンブルの場合と比べて約 4 分の 1 になります。全体での損失の比率は 19% 未満となります。

L = loss(cmpctRus,covtype(istest,:),Y(istest))
L = 0.1833

アンサンブルの精度にバイアスがある可能性があるため、新しいデータについての予測精度は異なる場合があります。このバイアスが発生するのは、アンサンブルサイズの圧縮にアンサンブルの評価と同じデータが使用されるためです。必要なアンサンブルサイズについて不偏推定値を得るには、交差検証を実行します。ただし、この処理は時間がかかります。

参照

[1] Blackard, J. A. and D. J. Dean. "Comparative accuracies of artificial neural networks and discriminant analysis in predicting forest cover types from cartographic variables". Computers and Electronics in Agriculture Vol. 24, Issue 3, 1999, pp. 131–151.

参考

| | | | | | | | | |

関連するトピック