メインコンテンツ

designecoc

誤り訂正出力符号をバイナリに変換する符号化行列

説明

M = designecoc(K,name)nameK クラスで指定された ECOC (誤り訂正出力符号) 計画をバイナリ問題に変換する符号化行列 M を返します。MKL 列で各行はクラスに対応し、各列はバイナリ学習器に対応します。nameKL の値を決定します。

M を表示およびカスタマイズしてから符号化行列として指定し、fitcecoc を使用して ECOC マルチクラス分類器を学習させることができます。

M = designecoc(K,name,NumTrials=numTrials) は、numTrials 個のランダム符号化行列を生成します。

すべて折りたたむ

以下の arrhythmia データ セットを考えます。研究内には 16 のクラスがあり、そのうち 13 がデータ内に表示されます。最初のクラスは被験者に不整脈がなかったことを示し、最後のクラスは被験者の不整脈の状態が記録されなかったことを示します。その他のクラスは不整脈の重症度を示す順序レベルであると仮定します。ECOC 分類器をクラスの説明で指定されるカスタム符号化設計を使用して学習させます。

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

load arrhythmia
K = 13; % Number of distinct classes

クラスの性質を説明する符号化行列を作成します。

OrdMat = designecoc(11,"ordinal");
nOM = size(OrdMat);
class1VSOrd = [1; -ones(11,1); 0];
class1VSClass16 = [1; zeros(11,1); -1];
OrdVSClass16 = [0; ones(11,1); -1];
Coding = [class1VSOrd class1VSClass16 OrdVSClass16, ...
    [zeros(1,nOM(2)); OrdMat; zeros(1,nOM(2))]]
Coding = 13×13

     1     1     0     0     0     0     0     0     0     0     0     0     0
    -1     0     1    -1    -1    -1    -1    -1    -1    -1    -1    -1    -1
    -1     0     1     1    -1    -1    -1    -1    -1    -1    -1    -1    -1
    -1     0     1     1     1    -1    -1    -1    -1    -1    -1    -1    -1
    -1     0     1     1     1     1    -1    -1    -1    -1    -1    -1    -1
    -1     0     1     1     1     1     1    -1    -1    -1    -1    -1    -1
    -1     0     1     1     1     1     1     1    -1    -1    -1    -1    -1
    -1     0     1     1     1     1     1     1     1    -1    -1    -1    -1
    -1     0     1     1     1     1     1     1     1     1    -1    -1    -1
    -1     0     1     1     1     1     1     1     1     1     1    -1    -1
    -1     0     1     1     1     1     1     1     1     1     1     1    -1
    -1     0     1     1     1     1     1     1     1     1     1     1     1
     0    -1    -1     0     0     0     0     0     0     0     0     0     0
      ⋮

カスタム符号化設計 Coding を使用して ECOC 分類器を学習させます。バイナリ学習器が決定木であることを指定します。

Mdl = fitcecoc(X,Y,Coding=Coding,Learner="tree");

標本内分類誤差を推定します。

genErr = resubLoss(Mdl)
genErr = 
0.1460

sparserandom または denserandom を指定して無作為な符号化行列を要求する場合、既定では designecoc は 10,000 個のランダム行列を生成します。その後、ハミング尺度に基づいてペア間の行の最小距離が最大の行列を選択します。生成する行列の数を増加するように指定して、より優れた結果を得る可能性を高めることができます。または、複数の符号化行列を生成し、最適なパフォーマンスの行列を確認することもできます。

arrhythmia データ セットを読み込みます。16 番目のクラスに分類された観測値 (すなわち、不整脈分類を含まないクラス) を新規データとして予約します。

load arrhythmia
oosIdx = Y == 16;
isIdx = ~oosIdx;
Y = categorical(Y(isIdx));
tabulate(Y)
  Value    Count   Percent
      1      245     56.98%
      2       44     10.23%
      3       15      3.49%
      4       15      3.49%
      5       13      3.02%
      6       25      5.81%
      7        3      0.70%
      8        2      0.47%
      9        9      2.09%
     10       50     11.63%
     14        4      0.93%
     15        5      1.16%
K = numel(unique(Y));

最初の 2 つが密で、次の 2 つがスパースとなる 4 つの無作為な符号化設計行列を生成します。20,000 個の変量から最適なものを指定します。

rng(1); % For reproducibility 

Coding = cell(4,1); % Preallocate for coding matrices
CodingTypes = ["denserandom","denserandom","sparserandom","sparserandom"];
for j = 1:4
    Coding{j} = designecoc(K,CodingTypes{j},NumTrials=2e4);
end

Coding は 4 行 1 列の cell 配列で、各セルは符号化設計行列です。行列には K 行ありますが、列数 (バイナリ学習器) は変化する場合があります。

15 分割交差検証を使用して、ECOC 分類器を学習させ交差検証を実行します。各 ECOC 分類器が分類木を使用して学習し、ランダム符号化行列が Coding に保存されるように指定します。

Mdl = cell(4,1); % Preallocate for ECOC classifiers
for j = 1:4
    Mdl{j} = fitcecoc(X(isIdx,:),Y,Learners="tree", ...
        Coding=Coding{j},KFold=15);
end
Warning: One or more of the unique class values in the stratification variable is not present in one or more folds. For classification problems, either remove this class from the data or use N instead of the stratification variable to obtain nonstratified partitions. For regression problems with continuous response, use N.
Warning: One or more of the unique class values in the stratification variable is not present in one or more folds. For classification problems, either remove this class from the data or use N instead of the stratification variable to obtain nonstratified partitions. For regression problems with continuous response, use N.
Warning: One or more of the unique class values in the stratification variable is not present in one or more folds. For classification problems, either remove this class from the data or use N instead of the stratification variable to obtain nonstratified partitions. For regression problems with continuous response, use N.
Warning: One or more of the unique class values in the stratification variable is not present in one or more folds. For classification problems, either remove this class from the data or use N instead of the stratification variable to obtain nonstratified partitions. For regression problems with continuous response, use N.

