ドキュメンテーション

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

margin

マルチクラス誤り訂正出力符号 (ECOC) モデルの分類マージン

説明

m = margin(Mdl,tbl,ResponseVarName) は、table tbl 内の予測子データと tbl.ResponseVarName 内のクラス ラベルを使用して、学習済みのマルチクラス誤り訂正出力符号 (ECOC) モデル Mdl分類マージン (m) を返します。

m = margin(Mdl,tbl,Y) は、table tbl 内の予測子データとベクトル Y 内のクラス ラベルを使用して、分類器 Mdl の分類マージンを返します。

m = margin(Mdl,X,Y) は、行列 X 内の予測子データとクラス ラベル Y を使用して、分類器 Mdl の分類マージンを返します。

m = margin(___,Name,Value) では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値のペアの引数を使用してオプションを指定します。たとえば、復号化方式、バイナリ学習器の損失関数、詳細レベルを指定できます。

すべて折りたたむ

SVM バイナリ学習器による ECOC モデルの検定標本の分類マージンを計算します。

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

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

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

t = templateSVM('Standardize',true);
PMdl = fitcecoc(X,Y,'Holdout',0.30,'Learners',t,'ClassNames',classOrder);
Mdl = PMdl.Trained{1};    % Extract trained, compact classifier

PMdlClassificationPartitionedECOC モデルです。これには Trained プロパティが含まれています。これは、学習セットを使用して学習をさせた CompactClassificationECOC モデルが格納されている、1 行 1 列の cell 配列です。

検定標本の分類マージンを計算します。箱ひげ図を使用してマージンの分布を表示します。

testInds = test(PMdl.Partition);   % Extract the test indices
XTest = X(testInds,:);
YTest = Y(testInds,:);
m = margin(Mdl,XTest,YTest);

boxplot(m)
title('Test-Sample Margins')

観測値の分類マージンは、符号を反転した陽性クラスの損失から符号を反転した陰性クラスの最大損失を減算した値です。マージンが比較的大きくなる分類器を選択します。

複数のモデルによる検定標本マージンを比較することにより、特徴選択を実行します。この比較のみに基づくと、マージンが最大である分類器が最良の分類器です。

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

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

データセットを学習セットとテスト セットに分割します。テスト用の 30% のホールドアウト標本を指定します。

Partition = cvpartition(Y,'Holdout',0.30);
testInds = test(Partition); % Indices for the test set
XTest = X(testInds,:);
YTest = Y(testInds,:);

Partition によりデータセットの分割が定義されます。

次の 2 つのデータセットを定義します。

  • fullX には 4 つすべての予測子が含まれます。

  • partX にはがく片の測定値のみが含まれます。

fullX = X;
partX = X(:,1:2);

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

t = templateSVM('Standardize',true);
fullPMdl = fitcecoc(fullX,Y,'CVPartition',Partition,'Learners',t,...
    'ClassNames',classOrder);
partPMdl = fitcecoc(partX,Y,'CVPartition',Partition,'Learners',t,...
    'ClassNames',classOrder);
fullMdl = fullPMdl.Trained{1};
partMdl = partPMdl.Trained{1};

fullPMdl および partPMdlClassificationPartitionedECOC モデルです。各モデルには Trained プロパティが含まれています。これは、対応する学習セットを使用して学習をさせた CompactClassificationECOC モデルが格納されている、1 行 1 列の cell 配列です。

各分類器の検定標本マージンを計算します。モデルごとに箱ひげ図を使用してマージンの分布を表示します。

fullMargins = margin(fullMdl,XTest,YTest);
partMargins = margin(partMdl,XTest(:,1:2),YTest);

boxplot([fullMargins partMargins],'Labels',{'All Predictors','Two Predictors'})
title('Boxplots of Test-Sample Margins')

fullMdl のマージンの分布は、partMdl のマージンの分布よりも高い位置にあり、変動性がより少なくなっています。

入力引数

すべて折りたたむ

完全またはコンパクトなマルチクラス ECOC モデル。ClassificationECOC または CompactClassificationECOC モデル オブジェクトを指定します。

完全またはコンパクトな ECOC モデルを作成する方法については、ClassificationECOC または CompactClassificationECOC を参照してください。

標本データ。テーブルとして指定します。tbl の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。必要に応じて、応答変数用および観測値の重み用の追加列を tbl に含めることができます。tbl には、Mdl を学習させるために使用したすべての予測子が含まれていなければなりません。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。

table に格納されている標本データを使用して Mdl に学習をさせた場合、margin の入力データも table でなければなりません。

メモ

Mdl.BinaryLearners に線形分類モデルまたはカーネル分類モデル (ClassificationLinear モデル オブジェクトまたは ClassificationKernel モデル オブジェクト) が格納されている場合、table 内の標本データを指定することはできません。代わりに、行列 (X) とクラス ラベル (Y) を渡します。

Mdl に学習をさせるときに、fitcecoc の名前と値のペアの引数 'Learners' で指定したテンプレート オブジェクトについて 'Standardize',true を設定したとします。この場合、対応するバイナリ学習器 j について、対応する Mdl.BinaryLearner{j}.Mu 内の平均および Mdl.BinaryLearner{j}.Sigma 内の標準偏差を使用して、新しい予測子データの列が標準化されます。

データ型: テーブル

応答変数の名前。tbl 内の変数の名前で指定します。Mdl を学習させるために使用した応答変数が tbl に含まれている場合、ResponseVarName を指定する必要はありません。

