ドキュメンテーション

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

kfoldEdge

交差検証済み ECOC モデルの分類エッジ

説明

edge = kfoldEdge(CVMdl) は、交差検証された ECOC モデル (ClassificationPartitionedECOC) CVMdl が取得した分類エッジを返します。kfoldEdge は、すべての分割について、学習分割観測値に対して学習をさせた ECOC モデルを使用して、検証分割観測値の分類エッジを計算します。CVMdl.X には、両方の観測値のセットが含まれます。

edge = kfoldEdge(CVMdl,Name,Value) は、1 つ以上の名前と値のペアの引数で指定された追加オプションを使用して、分類エッジを返します。たとえば、分割の数、復号化スキームまたは詳細レベルを指定します。

すべて折りたたむ

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

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

サポート ベクター マシン (SVM) バイナリ分類器を使用して、ECOC モデルの学習と交差検証を行います。SVM テンプレートを使用して予測子データを標準化し、クラスの順序を指定します。

t = templateSVM('Standardize',1);
CVMdl = fitcecoc(X,Y,'CrossVal','on','Learners',t,'ClassNames',classOrder);

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

エッジの平均を推定します。

edge = kfoldEdge(CVMdl)
edge = 0.4825

あるいは、kfoldEdge 内の名前と値のペアの引数 'Mode','individual' を指定することで各分割エッジを取得できます。

分類エッジは分類器の品質の相対尺度です。十分には機能しない分割を判別するため、各分割のエッジを表示します。

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

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

SVM バイナリ分類器を使用して ECOC モデルを学習させます。8 分割の交差検証を使用し、SVM テンプレートを使用して予測子を標準化し、クラスの順序を指定します。

t = templateSVM('Standardize',1);
CVMdl = fitcecoc(X,Y,'KFold',8,'Learners',t,'ClassNames',classOrder);

各分割の分類エッジを推定します。

edges = kfoldEdge(CVMdl,'Mode','individual')
edges = 8×1

    0.4790
    0.4872
    0.4260
    0.5301
    0.5064
    0.4575
    0.4860
    0.4687

エッジの振幅は分割間で類似しています。十分には機能しない分割は、他の分割よりエッジが小さくなります。

十分に機能する分割の平均分類エッジを取得するため、名前と値のペアの引数 'Folds' を指定します。

分類器エッジは、分類器マージンの平均を測定します。特徴選択を行う方法のひとつとして、複数のモデルからの交差検証エッジを比較します。この条件のみに基づくと、エッジが最高である分類器が最善の分類器となります。

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

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

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

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

  • partX には花弁の寸法が含まれます。

fullX = X;
partX = X(:,3:4);

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

t = templateSVM('Standardize',1);
CVMdl = fitcecoc(fullX,Y,'CrossVal','on','Learners',t,...
    'ClassNames',classOrder);
PCVMdl = fitcecoc(partX,Y,'CrossVal','on','Learners',t,...
    'ClassNames',classOrder);

CVMdl および PCVMdlClassificationPartitionedECOC モデルです。既定では、10 分割交差検証が実行されます。

各分類器についてエッジを推定します。

fullEdge = kfoldEdge(CVMdl)
fullEdge = 0.4825
partEdge = kfoldEdge(PCVMdl)
partEdge = 0.4951

2 つのモデルでエッジが同程度になっています。

入力引数

すべて折りたたむ

交差検証 ECOC モデル。ClassificationPartitionedECOC モデルとして指定します。ClassificationPartitionedECOC モデルは 2 つの方法で作成できます。

  • 学習済みの ECOC モデル (ClassificationECOC) を crossval に渡します。

  • fitcecoc を使用して ECOC モデルに学習をさせ、交差検証の名前と値のペアの引数 'CrossVal''CVPartition''Holdout''KFold''Leaveout' のいずれかを指定します。

名前と値のペアの引数

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

例: kfoldEdge(CVMdl,'BinaryLoss','hinge') は、バイナリ学習器の損失関数として 'hinge' を指定します。

バイナリ学習器の損失関数。'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'

予測の分割インデックス。'Folds' および正の整数の数値ベクトルで構成されるコンマ区切りのペアとして指定します。Folds の要素は 1 から CVMdl.KFold の範囲でなければなりません。

予測用の Folds で指定された分割のみが使用されます。

例: 'Folds',[1 4 10]

データ型: single | double

出力の集約レベル。'Mode''average' または 'individual' から構成されるコンマ区切りのペアとして指定します。

次の表は値を説明します。

説明
'average'出力は、すべての分割の平均を表すスカラー値です。
'individual'出力は、分割ごとに 1 つずつの値が含まれている長さ k のベクトルです。k は分割数です。

例: 'Mode','individual'

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

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

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

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

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

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

例: 'Verbose',1

データ型: single | double

出力引数

すべて折りたたむ

分類エッジ。数値スカラーまたは数値列ベクトルとして返されます。

Mode'average' である場合、edge はすべての分割の平均分類エッジです。それ以外の場合、edge は各分割の分類エッジが含まれている k 行 1 列の数値列ベクトルです。k は分割数です。

詳細

すべて折りたたむ

分類エッジ

"分類エッジ""分類マージン" の加重平均です。

特徴選択を実行する場合などに複数の分類器から選択する方法の 1 つは、エッジが最大になる分類器を選択することです。

分類マージン

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

バイナリ損失

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

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

  • 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' により指定) とバイナリ損失を混同しないでください。

参照

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