ドキュメンテーション

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

resubPredict

クラス: ClassificationECOC

マルチクラス誤り訂正出力符号モデルの再代入応答の予測

構文

label = resubPredict(Mdl)
label = resubPredict(Mdl,Name,Value)
[label,NegLoss,PBScore] = resubPredict(___)
[label,NegLoss,PBScore,Posterior] = resubPredict(___)

説明

label = resubPredict(Mdl) は、学習済みのマルチクラス誤り訂正出力符号モデル Mdl に基づいて、(Mdl.X に格納されている) 予測子データの予測クラス ラベルのベクトルを返します。

符号を反転した最大の平均バイナリ損失 (つまり、最小の平均バイナリ損失と等しい) の発生するクラスに観測を割り当てることで、観測の分類が予測されます。

label = resubPredict(Mdl,Name,Value) は、1 つ以上の Name,Value のペアの引数が指定された追加オプションにより、予測クラス ラベルを返します。

たとえば、事後確率推定法、復号化スキームまたは詳細レベルを指定します。

[label,NegLoss,PBScore] = resubPredict(___) はさらに、観測のクラスごとの符号を反転した平均バイナリ損失 (NegLoss)、または各バイナリ学習器により分類された観測の陽性クラス スコア (PBScore) を返します。

[label,NegLoss,PBScore,Posterior] = resubPredict(___) はさらに、観測 (Posterior) の事後クラス確率推定を返します。

事後クラス確率を得るには、fitcecoc を使用して ECOC モデルを学習させる際に 'FitPosterior',1 を設定しなければなりません。それ以外の場合は、resubPredict はエラーをスローします。

入力引数

すべて展開する

マルチクラス ECOC モデル。fitcecoc によって返される ClassificationECOC モデルを指定します。

名前と値のペアの引数

オプションの引数 Name,Value のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で閉じなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を任意の順序で指定できます。

バイナリ学習器の損失関数。'BinaryLoss' と組み込みの損失関数名または関数ハンドルから構成されるコンマ区切りのペアとして指定します。

  • 次の表には、組み込み関数の名前と説明が含まれています。ここで、yj は特定のバイナリ学習器のクラス ラベル (集合 {–1,1,0} 内)、sj は観測値 j のスコア、g(yj,sj) はバイナリ損失の式です。

    説明スコア領域g(yj,sj)
    'binodeviance'二項分布からの逸脱度(–∞,∞)log[1 + exp(–2yjsj)]/[2log(2)]
    'exponential'指数(–∞,∞)exp(–yjsj)/2
    'hamming'ハミング[0,1] または (–∞,∞)[1 – sign(yjsj)]/2
    'hinge'ヒンジ(–∞,∞)max(0,1 – yjsj)/2
    'linear'線形(–∞,∞)(1 – yjsj)/2
    'logit'ロジスティック(–∞,∞)log[1 + exp(–yjsj)]/[2log(2)]
    'quadratic'2 次[0,1][1 – yj(2sj – 1)]2/2

    バイナリ損失は、yj = 0 の場合に損失が 0.5 になるように正規化されます。また、各クラスについて平均のバイナリ損失が計算されます。

  • カスタム バイナリ損失関数の場合は関数ハンドルを指定します。たとえば、customFunction の場合は 'BinaryLoss',@customFunction を指定します。

    customFunction の形式は次のとおりです。

    bLoss = customFunction(M,s)
    ここで、

    • MMdl.CodingMatrix に格納された K 行 L 列のコーディング行列です。

    • s は、1 行 L 列の分類スコアの行ベクトルです。

    • bLoss は分類損失です。このスカラーは、特定のクラスのすべての学習器についてバイナリ損失を集計します。たとえば、平均バイナリ損失を使用して、各クラスの学習器の損失を集計できます。

    • K は、クラスの数です。

    • L は、バイナリ学習器の数です。

    カスタムなバイナリ損失関数を渡す例については、カスタム バイナリ損失関数を使用する ECOC モデルの検定標本ラベルの予測を参照してください。

既定の設定では、すべてのバイナリ学習器が

  • SVM である場合、または SVM 学習器の線形分類モデルまたはカーネル分類モデルのいずれかである場合、BinaryLoss'hinge'

  • AdaboostM1 または GentleBoost によって学習させたアンサンブルの場合、BinaryLoss'exponential'

  • LogitBoost によって学習させたアンサンブルの場合、BinaryLoss'binodeviance'

  • ロジスティック回帰学習器の線形分類モデルまたはカーネル分類モデルである場合、またはクラス事後確率を予測するように指定した場合 (つまり fitcecoc'FitPosterior',1 を設定した場合)、BinaryLoss'quadratic'

