ドキュメンテーション

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

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 folds do not contain points from all the groups.
Warning: One or more folds do not contain points from all the groups.
Warning: One or more folds do not contain points from all the groups.
Warning: One or more folds do not contain points from all the groups.

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

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

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

genErr
genErr = 4×1

    0.2302
    0.2209
    0.2279
    0.2233

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

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

入力引数

すべて折りたたむ

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

K はコーディング行列 M の行数を指定します。

データ型: single | double

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

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

名前と値のペアの引数

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

例: '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 を 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 つ以上の –1 が列に含まれていない場合、その列は削除されます。

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

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

Δ(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 で導入