Main Content

kfoldLoss

学習で使用しない観測値の分類損失

説明

L = kfoldLoss(CVMdl) は、線形分類モデルから構成される交差検証済みの誤り訂正出力符号 (ECOC) モデル CVMdl によって推定された交差検証分類誤差率を返します。つまり、他のすべての観測値を使用して学習を行うときにホールドアウトする観測値の分類誤差率を、kfoldLoss はすべての分割について推定します。kfoldLoss は、CVMdl を作成するために使用したものと同じデータを適用します (fitcecoc を参照)。

L には、CVMdl を構成する線形分類モデルの各正則化強度に対する分類損失が格納されます。

L = kfoldLoss(CVMdl,Name,Value) は、1 つ以上の Name,Value 引数のペアによって指定された追加オプションを使用します。たとえば、復号化方式、損失の計算に使用する分割、詳細レベルなどを指定します。

入力引数

すべて展開する

線形分類モデルから構成される交差検証済みの ECOC モデル。ClassificationPartitionedLinearECOC モデル オブジェクトとして指定します。ClassificationPartitionedLinearECOC モデルを作成するには、fitcecoc を使用し、以下を行います。

  1. 交差検証用の名前と値のペアの引数のいずれか 1 つ (CrossVal など) を指定

  2. 名前と値のペアの引数 Learners を、'linear' に、または templateLinear によって返される線形分類モデル テンプレートに設定

推定値を取得するため、kfoldLoss は ECOC モデルの交差検証に使用したものと同じデータ (X および Y) を適用します。

名前と値の引数

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

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

バイナリ学習器の損失関数。'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 行 B 列の符号化行列です。

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

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

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

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

    カスタムなバイナリ損失関数を渡す例については、カスタム バイナリ損失関数の使用による ECOC モデルのテスト標本ラベルの予測を参照してください。

既定の設定では、すべてのバイナリ学習器が以下を使用する線形分類モデルである場合、次のようになります。

  • SVM の場合、BinaryLoss'hinge' になります。

  • ロジスティック回帰の場合、BinaryLoss'quadratic' になります。

例: 'BinaryLoss','binodeviance'

データ型: char | string | function_handle

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

例: 'Decoding','lossbased'

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

例: 'Folds',[1 4 10]

データ型: single | double

損失関数。'classiferror''classifcost'、または関数ハンドルとして指定します。

次が可能です。

  • 組み込み関数 'classiferror' を指定します。この場合、損失関数は分類誤差になります。

  • 組み込み関数 'classifcost' を指定します。この場合、損失関数は観測誤分類コストです。既定のコスト行列 (正しい分類の場合の要素値は 0、誤った分類の場合の要素値は 1) を使用する場合、'classifcost''classiferror' の損失の値は同じです。

  • 関数ハンドル表記を使用して独自の関数を指定します。

    以下では、n は学習データの観測値数 (CVMdl.NumObservations)、K はクラス数 (numel(CVMdl.ClassNames)) です。使用する関数では lossvalue = lossfun(C,S,W,Cost) というシグネチャが必要です。ここで

    • 出力引数 lossvalue はスカラーです。

    • 関数名 (lossfun) を選択します。

    • CnK 列の logical 行列で、行は対応する観測値が属するクラスを示しています。列の順序は CVMdl.ClassNames のクラスの順序に対応します。

      C を作成するには、各行について観測値 p がクラス q に含まれている場合に C(p,q) = 1 を設定します。p 行のすべての要素を 0 に設定します。

    • S は、符号を反転したクラスの損失値からなる nK 列の数値行列です。各列は観測と対応しています。列の順序は CVMdl.ClassNames のクラスの順序に対応します。SkfoldPredict の出力引数 NegLoss に類似します。

    • W は、観測値の重みの n 行 1 列の数値ベクトルです。W を渡す場合、その要素は正規化され、合計が 1 になります。

    • Cost は、誤分類コストの、KK 列の数値行列です。たとえば、Cost = ones(K) -eye(K) は正確な分類を 0 のコストで指定し、誤判定を 1 で指定します。

    'LossFun',@lossfun を使用して独自の関数を指定します。