それ以外の場合、'BinaryLoss' の既定値は 'hamming' です。既定値を確認するには、コマンド ラインでドット表記を使用して学習済みモデルの BinaryLoss プロパティを表示します。

例: 'BinaryLoss','binodeviance'

データ型: char | string | 関数ハンドル

バイナリ損失を集計する復号化方式。'Decoding''lossweighted' または 'lossbased' から構成されるコンマ区切りのペアとして指定します。詳細は、バイナリ損失 を参照してください。

例: 'Decoding','lossbased'

カルバック・ライブラー ダイバージェンスの最小化により事後確率をあてはめるためのランダムな初期値の個数。'NumKLInitializations' と非負の整数スカラーから構成されるコンマ区切りのペアとして指定します。

4 番目の出力引数 (Posterior) を要求せず、'PosteriorMethod','kl' (既定の設定) を設定する場合、NumKLInitializations の値は無視されます。

詳細は、カルバック・ライブラー ダイバージェンスを使用する事後推定を参照してください。

例: 'NumKLInitializations',5

データ型: single | double

推定オプション。statset により返される 'Options' と構造体配列から構成されるコンマ区切りのペアとして指定します。

並列計算を起動するには、以下を行います。

  • Parallel Computing Toolbox™ ライセンスが必要です。

  • 'Options',statset('UseParallel',1) を指定します。

事後確率推定法。'PosteriorMethod''kl' または 'qp' で構成されるコンマ区切りのペアとして指定します。

  • PosteriorMethod'kl' の場合、バイナリ学習器によって返される予測された事後確率と期待された事後確率間のカルバック・ライブラー ダイバージェンスを最小化することにより、マルチクラス事後確率が推定されます。詳細は、カルバック・ライブラー ダイバージェンスを使用する事後推定を参照してください。

  • PosteriorMethod'qp' の場合、二次計画法を使用して最小二乗問題を解決することでマルチクラス事後確率が推定されます。このオプションを使用するには Optimization Toolbox™ ライセンスが必要です。詳細は、二次計画法を使用する事後推定を参照してください。

  • 4 番目の出力引数 (Posterior) を要求しない場合、PosteriorMethod の値は無視されます。

例: 'PosteriorMethod','qp'

詳細レベル。'Verbose'0 または 1 から構成されるコンマ区切りのペアとして指定します。Verbose は、コマンド ウィンドウに表示される診断メッセージの量を制御します。

Verbose0 の場合、診断メッセージは表示されません。それ以外の場合は、診断メッセージが表示されます。

例: 'Verbose',1

データ型: single | double

出力引数

すべて展開する

予測クラス ラベル。categorical 配列、文字配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列として返されます。

labelMdl.ClassNames と同じデータ型であり、Mdl.X の行数に等しい長さです。

符号を反転した最大の平均バイナリ損失 (つまり、最小の平均バイナリ損失と等しい) の発生するクラスに観測を割り当てることで、観測の分類が予測されます。

符号を反転した平均バイナリ損失。数値行列として返します。NegLossnK 列の行列です。ここで n は観測 (size(Mdl.X,1)) の数、K は一意のクラス (size(Mdl.ClassNames,1)) の数です。

各バイナリ学習器の陽性クラスのスコア。数値行列として返します。PBScorenL 列の行列であり、n は観測値 (size(Mdl.X,1)) の数、L はバイナリ学習器 (size(Mdl.CodingMatrix,2)) の数です。

事後クラス確率。数値行列として返します。PosteriornK 列の行列です。ここで n は観測 (size(Mdl.X,1)) の数、K は一意のクラス (size(Mdl.ClassNames,1)) の数です。

fitcecoc を使用して ECOC モデルを学習させる場合、'FitPosterior',1 を設定して Posterior を要求しなければなりません。それ以外の場合は、エラーがスローされます。

すべて展開する

フィッシャーのアヤメのデータセットを読み込みます。

load fisheriris
X = meas;
Y = categorical(species);
n = numel(Y); % Sample size
classOrder = unique(Y);

SVM バイナリ分類器を使用して ECOC モデルを学習させます。予測子を標準化してクラスの順序を定義することをお勧めします。SVM テンプレートを使用して、予測子の標準化を指定します。

t = templateSVM('Standardize',1);
Mdl = fitcecoc(X,Y,'Learners',t,'ClassNames',classOrder);