MdlClassificationPartitionedECOC モデルの 4 行 1 列の cell 配列です。いくつかのクラスはデータ内の相対的頻度が低いため、標本内分割の一部は交差検証中にこれらのクラスによる学習を行なわない可能性があります。

各分類器の 15 分割分類誤差を推定します。

genErr = nan(4,1);
for j = 1:4
    genErr(j) = kfoldLoss(Mdl{j});
end

genErr
genErr = 4×1

    0.2256
    0.2116
    0.2116
    0.2209

汎化誤差が依然として高くなっていても、標本外分類誤差のみに基づく場合は、最適なパフォーマンスのモデルは符号化設計 Coding{3} を使用したモデルになります。

バイナリ学習器の一部のパラメーターを調整して汎化誤差の改善を試みることができます。たとえば、分割基準として既定のジニ多様性指数ではなく、twoing 規則または逸脱度の使用を指定できます。データ内に欠損値があるため、代理分岐の使用を指定する場合もあります。

入力引数

すべて折りたたむ

クラス数。正の整数として指定します。

K は符号化行列 M の行数を指定します。

データ型: single | double

符号化設計名。次の表の値を指定します。次の表は、符号化方式をまとめています。

バイナリ学習器の数説明
"allpairs" および "onevsone"K(K – 1)/2各バイナリ学習器では、1 つのクラスが陽性であり、もう 1 つのクラスは陰性です。残りは無視されます。この計画はすべてのクラス ペアの割り当ての組み合わせを使用します。
"binarycomplete"2(K1)1この計画はクラスをすべて 2 つの組み合わせに分割します。いずれのクラスも無視されません。各バイナリ学習器では、すべてのクラス割り当てが –1 および 1 になり、割り当てに陽性クラスと陰性クラスが少なくとも 1 つずつ含まれます。
"denserandom"ランダム。ただし、約 10 log2K各バイナリ学習器には、陽性または陰性クラス (少なくとも各 1 つ) が無作為に割り当てられます。詳細については、ランダム符号化設計行列を参照してください。
"onevsall"K各バイナリ学習器では、1 つのクラスは陽性で残りは陰性です。この計画は陽性クラス割り当てのすべての組み合わせを使用します。
"ordinal"K – 11 番目のバイナリ学習器では、1 番目のクラスが陰性であり、残りは陽性です。2 番目のバイナリ学習器では、最初の 2 つのクラスが陰性であり、残りは陽性です。他についても同様です。
"sparserandom"ランダム。ただし、約 15 log2K各バイナリ学習器では、各クラスに確率 0.25 で陽性または陰性が無作為に割り当てられ、確率が 0.5 の場合にクラスが無視されます。詳細については、ランダム符号化設計行列を参照してください。
"ternarycomplete"(3K2(K+1)+1)/2この計画はクラスをすべて 3 つの組み合わせに分割します。すべてのクラス割り当てが 0–1、および 1 になり、各割り当てに陽性クラスと陰性クラスが少なくとも 1 つずつ含まれます。

生成するランダム符号化行列の数。正の整数として指定します。

次の処理が実行されます。

  • numTrials 行列を生成し、最大のペア単位の行距離をもつ行列を 1 つ選択します。

  • "denserandom" および "sparserandom" を除く name のすべての値で numTrials を無視します。

例: 1000

データ型: single | double

出力引数

すべて折りたたむ

ECOC スキームをバイナリにする符号化行列。数値行列として返されます。MKL 列で、L はバイナリ学習器の数です。各行はクラスに対応し、各列はバイナリ学習器に対応します。

M の要素は -10 または 1 であり、値は二分法によるクラス割り当てに対応します。この表は M(i,j) の意味を説明します。つまり、学習器 j がクラス i の観測値に割り当てるクラスです。

二分法によるクラス割り当て
–1学習器 j は、クラス i の観測値を陰性クラスに割り当てます。
0学習の前に、学習器 j はクラス i の観測値をデータ セットから削除します。
1学習器 j は、クラス i の観測値を陽性クラスに割り当てます。

計画 denserandom のバイナリ学習器、binarycomplete および onevsall0 をどのクラスの観察にも割り当てしません。

ヒント

  • バイナリ学習器の数はクラス数とともに増加します。多数のクラスがある問題では、符号化設計 binarycomplete および ternarycomplete は効率的ではありません。ただし、

    • K ≤ 4 の場合、sparserandom ではなく ternarycomplete 符号化設計を使用します。

    • K ≤ 5 の場合、denserandom ではなく binarycomplete 符号化設計を使用します。

    コマンド ウィンドウに Mdl.CodingMatrix を入力して学習させた ECOC 分類器の符号化設計行列を表示できます。

  • アプリケーションへの詳細な知識を用い、計算上の制約を考慮して符号化行列を作成しなければなりません。十分な計算能力と時間がある場合、いくつかの符号化行列を試し、最大のパフォーマンスが得られるものを選択してください (たとえば、confusionchart を使用して各モデルの混同行列を確認します)。

  • 観測値が多いデータ セットの場合、Leave-one-out 交差検証 (Leaveout) では不十分です。代わりに、k 分割交差検証 (KFold) を使用してください。

アルゴリズム

すべて折りたたむ

参照

[1] Fürnkranz, Johannes. “Round Robin Classification.” J. Mach. Learn. Res., Vol. 2, 2002, pp. 721–747.

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

バージョン履歴

R2014b で導入