メインコンテンツ

resubPredict

R2026b

マルチクラス誤り訂正出力符号 (ECOC) モデル内の観測値を分類

説明

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

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

例

label = resubPredict(Mdl,Name,Value) は、1 つ以上の名前と値のペアの引数で指定された追加オプションを使用して、予測クラス ラベルを返します。たとえば、事後確率推定法、復号化スキームまたは詳細レベルを指定します。

例

[label,NegLoss,PBScore] = resubPredict(___) は、前の構文におけるいずれかの入力引数の組み合わせを使用して、観測値のクラスごとの符号を反転した平均バイナリ損失 (NegLoss) と、各バイナリ学習器で分類した観測値の陽性クラスのスコア (PBScore) をさらに返します。

例

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

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

例

例

すべて折りたたむ

フィッシャーのアヤメのデータ セットを読み込みます。予測子データ X、応答データ Y、および Y 内のクラスの順序を指定します。

load fisheriris
X = meas;
Y = categorical(species);
classOrder = unique(Y);

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

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

t は SVM テンプレート オブジェクトです。学習時は、t の空のプロパティに対して既定値が使用されます。Mdl は ClassificationECOC モデルです。

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

labels = resubPredict(Mdl);

rng(1); % For reproducibility
n = numel(Y); % Sample size
idx = randsample(n,10);
table(Y(idx),labels(idx),'VariableNames',{'TrueLabels','PredictedLabels'})
ans = 10×2 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 をもつ観測値に正確なラベルを付けます。

フィッシャーのアヤメのデータ セットを読み込みます。予測子データ X、応答データ Y、および Y 内のクラスの順序を指定します。

load fisheriris
X = meas;
Y = categorical(species);
classOrder = unique(Y); % Class order

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

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

t は SVM テンプレート オブジェクトです。学習時は、t の空のプロパティに対して既定値が使用されます。Mdl は ClassificationECOC モデルです。

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

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

  • 線形損失を使用する。

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

バイナリ損失関数用に独立した関数を作成し、MATLAB® パスに保存できます。あるいは、無名バイナリ損失関数を指定できます。この場合、無名バイナリ損失関数に対する関数ハンドル (customBL) を作成します。

customBL = @(M,s)median(1 - (M.*s),2,'omitnan')/2;

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

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

rng(1); % For reproducibility
n = numel(Y); % Sample size
idx = randsample(n,10);
classOrder
classOrder = 3×1 categorical
     setosa 
     versicolor 
     virginica 

table(Y(idx),label(idx),NegLoss(idx,:),'VariableNames',...
    {'TrueLabel','PredictedLabel','NegLoss'})
ans = 10×3 table
    TrueLabel     PredictedLabel                NegLoss            
    __________    ______________    _______________________________

    setosa          versicolor       0.1236      1.9565     -3.5801
    versicolor      versicolor      -1.0169       0.629     -1.1121
    virginica       virginica       -1.9079    -0.21788     0.62583
    setosa          versicolor      0.43825      2.2437      -4.182
    versicolor      versicolor      -1.0732       0.396    -0.82276
    setosa          versicolor      0.26653      2.1999     -3.9664
    versicolor      versicolor      -1.1233      0.6988     -1.0755
    versicolor      versicolor      -1.2708     0.51782      -0.747
    setosa          versicolor      0.35168      2.0674     -3.9191
    setosa          versicolor       0.2334      2.1882     -3.9216

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

SVM バイナリ学習器を使用して ECOC 分類器に学習をさせます。はじめに、学習標本のラベルとクラス事後確率を予測します。次に、グリッド内の各点における最大のクラス事後確率を予測します。結果を可視化します。

フィッシャーのアヤメのデータ セットを読み込みます。予測子として花弁の寸法を、応答として種の名前を指定します。

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

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

t = templateSVM(Standardize=true,KernelFunction="gaussian");

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

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

Mdl = fitcecoc(X,Y,Learners=t,FitPosterior=true, ...
    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).

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

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

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

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

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

idx = randsample(size(X,1),10,1);
Mdl.ClassNames
ans = 3×1 cell
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

table(Y(idx),label(idx),Posterior(idx,:), ...
    VariableNames=["TrueLabel","PredLabel","Posterior"])
ans = 10×3 table
      TrueLabel         PredLabel                     Posterior               
    ______________    ______________    ______________________________________

    {'virginica' }    {'virginica' }     0.0039322      0.003987       0.99208
    {'virginica' }    {'virginica' }      0.017067      0.018263       0.96467
    {'virginica' }    {'virginica' }      0.014948      0.015856        0.9692
    {'versicolor'}    {'versicolor'}    2.2197e-14       0.87318       0.12682
    {'setosa'    }    {'setosa'    }         0.999    0.00025092    0.00074638
    {'versicolor'}    {'virginica' }    2.2195e-14       0.05943       0.94057
    {'versicolor'}    {'versicolor'}    2.2194e-14       0.97001      0.029985
    {'setosa'    }    {'setosa'    }         0.999    0.00024991     0.0007474
    {'versicolor'}    {'versicolor'}     0.0085642       0.98259     0.0088487
    {'setosa'    }    {'setosa'    }         0.999    0.00025013    0.00074717

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(:)]);

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

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

Figure contains an axes object. The axes object with title Iris Petal Measurements and Maximum Posterior, xlabel Petal length (cm), ylabel Petal width (cm) contains 4 objects of type contour, line. One or more of the lines displays its values using only markers These objects represent setosa, versicolor, virginica.

マルチクラス ECOC モデルに学習をさせ、並列計算を使用して事後確率を推定します。

