Main Content

kfoldMargin

交差検証済みカーネル ECOC モデルの分類マージン

説明

margin = kfoldMargin(CVMdl) は、交差検証済みのカーネル ECOC モデル (ClassificationPartitionedKernelECOC) CVMdl によって取得した分類マージンを返します。kfoldMargin は、すべての分割について、学習分割観測値に対して学習をさせたモデルを使用して、検証分割観測値の分類マージンを計算します。

margin = kfoldMargin(CVMdl,Name,Value) は、1 つ以上の名前と値のペアの引数で指定された追加オプションを使用して、分類マージンを返します。たとえば、バイナリ学習器の損失関数、復号化スキームまたは詳細レベルを指定します

すべて折りたたむ

フィッシャーのアヤメのデータ セットを読み込みます。X には花の測定値が、Y には花の種類の名前が格納されています。

load fisheriris
X = meas;
Y = species;

カーネル バイナリ学習器から構成される ECOC モデルを交差検証します。

CVMdl = fitcecoc(X,Y,'Learners','kernel','CrossVal','on')
CVMdl = 
  ClassificationPartitionedKernelECOC
    CrossValidatedModel: 'KernelECOC'
           ResponseName: 'Y'
        NumObservations: 150
                  KFold: 10
              Partition: [1x1 cvpartition]
             ClassNames: {'setosa'  'versicolor'  'virginica'}
         ScoreTransform: 'none'


CVMdlClassificationPartitionedKernelECOC モデルです。既定では、10 分割交差検証が実行されます。異なる分割数を指定するには、'Crossval' ではなく名前と値のペアの引数 'KFold' を指定します。

検証分割観測値の分類マージンを推定します。

m = kfoldMargin(CVMdl);
size(m)
ans = 1×2

   150     1

m は 150 行 1 列のベクトルです。m(j) は観測値 j の分類マージンです。

箱ひげ図を使用して k 分割マージンをプロットします。

boxplot(m,'Labels','All Observations')
title('Distribution of Margins')

Figure contains an axes object. The axes object with title Distribution of Margins contains 7 objects of type line. One or more of the lines displays its values using only markers

複数のモデルの k 分割マージンを比較することにより、特徴選択を実行します。この条件のみに基づくと、マージンが最大である分類器が最善の分類器となります。

フィッシャーのアヤメのデータ セットを読み込みます。X には花の測定値が、Y には花の種類の名前が格納されています。

load fisheriris
X = meas;
Y = species;

予測子変数の半分を無作為に選択します。

rng(1); % For reproducibility
p = size(X,2); % Number of predictors
idxPart = randsample(p,ceil(0.5*p));

カーネル分類モデルから構成されている 2 つの ECOC モデルを交差検証します。1 つではすべての予測子を、もう 1 つでは半分の予測子を使用します。

CVMdl = fitcecoc(X,Y,'Learners','kernel','CrossVal','on');
PCVMdl = fitcecoc(X(:,idxPart),Y,'Learners','kernel','CrossVal','on');

CVMdl および PCVMdlClassificationPartitionedKernelECOC モデルです。既定では、10 分割交差検証が実行されます。異なる分割数を指定するには、'Crossval' ではなく名前と値のペアの引数 'KFold' を指定します。

各分類器の k 分割マージンを推定します。

fullMargins = kfoldMargin(CVMdl);
partMargins = kfoldMargin(PCVMdl);

箱ひげ図を使用して、マージン セットの分布をプロットします。

boxplot([fullMargins partMargins], ...
    'Labels',{'All Predictors','Half of the Predictors'});
title('Distribution of Margins')

Figure contains an axes object. The axes object with title Distribution of Margins contains 14 objects of type line. One or more of the lines displays its values using only markers

PCVMdl のマージン分布は CVMdl のマージン分布に似ています。

入力引数

すべて折りたたむ

交差検証済みのカーネル ECOC モデル。ClassificationPartitionedKernelECOC モデルを指定します。ClassificationPartitionedKernelECOC モデルは、fitcecoc を使用し、以下の名前と値のペアの引数を指定して、ECOC モデルに学習をさせることにより作成できます。

  • 'Learners' – 値を 'kernel'templateKernel が返すテンプレート オブジェクト、またはこのようなテンプレート オブジェクトの cell 配列に設定します。

  • 引数 'CrossVal''CVPartition''Holdout''KFold''Leaveout' のいずれか。

名前と値の引数

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

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

例: kfoldMargin(CVMdl,'Verbose',1) は、診断メッセージをコマンド ウィンドウに表示するよう指定します。

バイナリ学習器の損失関数。'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 になるように正規化されます。また、各クラスについて平均のバイナリ損失が計算されます[1]

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

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

    bLoss = customFunction(M,s)

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

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

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

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

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

既定では、すべてのバイナリ学習器が SVM を使用するカーネル分類モデルである場合、BinaryLoss'hinge' です。すべてのバイナリ学習器がロジスティック回帰を使用するカーネル分類モデルである場合、BinaryLoss'quadratic' です。

例: 'BinaryLoss','binodeviance'

データ型: char | string | function_handle

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

例: 'Decoding','lossbased'

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

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

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

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

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

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

例: 'Verbose',1

データ型: single | double

出力引数

すべて折りたたむ

分類マージン。数値ベクトルとして返されます。margin は n 行 1 列のベクトルであり、各行は対応する観測のマージンです。n は観測値の個数 (size(CVMdl.Y,1)) です。

詳細

すべて折りたたむ

分類マージン

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

バイナリ損失

"バイナリ損失" は、バイナリ学習器がどの程度の精度で観測値をクラスに分類するかを決定する、クラスと分類スコアの関数です。ソフトウェアでバイナリ損失をどのように集計して各観測値の予測クラスを判定するかは、ECOC モデルの "復号化方式" で指定します。

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

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

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

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

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

ソフトウェアでは 2 つの復号化方式をサポートしています。

  • "損失に基づく復号化" [2] (Decoding'lossbased') — 観測値の予測クラスは、すべてのバイナリ学習器におけるバイナリ損失の平均が最小になるクラスに対応します。

    k^=argmink1Bj=1B|mkj|g(mkj,sj).

  • "損失に重みを付けた復号化" [3] (Decoding'lossweighted') — 観測値の予測クラスは、対応するクラスのバイナリ学習器におけるバイナリ損失の平均が最小になるクラスに対応します。

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

    分母はクラス k のバイナリ学習器の数に対応します。[1]によると、すべてのクラスの損失値が同じダイナミック レンジに収まるので、損失に重みを付けた復号化では分類精度が向上します。

関数 predictresubPredict、および kfoldPredict は、それぞれの観測値とクラスについて、argmin の目的関数の符号反転値を 2 番目の出力引数 (NegLoss) として返します。

次の表は、サポートされる損失関数をまとめたものです。ここで、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]

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

参照

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

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

拡張機能

バージョン履歴

R2018b で導入

すべて展開する