t は SVM テンプレート オブジェクトです。学習中は、t の空のオプションの既定値が使用されます。MdlClassificationECOC モデルです。

学習データのラベルを予測します。真のラベルと予測されたラベルのランダムなサブセットを印刷します。

labels = resubPredict(Mdl);
rng(1);
idx = randsample(n,10);
table(Y(idx),labels(idx),'VariableNames',{'TrueLabels','PredictedLabels'})
ans =

  10x2 table

    TrueLabels    PredictedLabels
    __________    _______________

    setosa          setosa       
    versicolor      versicolor   
    virginica       virginica    
    setosa          setosa       
    versicolor      versicolor   
    setosa          setosa       
    versicolor      versicolor   
    versicolor      versicolor   
    setosa          setosa       
    setosa          setosa       

Mdl は、インデックス idx を使用して観測値に正確なラベルを付けました。

フィッシャーのアヤメのデータセットを読み込みます。

load fisheriris
X = meas;
Y = categorical(species);
n = numel(Y);           % Sample size
classOrder = unique(Y); % Class order
K = numel(classOrder);  % Number of classes

SVM バイナリ分類器を使用して ECOC モデルを学習させます。予測子を標準化してクラスの順序を定義することをお勧めします。SVM テンプレートを使用して、予測子の標準化を指定します。

t = templateSVM('Standardize',1);
Mdl = fitcecoc(X,Y,'Learners',t,'ClassNames',classOrder);

t は SVM テンプレート オブジェクトです。学習中は、t の空のオプションの既定値が使用されます。MdlClassificationECOC モデルです。

SVM スコアは観測から判定境界までの符号付き距離です。したがって、定義域は です。以下のようなカスタム バイナリ損失関数を作成します。

  • 各学習器の符号化設計行列 (M) と陽性クラスの分類スコア (s) を各観測値のバイナリ損失にマッピングする

  • 線形損失を使用する

  • 中央値を使用して、バイナリ学習器損失を集計します。

バイナリ損失関数用に独立した関数を作成し、MATLAB® パスに保存できます。あるいは、無名バイナリ損失関数を指定できます。

customBL = @(M,s)nanmedian(1 - bsxfun(@times,M,s),2)/2;

再代入ラベルを予測し、クラスごとの中央値のバイナリ損失を推定します。10 件の観測の無作為セットについて、クラスごとに中央値の符号を反転したバイナリ損失を出力します。

[label,NegLoss] = resubPredict(Mdl,'BinaryLoss',customBL);

rng(1); % For reproducibility
idx = randsample(n,10);
classOrder
table(Y(idx),label(idx),NegLoss(idx,:),'VariableNames',...
    {'TrueLabel','PredictedLabel','NegLoss'})
classOrder = 

  3x1 categorical array

     setosa 
     versicolor 
     virginica 


ans =

  10x3 table

    TrueLabel     PredictedLabel                NegLoss            
    __________    ______________    _______________________________

    setosa          versicolor      0.12376      1.9575     -3.5812
    versicolor      versicolor      -1.0171     0.62948     -1.1123
    virginica       virginica       -1.9088    -0.21759     0.62641
    setosa          versicolor      0.43846      2.2448     -4.1833
    versicolor      versicolor      -1.0735      0.3965    -0.82299
    setosa          versicolor      0.26658       2.201     -3.9675
    versicolor      versicolor      -1.1237     0.69927     -1.0756
    versicolor      versicolor      -1.2716     0.51847    -0.74687
    setosa          versicolor      0.35211      2.0683     -3.9204
    setosa          versicolor      0.23342      2.1892     -3.9226

列の順序は、classOrder の要素に対応します。符号が反転した最大損失に基づき、ラベルが予測されます。結果は、線形損失の中央値が他の損失ほど効果的に実行されない可能性があることを示しているようです。

フィッシャーのアヤメのデータセットを読み込みます。花弁の寸法を予測子として使用して、分類器を学習させます。

load fisheriris
X = meas(:,3:4);
Y = species;
rng(1); % For reproducibility

SVM テンプレートを作成し、ガウス カーネルを指定します。予測子の標準化をお勧めします。

t = templateSVM('Standardize',1,'KernelFunction','gaussian');

t は SVM テンプレートです。ほとんどのプロパティは空です。ECOC 分類器を学習させると、適用可能なプロパティが既定値に設定されます。

