Main Content

kfoldMargin

学習で使用しない観測値の分類マージン

説明

m = kfoldMargin(CVMdl) は、線形分類モデルから構成される交差検証済みの誤り訂正出力符号 (ECOC) モデル CVMdl によって取得した交差検証分類マージンを返します。つまり、他のすべての観測値を使用して学習を行うときにホールドアウトする観測値の分類マージンを、kfoldMargin はすべての分割について推定します。

m には、CVMdl から構成される線形分類モデルの各正則化強度に対する分類マージンが格納されます。

m = kfoldMargin(CVMdl,Name,Value) は、1 つ以上の Name,Value 引数のペアによって指定された追加オプションを使用します。たとえば、復号化方式や詳細レベルを指定します。

入力引数

すべて展開する

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

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

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

推定値を取得するため、kfoldMargin は 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'

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

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

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

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

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

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

例: 'Verbose',1

データ型: single | double

出力引数

すべて展開する

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

m は n 行 L 列です。n は X 内の観測値数、L は Mdl 内の正則化強度の数 (numel(Mdl.Lambda)) です。

m(i,j) は、正則化強度が Mdl.Lambda(j) である、線形分類モデルから構成されている ECOC モデルを使用した、観測値 i の交差検証分類マージンです。

すべて展開する

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

load nlpdata

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

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

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

マルチクラス線形分類モデルを交差検証します。

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

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

k 分割マージンを推定します。

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

       31572           1

m は 31572 行 1 列のベクトルです。m(j) は観測値 j の分割外マージンの平均です。

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

figure;
boxplot(m);
h = gca;
h.YLim = [-5 5];
title('Distribution of Cross-Validated Margins')

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

特徴選択を実行する方法の 1 つは、複数のモデルの k 分割マージンを比較することです。この基準のみに基づくと、マージンが大きい方が分類器として優れています。

NLP のデータ セットを読み込みます。k 分割交差検証マージンの推定で説明されているようにデータを前処理し、観測値が列に対応するように予測子データを配置します。

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

2 つのデータ セットを作成します。

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

  • partX には、無作為に選択した予測子の 1/2 が含まれます。

rng(1); % For reproducibility
p = size(X,1); % Number of predictors
halfPredIdx = randsample(p,ceil(0.5*p));
fullX = X;
partX = X(halfPredIdx,:);

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

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

バイナリ線形分類モデルから構成されている 2 つの ECOC モデルを交差検証します。1 つではすべての予測子を、もう 1 つでは半分の予測子を使用します。観測値が列に対応することを指定します。

CVMdl = fitcecoc(fullX,Y,'Learners',t,'CrossVal','on',...
    'ObservationsIn','columns');
PCVMdl = fitcecoc(partX,Y,'Learners',t,'CrossVal','on',...
    'ObservationsIn','columns');

CVMdl および PCVMdlClassificationPartitionedLinearECOC モデルです。

各分類器の k 分割マージンを推定します。箱ひげ図を使用して k 分割マージン セットの分布をプロットします。

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

figure;
boxplot([fullMargins partMargins],'Labels',...
    {'All Predictors','Half of the Predictors'});
h = gca;
h.YLim = [-1 1];
title('Distribution of Cross-Validated Margins')

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

2 つの分類器で k 分割マージンの分布は似ています。

ロジスティック回帰学習器を使用する線形分類モデルに適した LASSO ペナルティの強度を決定するため、k 分割マージンの分布を比較します。

NLP のデータ セットを読み込みます。k 分割マージンを使用した特徴選択で説明されているようにデータを前処理します。

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

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

Lambda = logspace(-8,1,11);

線形分類モデル テンプレートを作成します。このテンプレートでは、LASSO ペナルティがあるロジスティック回帰を使用し、各正則化強度を使用し、SpaRSA を使用して目的関数を最適化し、目的関数の勾配の許容誤差を 1e-8 に下げるように指定します。

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

5 分割の交差検証を使用して、バイナリ線形分類モデルから構成されている ECOC モデルを交差検証します。

rng(10); % For reproducibility
CVMdl = fitcecoc(X,Y,'Learners',t,'ObservationsIn','columns','KFold',5)
CVMdl = 
  ClassificationPartitionedLinearECOC
    CrossValidatedModel: 'LinearECOC'
           ResponseName: 'Y'
        NumObservations: 31572
                  KFold: 5
              Partition: [1x1 cvpartition]
             ClassNames: [comm    dsp    simulink    others]
         ScoreTransform: 'none'


CVMdlClassificationPartitionedLinearECOC モデルです。

各正則化強度の k 分割マージンを推定します。ロジスティック回帰のスコアは [0,1] の範囲にあります。二次バイナリ損失を適用します。

m = kfoldMargin(CVMdl,'BinaryLoss','quadratic');
size(m)
ans = 1×2

       31572          11

m は各観測値の交差検証マージンから構成される 31572 行 11 列の行列です。列は正則化強度に対応します。

各正則化強度について k 分割マージンをプロットします。

figure;
boxplot(m)
ylabel('Cross-validated margins')
xlabel('Lambda indices')

Figure contains an axes object. The axes object with xlabel Lambda indices, ylabel Cross-validated margins contains 77 objects of type line. One or more of the lines displays its values using only markers

いくつかの Lambda の値では、同じようにマージン分布の中心が高くなっており、広がりが少なくなっています。Lambda の値が大きくなると、予測子変数がスパースになります。これは分類器の品質として優れています。

マージン分布の中心が低下し広がりが大きくなる直前にある正則化強度を選択します。

LambdaFinal = Lambda(5);

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

t = templateLinear('Learner','logistic','Solver','sparsa',...
    'Regularization','lasso','Lambda',Lambda(5),'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 で導入

すべて展開する