Main Content

designecoc

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

説明

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

表示またはカスタマイズした M を符号化行列として指定し、fitcecoc を使用して ECOC マルチクラス分類器を学習させます。

M = designecoc(K,name,Name,Value) は、1 つ以上の Name,Value のペアの引数で指定された追加オプションを使用して符号化行列を返します。

たとえば、密またはスパースなランダム符号化行列を作成するときに、試行回数を指定することができます。

すべて折りたたむ

以下の 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
      ⋮

カスタム符号化設計 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 the 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 GROUP is not present in one or more folds. For classification problems, either remove this class from the data or use N instead of GROUP to obtain nonstratified partitions. For regression problems with continuous response, use N.
Warning: One or more of the unique class values in GROUP is not present in one or more folds. For classification problems, either remove this class from the data or use N instead of GROUP to obtain nonstratified partitions. For regression problems with continuous response, use N.
Warning: One or more of the unique class values in GROUP is not present in one or more folds. For classification problems, either remove this class from the data or use N instead of GROUP to obtain nonstratified partitions. For regression problems with continuous response, use N.
Warning: One or more of the unique class values in GROUP is not present in one or more folds. For classification problems, either remove this class from the data or use N instead of GROUP 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.2233
    0.2116
    0.2186
    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 つずつ含まれます。

名前と値の引数

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

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

例: 'NumTrials',10001000 個のランダム行列を生成するように指定します。

生成するランダム符号化行列の数。'NumTrials' と正の整数で構成されるコンマ区切りのペアとして指定します。

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

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

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

例: 'NumTrials',1000

データ型: single | double

出力引数

すべて折りたたむ

ECOC スキームをバイナリにする符号化行列。数値行列として返されます。MK 行 L 列で、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、0、または 1 である。

  • すべての列に –1 および 1 が少なくとも 1 つずつ含まれている。

  • すべての列ベクトル u と v のそれぞれについて、u ≠ v かつ u ≠ –v である。

  • すべての行ベクトルが一意である。

  • 行列は任意の 2 つのクラスを分離できます。つまり、任意の行から他の任意の行に次のルールに従って移動できる。

    • 1 から –1 または –1 から 1 に垂直方向に移動。

    • 非ゼロ要素から別の非ゼロ要素に水平方向に移動。

    • 垂直方向の移動に行列の列を一度だけ使用。

    上記のルールを使用して、行 i から行 j に移動できない場合、クラス i および j は計画により分離できません。たとえば、次の符号化設計ではクラス 1 および 2 をクラス 3 および 4 から分離できません。

    [10100101]

    2 行目の 2 列目に 0 があるので、2 行目の –1 を 2 列目に水平に移動できません。したがって、この符号化設計は拒否されます。

ランダム符号化設計行列

K 個のクラスに対して、ランダム符号化設計行列が以下のように生成されます。

  1. 次のいずれかの行列が生成されます。

    1. 密なランダム — K 行 Ld 列の符号化設計行列の各要素に同じ確率で 1 または –1 が割り当てられます。ここで Ld10log2K です。

    2. スパース ランダム — K 行 Ls 列の符号化設計行列の各要素に 0.25 の確率で 1、0.25 の確率で -1、0.5 の確率で 0 が割り当てられます。ここで Ls15log2K です。

  2. 1 および –1 が少なくとも 1 つずつ列に含まれていない場合、その列は削除されます。

  3. 異なる列 u および v について u = v または u = –v である場合、v が符号化設計行列から削除されます。

既定では 10,000 個の行列が無作為に生成されます。次によって与えられるハミング尺度 ([2]) に基づき、行の最小ペアワイズ距離が最大になる行列が保持されます。

Δ(k1,k2)=0.5l=1L|mk1l||mk2l||mk1lmk2l|,

ここで、mkjl は符号化設計行列 j の要素です。

参照

[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 で導入