SVM テンプレートを使用して ECOC 分類器を学習させます。'FitPosterior' 名前と値のペアの引数を使用して分類スコアをクラス事後確率 (predict または resubPredict により返されます) へ変換します。'Verbose' 名前と値のペアの引数を使用して、学習中に診断メッセージを表示します。クラスの順序を指定することをお勧めします。

Mdl = fitcecoc(X,Y,'Learners',t,'FitPosterior',1,...
    'ClassNames',{'setosa','versicolor','virginica'},...
    'Verbose',2);
Training binary learner 1 (SVM) out of 3 with 50 negative and 50 positive observations.
Negative class indices: 2
Positive class indices: 1

Fitting posterior probabilities for learner 1 (SVM).
Training binary learner 2 (SVM) out of 3 with 50 negative and 50 positive observations.
Negative class indices: 3
Positive class indices: 1

Fitting posterior probabilities for learner 2 (SVM).
Training binary learner 3 (SVM) out of 3 with 50 negative and 50 positive observations.
Negative class indices: 3
Positive class indices: 2

Fitting posterior probabilities for learner 3 (SVM).

MdlClassificationECOC モデルです。同じ SVM テンプレートが各バイナリ学習器に適用されますが、テンプレートの cell ベクトルを渡すことで各バイナリ学習器のオプションを調整できます。

標本内ラベルとクラス事後確率を予測します。'Verbose' 名前と値のペアの引数を使用して、ラベルとクラス事後確率の計算中に診断メッセージを表示します。

[label,~,~,Posterior] = resubPredict(Mdl,'Verbose',1);
Mdl.BinaryLoss
Predictions from all learners have been computed.
Loss for all observations has been computed.
Computing posterior probabilities...

ans =

    'quadratic'

バイナリ損失の平均が最小となるクラスに観測が割り当てられます。すべてのバイナリ学習器が事後確率を計算しているので、バイナリ損失関数は quadratic になります。

無作為な結果の集合を表示します。

idx = randsample(size(X,1),10,1);
Mdl.ClassNames
table(Y(idx),label(idx),Posterior(idx,:),...
    'VariableNames',{'TrueLabel','PredLabel','Posterior'})
ans =

  3x1 cell array

    {'setosa'    }
    {'versicolor'}
    {'virginica' }


ans =

  10x3 table

     TrueLabel       PredLabel                    Posterior               
    ____________    ____________    ______________________________________

    'virginica'     'virginica'      0.0039321     0.0039869       0.99208
    'virginica'     'virginica'       0.017067      0.018263       0.96467
    'virginica'     'virginica'       0.014948      0.015856        0.9692
    'versicolor'    'versicolor'    2.2197e-14       0.87317       0.12683
    'setosa'        'setosa'             0.999    0.00025091    0.00074639
    'versicolor'    'virginica'     2.2195e-14      0.059429       0.94057
    'versicolor'    'versicolor'    2.2194e-14       0.97001      0.029986
    'setosa'        'setosa'             0.999     0.0002499    0.00074741
    'versicolor'    'versicolor'     0.0085646       0.98259      0.008849
    'setosa'        'setosa'             0.999    0.00025013    0.00074718

Posterior の列は Mdl.ClassNames のクラスの順序に対応します。

観測された予測子領域の値のグリッドを定義します。グリッド内の各インスタンスの事後確率を予測します。

xMax = max(X);
xMin = min(X);

x1Pts = linspace(xMin(1),xMax(1));
x2Pts = linspace(xMin(2),xMax(2));
[x1Grid,x2Grid] = meshgrid(x1Pts,x2Pts);

[~,~,~,PosteriorRegion] = predict(Mdl,[x1Grid(:),x2Grid(:)]);

各グリッドの座標では、クラス間の最大クラス事後確率をプロットします。

figure;
contourf(x1Grid,x2Grid,...
        reshape(max(PosteriorRegion,[],2),size(x1Grid,1),size(x1Grid,2)));
h = colorbar;
h.YLabel.String = 'Maximum posterior';
h.YLabel.FontSize = 15;
hold on
gh = gscatter(X(:,1),X(:,2),Y,'krk','*xd',8);
gh(2).LineWidth = 2;
gh(3).LineWidth = 2;

title 'Iris Petal Measurements and Maximum Posterior';
xlabel 'Petal length (cm)';
ylabel 'Petal width (cm)';
axis tight
legend(gh,'Location','NorthWest')
hold off

並列計算を使用して誤り訂正出力符号、マルチクラス モデルを学習させ、事後確率を推定します。

arrhythmia データセットを読み込みます。