ResponseVarName を指定する場合は、文字ベクトルまたは string スカラーとして指定しなければなりません。たとえば、応答変数が tbl.y として格納されている場合、ResponseVarName として 'y' を指定します。それ以外の場合、tbl の列は tbl.y を含めてすべて予測子として扱われます。

応答変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列でなければなりません。応答変数が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。

データ型: char | string

予測子データ。数値行列として指定します。

X の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。X の列内の変数は、分類器 Mdl に学習させた変数と同じでなければなりません。

X の行数は Y の行数と等しくなければなりません。

Mdl に学習をさせるときに、fitcecoc の名前と値のペアの引数 'Learners' で指定したテンプレート オブジェクトについて 'Standardize',true を設定したとします。この場合、対応するバイナリ学習器 j について、対応する Mdl.BinaryLearner{j}.Mu 内の平均および Mdl.BinaryLearner{j}.Sigma 内の標準偏差を使用して、新しい予測子データの列が標準化されます。

データ型: double | single

クラス ラベル。categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列を指定します。Y のデータ型は Mdl.ClassNames と同じでなければなりません。(string 配列は文字ベクトルの cell 配列として扱われます)。

Y の行数は tbl または X の行数と等しくなければなりません。

データ型: カテゴリカル | char | string | logical | single | double | cell

名前と値のペアの引数

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

例: margin(Mdl,tbl,'y','BinaryLoss','exponential') は、バイナリ学習器に対する指数の損失関数を指定します。

バイナリ学習器の損失関数。'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 モデルの検定標本ラベルの予測を参照してください。

BinaryLoss の既定値は、バイナリ学習器が返すスコアの範囲によって異なります。次の表で、特定の仮定に基づく BinaryLoss の既定値について説明します。

仮定既定値
すべてのバイナリ学習器が SVM であるか、SVM 学習器の線形またはカーネル分類モデルである。'hinge'
すべてのバイナリ学習器が、AdaboostM1 または GentleBoost によって学習をさせたアンサンブルである。'exponential'
すべてのバイナリ学習器が、LogitBoost によって学習をさせたアンサンブルである。'binodeviance'
すべてのバイナリ学習器が、ロジスティック回帰学習器の線形またはカーネル分類モデルである。または、fitcecoc'FitPosterior',true を設定して、クラスの事後確率を予測するよう指定した。'quadratic'

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

例: 'BinaryLoss','binodeviance'

データ型: char | string | function_handle

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

例: 'Decoding','lossbased'

予測子データにおける観測値の次元。'ObservationsIn''columns' または 'rows' から構成されるコンマ区切りのペアとして指定します。Mdl.BinaryLearners には ClassificationLinear モデルが格納されていなければなりません。

メモ

観測値が列に対応するように予測子行列を配置して 'ObservationsIn','columns' を指定すると、実行時間が大幅に短縮される可能性があります。

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

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

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

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

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

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

例: 'Verbose',1

データ型: single | double

出力引数

すべて折りたたむ

分類マージン。数値列ベクトルまたは数値行列として返されます。

Mdl.BinaryLearnersClassificationLinear モデルが含まれている場合、m は n 行 L 列のベクトルになります。n は X 内の観測値の個数、L は線形分類モデル内の正則化強度の個数 (numel(Mdl.BinaryLearners{1}.Lambda)) です。値 m(i,j) は、正則化強度 Mdl.BinaryLearners{1}.Lambda(j) を使用して学習をさせたモデルの観測値 i のマージンです。

それ以外の場合、m は長さが n の列ベクトルになります。

詳細

すべて折りたたむ

バイナリ損失

"バイナリ損失" は、バイナリ学習器がどの程度の精度で観測値をクラスに分類するかを判断する、クラスと分類スコアの関数です。

以下のように仮定します。

  • mkj は符号化設計行列 M の要素 (k,j)、つまりバイナリ学習器 j のクラス k に対応するコード。

  • sj は観測値に対するバイナリ学習器 j のスコア。

  • g はバイナリ損失関数。

  • k^ は観測値の予測クラス。

"損失に基づく復号化" [Escalera 他] では、バイナリ学習器全体のバイナリ損失の和が最小になるクラスにより、観測値の予測クラスが決まります。つまり、次のようになります。

k^=argminkj=1L|mkj|g(mkj,sj).

"損失に重みを付けた復号化" [Escalera 他] では、バイナリ学習器全体のバイナリ損失の平均が最小になるクラスにより、観測値の予測クラスが決まります。つまり、次のようになります。

k^=argminkj=1L|mkj|g(mkj,sj)j=1L|mkj|.

Allwein 他によると、すべてのクラスで損失値が同じ動的範囲に収まるので、損失に重みを付けた復号化では分類精度が向上します。

次の表は、サポートされる損失関数をまとめています。ここで、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 になるように正規化され、バイナリ学習器の平均を使用して集計されます [Allwein 他]

ECOC 分類器の全体的な性能の尺度である全体の分類損失 (オブジェクト関数 loss および predict の名前と値のペアの引数 'LossFun' により指定) とバイナリ損失を混同しないでください。

分類マージン

"分類マージン" は、各観測値における真のクラスの負の損失と偽のクラスの負の最大損失の差です。各マージンのスケールが同じである場合、マージンを分類の信頼尺度として使用できます。複数の分類器の中で、マージンが大きい分類器の方が優れています。

ヒント

  • 複数の ECOC 分類器のマージンまたはエッジを比較するには、テンプレート オブジェクトを使用して分類器間で共通するスコア変換関数を学習時に指定します。

参照

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

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

拡張機能

R2014b で導入