データ型: function_handle | char | string

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

説明
'average'分割全体で平均した損失を返す
'individual'各分割について損失を返す

例: 'Mode','individual'

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

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

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

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

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

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

例: 'Verbose',1

データ型: single | double

出力引数

すべて展開する

交差検証分類損失。数値スカラー、ベクトルまたは行列として返されます。L の解釈は LossFun によって異なります。

交差検証済みモデルの正則化強度の数 (CVMdl.Trained{1}.BinaryLearners{1}.Lambda) を R、分割数 (CVMdl.KFold に格納) を F とします。

  • Mode'average' の場合、L は 1 行 R 列のベクトルになります。L(j) は、正則化強度 j を使用する交差検証済みモデルのすべての分割に対する平均分類損失です。

  • それ以外の場合、LFR 列の行列になります。L(i,j) は、正則化強度 j を使用する交差検証済みモデルの分割 i に対する分類損失です。

すべて展開する

NLP のデータ セットを読み込みます。

load nlpdata

X は予測子データのスパース行列、Y はクラス ラベルの categorical ベクトルです。

線形分類モデルから構成されている ECOC モデルを交差検証します。

rng(1); % For reproducibility 
CVMdl = fitcecoc(X,Y,'Learner','linear','CrossVal','on');

CVMdlClassificationPartitionedLinearECOC モデルです。既定では、10 分割交差検証が実行されます。

分割外分類誤差率の平均を推定します。

ce = kfoldLoss(CVMdl)
ce = 0.0958

または、名前と値のペアの引数 'Mode','individual'kfoldLoss で指定することにより、分割ごとの分類誤差率を取得できます。

NLP のデータ セットを読み込みます。予測子データを転置します。

load nlpdata
X = X';

簡単にするため、'simulink''dsp''comm' のいずれでもない Y の観測値すべてに対して 'others' というラベルを使用します。

Y(~(ismember(Y,{'simulink','dsp','comm'}))) = 'others';

SpaRSA を使用して目的関数を最適化するように指定する線形分類モデル テンプレートを作成します。

t = templateLinear('Solver','sparsa');

5 分割の交差検証を使用して、線形分類モデルから構成されている ECOC モデルを交差検証します。SpaRSA を使用して目的関数を最適化します。予測子の観測値が列に対応することを指定します。

rng(1); % For reproducibility 
CVMdl = fitcecoc(X,Y,'Learners',t,'KFold',5,'ObservationsIn','columns');
CMdl1 = CVMdl.Trained{1}
CMdl1 = 
  CompactClassificationECOC
      ResponseName: 'Y'
        ClassNames: [comm    dsp    simulink    others]
    ScoreTransform: 'none'
    BinaryLearners: {6x1 cell}
      CodingMatrix: [4x6 double]


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

各観測値の最小損失を取る関数を作成し、すべての観測値の最小損失を平均化します。この関数ではクラス識別行列 (C)、観測値の重み (W)、および分類コスト (Cost) を使用しないので、~ を使用して kfoldLoss にそれらの位置を無視させます。

lossfun = @(~,S,~,~)mean(min(-S,[],2));

観測値ごとの最小損失を求める関数を使用して、平均の交差検証分類損失を推定します。また、各分割の損失を取得します。

ce = kfoldLoss(CVMdl,'LossFun',lossfun)
ce = 0.0485
ceFold = kfoldLoss(CVMdl,'LossFun',lossfun,'Mode','individual')
ceFold = 5×1

    0.0488
    0.0511
    0.0496
    0.0479
    0.0452

ロジスティック回帰学習器を使用する線形分類モデルから構成される ECOC モデルに適した LASSO ペナルティの強度を決定するため、5 分割の交差検証を実装します。

NLP のデータ セットを読み込みます。

load nlpdata

X は予測子データのスパース行列、Y はクラス ラベルの categorical ベクトルです。

簡単にするため、'simulink''dsp''comm' のいずれでもない Y の観測値すべてに対して 'others' というラベルを使用します。