load arrhythmia
Y = categorical(Y);
tabulate(Y)
n = numel(Y);
K = numel(unique(Y));
  Value    Count   Percent
      1      245     54.20%
      2       44      9.73%
      3       15      3.32%
      4       15      3.32%
      5       13      2.88%
      6       25      5.53%
      7        3      0.66%
      8        2      0.44%
      9        9      1.99%
     10       50     11.06%
     14        4      0.88%
     15        5      1.11%
     16       22      4.87%

複数のクラスはデータに表示されません。また他の多くのクラスは相対的頻度が低くなります。

GentleBoost メソッドと 50 個の分類木弱学習器を使用するアンサンブル学習テンプレートを指定します。

t = templateEnsemble('GentleBoost',50,'Tree');

t はテンプレート オブジェクトです。ほとんどのオプションは空です ([])。学習の間、すべての空のオプションに既定値が使用されます。

多くのクラスがあるので、スパース乱数符号化設計を指定します。

rng(1); % For reproducibility
Coding = designecoc(K,'sparserandom');

並列計算を使用する ECOC モデルを学習させます。事後確率の近似を指定をします。

pool = parpool;                      % Invokes workers
options = statset('UseParallel',1);
Mdl = fitcecoc(X,Y,'Learner',t,'Options',options,'Coding',Coding,...
    'FitPosterior',1);
Starting parallel pool (parpool) using the 'local' profile ... connected to 4 workers.

MdlClassificationECOC モデルです。ドット表記を使用してプロパティにアクセスできます。プールは 4 つのワーカーを起動します。ワーカーの数はシステム間で異なる場合があります。

事後確率を推定し、データを指定された不整脈 (クラス1) がないと分類された事後確率を表示します。

[~,~,~,posterior] = resubPredict(Mdl);
idx = randsample(n,10,1);
table(idx,Y(idx),posterior(idx,1),...
    'VariableNames',{'ObservationIndex','TrueLabel','PosteriorNoArrythmia'})
ans = 

    ObservationIndex    TrueLabel    PosteriorNoArrythmia
    ________________    _________    ____________________

     79                 1             0.91522            
    248                 1             0.95376            
    398                 10           0.032369            
    207                 1             0.97965            
    340                 1             0.93628            
    206                 1             0.97795            
    345                 10           0.015643            
    296                 2             0.14796            
    391                 1             0.96494            
    406                 1             0.94867            

詳細

すべて展開する

アルゴリズム

すべて展開する

  • カルバック・ライブラー ダイバージェンスを最小化するか、二次計画法を使用することにより、クラス事後確率を推定できます。以下の事後推定アルゴリズムに関する説明では、次のように仮定します。

    • mkj は符号化設計行列 M の要素 (k,j) です。

    • I はインジケーター関数です。

    • p^k は、ある観測値のクラス k (k = 1、...、K) に対するクラス事後確率の推定値です。

    • rj はバイナリ学習器 j の陽性クラス事後確率です。つまり、rj は、学習データが与えられる場合、バイナリ学習器 j が観測値を陽性クラスに分類する確率です。

参照

[1] Allwein, E., R. Schapire, and Y. Singer. “Reducing multiclass to binary: A unifying approach for margin classifiers.” Journal of Machine Learning Research. Vol. 1, 2000, pp. 113–141.

[2] Dietterich, T., and G. Bakiri. “Solving Multiclass Learning Problems Via Error-Correcting Output Codes.” Journal of Artificial Intelligence Research. Vol. 2, 1995, pp. 263–286.

[3] Escalera, S., O. Pujol, and P. Radeva. “On the decoding process in ternary error-correcting output codes.” IEEE Transactions on Pattern Analysis and Machine Intelligence. Vol. 32, Issue 7, 2010, pp. 120–134.

[4] Escalera, S., O. Pujol, and P. Radeva. “Separability of ternary codes for sparse designs of error-correcting output codes.” Pattern Recogn. Vol. 30, Issue 3, 2009, pp. 285–297.

[5] Hastie, T., and R. Tibshirani. “Classification by Pairwise Coupling.” Annals of Statistics. Vol. 26, Issue 2, 1998, pp. 451–471.

[6] Wu, T. F., C. J. Lin, and R. Weng. “Probability Estimates for Multi-Class Classification by Pairwise Coupling.” Journal of Machine Learning Research. Vol. 5, 2004, pp. 975–1005.

[7] Zadrozny, B. “Reducing Multiclass to Binary by Coupling Probability Estimates.” NIPS 2001: Proceedings of Advances in Neural Information Processing Systems 14, 2001, pp. 1041–1048.

拡張機能