arrhythmia データ セットを読み込みます。応答データ Y を確認して、クラス数を決定します。

load arrhythmia
Y = categorical(Y);
tabulate(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%
K = numel(unique(Y));

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

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

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

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

応答変数には多数のクラスが含まれているので、スパースなランダム符号化設計を指定します。

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

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

pool = parpool;                      % Invokes workers
Starting parallel pool (parpool) using the 'Processes' profile ...
31-Jul-2026 08:45:51: Job Running. Waiting for parallel pool workers to connect ...
31-Jul-2026 08:46:52: Job Running. Waiting for parallel pool workers to connect ...
31-Jul-2026 08:47:53: Job Running. Waiting for parallel pool workers to connect ...
Connected to parallel pool with 8 workers.
options = statset('UseParallel',"auto");
Mdl = fitcecoc(X,Y,'Learner',t,'Options',options,'Coding',Coding,...
    'FitPosterior',true);

Mdl は ClassificationECOC モデルです。ドット表記を使用してプロパティにアクセスできます。

このプールでは 8 つのワーカーが起動しましたが、ワーカー数はシステムによって異なる可能性があります。

事後確率を推定し、学習データのランダムなサブセットに対して、不整脈がない (クラス 1) と分類される事後確率を表示します。

[~,~,~,posterior] = resubPredict(Mdl);

n = numel(Y);
idx = randsample(n,10,1);
table(idx,Y(idx),posterior(idx,1),...
    'VariableNames',{'ObservationIndex','TrueLabel','PosteriorNoArrythmia'})
ans = 10×3 table
    ObservationIndex    TrueLabel    PosteriorNoArrythmia
    ________________    _________    ____________________

           79              1                0.93817      
          248              1                0.94356      
          398              10              0.040704      
          207              1                0.97791      
          340              1                 0.9215      
          206              1                0.97983      
          345              10              0.015942      
          296              2                0.13461      
          391              1                0.96233      
          406              1                0.95346      

	Get insights using Copilot

入力引数

すべて折りたたむ

学習済みの完全なマルチクラス ECOC モデル。fitcecoc によって学習をさせた ClassificationECOC モデルを指定します。

名前と値の引数

すべて折りたたむ

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、、Name を引用符で囲みます。

例: resubPredict(Mdl,'BinaryLoss','linear','Decoding','lossbased') は、バイナリ学習器の損失関数として線形関数を使用し、損失に基づく復号化方式をバイナリ損失の集計に使用するよう指定します。

バイナリ学習器損失関数。組み込みの損失関数の名前または関数ハンドルとして指定します。

  • 次の表で、組み込み関数について説明します。ここで、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 になるように正規化されます。また、各クラスについて平均のバイナリ損失が計算されます[1]。

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

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

    bLoss = customFunction(M,s)

    • M は Mdl.CodingMatrix に格納された K 行 B 列の符号化行列です。

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

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

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

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

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

次の表に BinaryLoss の既定値を示します。既定値は、バイナリ学習器が返すスコアの範囲によって異なります。

仮定既定値

すべてのバイナリ学習器が次のいずれかである。

  • 分類決定木

  • 判別分析モデル

  • k 最近傍モデル

  • ロジスティック回帰学習器の線形またはカーネル分類モデル

  • 単純ベイズ モデル

"quadratic"
すべてのバイナリ学習器が SVM であるか、SVM 学習器の線形またはカーネル分類モデルである。"hinge"
すべてのバイナリ学習器が、AdaboostM1 または GentleBoost によって学習をさせたアンサンブルである。"exponential"
すべてのバイナリ学習器が、LogitBoost によって学習をさせたアンサンブルである。"binodeviance"
fitcecoc で FitPosterior=true を設定して、クラスの事後確率を予測するように指定している。"quadratic"
バイナリ学習器が異種混合で、さまざまな損失関数を使用している。"hamming"

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

例: BinaryLoss="binodeviance"

データ型: char | string | function_handle

バイナリ損失を集計する復号化方式。"lossweighted" または "lossbased" として指定します。詳細は、バイナリ損失を参照してください。

例: Decoding="lossbased"

データ型: char | string

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

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

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

例: 'NumKLInitializations',5

データ型: single | double

推定オプション。statset によって返される構造体配列として指定します。

並列計算を起動するには、Parallel Computing Toolbox™ ライセンスが必要です。

例: Options=statset(UseParallel="auto")

データ型: struct

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

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

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

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

例: 'PosteriorMethod','qp'

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

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

例: Verbose=1

データ型: single | double

出力引数

すべて折りたたむ

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

label のデータ型は Mdl.ClassNames と、行数は Mdl.X と同じです。

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

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

NegLoss(i,k) は、観測値 i を k 番目のクラスに分類する平均バイナリ損失の符号を反転した値です。

  • Decoding が 'lossbased' の場合、NegLoss(i,k) はバイナリ損失の合計をバイナリ学習器の総数で割った値の符号を反転した値になります。

  • Decoding が 'lossweighted' の場合、NegLoss(i,k) はバイナリ損失の合計を k 番目のクラスに対するバイナリ学習器の数で割った値の符号を反転した値になります。

詳細については、バイナリ損失を参照してください。

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

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

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

詳細

すべて折りたたむ

アルゴリズム

すべて折りたたむ

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

  • 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. “Separability of ternary codes for sparse designs of error-correcting output codes.” Pattern Recog. Lett. Vol. 30, Issue 3, 2009, pp. 285–297.

[4] 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.

[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.

拡張機能

すべて展開する

バージョン履歴

R2014b で導入

すべて展開する

参考

| | | | (Optimization Toolbox) |