Y(~(ismember(Y,{'simulink','dsp','comm'}))) = 'others';

10-710-2 の範囲で対数間隔で配置された 11 個の正則化強度を作成します。

Lambda = logspace(-7,-2,11);

ロジスティック回帰学習器を使用するように指定する線形分類モデル テンプレートを作成し、Lambda の強度をもつ LASSO ペナルティを使用し、SpaRSA を使用して学習させ、目的関数の勾配の許容誤差を 1e-8 に下げます。

t = templateLinear('Learner','logistic','Solver','sparsa',...
    'Regularization','lasso','Lambda',Lambda,'GradientTolerance',1e-8);

モデルを交差検証します。実行速度を向上させるため、予測子データを転置し、観測値が列単位であることを指定します。

X = X'; 
rng(10); % For reproducibility
CVMdl = fitcecoc(X,Y,'Learners',t,'ObservationsIn','columns','KFold',5);

CVMdlClassificationPartitionedLinearECOC モデルです。

CVMdl および格納されている各モデルを分析します。

numECOCModels = numel(CVMdl.Trained)
numECOCModels = 5
ECOCMdl1 = CVMdl.Trained{1}
ECOCMdl1 = 
  CompactClassificationECOC
      ResponseName: 'Y'
        ClassNames: [comm    dsp    simulink    others]
    ScoreTransform: 'none'
    BinaryLearners: {6×1 cell}
      CodingMatrix: [4×6 double]


  Properties, Methods

numCLModels = numel(ECOCMdl1.BinaryLearners)
numCLModels = 6
CLMdl1 = ECOCMdl1.BinaryLearners{1}
CLMdl1 = 
  ClassificationLinear
      ResponseName: 'Y'
        ClassNames: [-1 1]
    ScoreTransform: 'logit'
              Beta: [34023×11 double]
              Bias: [-0.3169 -0.3169 -0.3168 -0.3168 -0.3168 -0.3167 -0.1725 -0.0805 -0.1762 -0.3450 -0.5174]
            Lambda: [1.0000e-07 3.1623e-07 1.0000e-06 3.1623e-06 1.0000e-05 3.1623e-05 1.0000e-04 3.1623e-04 1.0000e-03 0.0032 0.0100]
           Learner: 'logistic'


  Properties, Methods

fitcecoc は 5 分割の交差検証を実装するので、各分割について学習させる CompactClassificationECOC モデルから構成される 5 行 1 列の cell 配列が CVMdl に格納されます。各 CompactClassificationECOC モデルの BinaryLearners プロパティには ClassificationLinear モデルが格納されます。各コンパクト ECOC モデル内の ClassificationLinear モデルの数は、それぞれのラベルの数と符号化設計によって決まります。Lambda は正則化強度のシーケンスなので、CLMdl1 はそれぞれが Lambda の各正則化強度に対応する 11 個のモデルであると考えることができます。

各正則化強度について 5 分割分類誤差の平均をプロットすることにより、モデルがどの程度一般化を行うかを判断します。グリッド全体で汎化誤差を最小化する正則化強度を特定します。

ce = kfoldLoss(CVMdl);
figure;
plot(log10(Lambda),log10(ce))
[~,minCEIdx] = min(ce);
minLambda = Lambda(minCEIdx);
hold on
plot(log10(minLambda),log10(ce(minCEIdx)),'ro');
ylabel('log_{10} 5-fold classification error')
xlabel('log_{10} Lambda')
legend('MSE','Min classification error')
hold off

データ セット全体を使用して線形分類モデルから構成される ECOC モデルに学習をさせ、最小の正則化強度を指定します。

t = templateLinear('Learner','logistic','Solver','sparsa',...
    'Regularization','lasso','Lambda',minLambda,'GradientTolerance',1e-8);
MdlFinal = fitcecoc(X,Y,'Learners',t,'ObservationsIn','columns');

新しい観測値のラベルを推定するには、MdlFinal と新しいデータを predict に渡します。

詳細

すべて展開する

参照

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

拡張機能

バージョン履歴

R2016a で導入

すべて展開する