ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

不均衡データでの分類

この例では、1 つのクラスに他のクラスより多くの観測値が含まれる場合の分類方法を示します。まず、このようなケースを処理するように設計されている RUSBoost アルゴリズムを試します。

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

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

データの取得

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

gunzip('http://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);
toc
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
Elapsed time is 426.143168 seconds.

分類誤差の検査

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

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

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

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

tic
Yfit = predict(rusTree,covtype(istest,:));
toc
tab = tabulate(Y(istest));
bsxfun(@rdivide,confusionmat(Y(istest),Yfit),tab(:,2))*100
Elapsed time is 245.604008 seconds.

ans =

   90.5354    4.1040    0.0434         0    1.0480    0.1511    4.1182
   17.5171   71.2467    1.8292    0.0162    6.4335    2.2803    0.6770
         0    0.0671   93.6678    1.6558    0.5594    4.0499         0
         0         0    3.7145   94.6832         0    1.6023         0
    0.1054    0.1896    0.5057         0   98.8622    0.3371         0
         0    0.1037    2.7064    1.1056    0.3340   95.7503         0
    0.2340    0.0098         0         0    0.0098         0   99.7465

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

アンサンブルの圧縮

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

cmpctRus = compact(rusTree);

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

   1.0e+09 *

    1.6575    0.9418

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

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

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

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

   452637153

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

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

    0.1833

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

参考

| | | | | | | | | | |

関連するトピック