ドキュメンテーション

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

アンサンブル品質テスト

アンサンブルの予測品質を学習データでの性能に基づいて評価することはできません。アンサンブルは “過学習” の傾向があり、予測力について過度に楽観的な推定がなされます。つまり、通常は分類の resubLoss (回帰では resubLoss) の結果は、新しいデータで予測する場合より小さい誤差を示すことを意味します。

アンサンブル品質をより正確に把握できるようにするには、次のいずれかの方式を使用します。

  • 独立したテスト セットでアンサンブルを評価します (十分な学習データがあるときに適しています)。

  • 交差検証によってアンサンブルを評価します (十分な学習データがないときに適しています)。

  • out-of-bag データでアンサンブルを評価します (バギングされたアンサンブルを fitcensemble または fitrensemble で作成するときに適しています)。

アンサンブル品質テスト

この例では、アンサンブル品質を評価する 3 つの方式をすべて使用できるように、バギングされたアンサンブルを使用します。

20 の予測子を指定して人為的なデータセットを生成します。各エントリは 0 ~ 1 の乱数です。初期分類は、 の場合は 、それ以外の場合は です。

rng(1,'twister') % for reproducibility
X = rand(2000,20);
Y = sum(X(:,1:5),2) > 2.5;

さらに、結果にノイズを追加するために、分類の 10% をランダムに入れ替えます。

idx = randsample(2000,200);
Y(idx) = ~Y(idx);

独立したテスト セット

独立した学習セットとテスト セットのデータを作成します。cvpartitionholdout オプションを指定して呼び出すことによって、データの 70% を学習セットに使用します。

cvpart = cvpartition(Y,'holdout',0.3);
Xtrain = X(training(cvpart),:);
Ytrain = Y(training(cvpart),:);
Xtest = X(test(cvpart),:);
Ytest = Y(test(cvpart),:);

学習データを基にツリー数 200 のバギングされたアンサンブル分類を作成します。

bag = fitcensemble(Xtrain,Ytrain,'Method','Bag','NumLearningCycles',200)
bag = 
  classreg.learning.classif.ClassificationBaggedEnsemble
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: [0 1]
           ScoreTransform: 'none'
          NumObservations: 1400
               NumTrained: 200
                   Method: 'Bag'
             LearnerNames: {'Tree'}
     ReasonForTermination: 'Terminated normally after completing the requested number of training cycles.'
                  FitInfo: []
       FitInfoDescription: 'None'
                FResample: 1
                  Replace: 1
         UseObsForLearner: [1400x200 logical]


  Properties, Methods

検定データの損失 (誤分類) をアンサンブル内の学習済みのツリー数の関数としてプロットします。

figure;
plot(loss(bag,Xtest,Ytest,'mode','cumulative'));
xlabel('Number of trees');
ylabel('Test classification error');

交差検証

5 分割交差検証を使用したバギングされたアンサンブルを生成します。

cv = fitcensemble(X,Y,'Method','Bag','NumLearningCycles',200,'Kfold',5)
cv = 
  classreg.learning.partition.ClassificationPartitionedEnsemble
    CrossValidatedModel: 'Bag'
         PredictorNames: {1x20 cell}
           ResponseName: 'Y'
        NumObservations: 2000
                  KFold: 5
              Partition: [1x1 cvpartition]
      NumTrainedPerFold: [200 200 200 200 200]
             ClassNames: [0 1]
         ScoreTransform: 'none'


  Properties, Methods

交差検証損失をアンサンブル内のツリー数の関数として検査します。

figure;
plot(loss(bag,Xtest,Ytest,'mode','cumulative'));
hold on;
plot(kfoldLoss(cv,'mode','cumulative'),'r.');
hold off;
xlabel('Number of trees');
ylabel('Classification error');
legend('Test','Cross-validation','Location','NE');

交差検証により、独立集合の場合と同等の推定値が得られます。

out-of-bag 推定

out-of-bag 推定の損失曲線を生成し、他の曲線と共にプロットします。

figure;
plot(loss(bag,Xtest,Ytest,'mode','cumulative'));
hold on;
plot(kfoldLoss(cv,'mode','cumulative'),'r.');
plot(oobLoss(bag,'mode','cumulative'),'k--');
hold off;
xlabel('Number of trees');
ylabel('Classification error');
legend('Test','Cross-validation','Out of bag','Location','NE');

out-of-bag 推定でも、他の手法と同等の結果が示されています。

参考

| | | | | | | |

関連するトピック