Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

kfoldLoss

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

説明

L = kfoldLoss(CVMdl) は、交差検証済みのバイナリ線形分類モデル CVMdl によって取得した交差検証分類損失を返します。つまり、他のすべての観測値を使用して学習を行うときにホールドアウトする観測値の分類損失を、kfoldLoss はすべての分割について推定します。

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

L = kfoldLoss(CVMdl,Name,Value) は、1 つ以上の Name,Value 引数のペアによって指定された追加オプションを使用します。たとえば、損失の計算に使用する分割や分類損失関数を指定します。

入力引数

すべて展開する

交差検証済みバイナリ線形分類モデル。ClassificationPartitionedLinear モデル オブジェクトとして指定します。ClassificationPartitionedLinear モデル オブジェクトを作成するには、fitclinear を使用し、交差検証用の名前と値のペアの引数のいずれか 1 つ (CrossVal など) を指定します。

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

名前と値の引数

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

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

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

例: 'Folds',[1 4 10]

データ型: single | double

損失関数。'LossFun' と組み込み損失関数名または関数ハンドルから構成されるコンマ区切りのペアとして指定します。

  • 次の表は、使用可能な損失関数の一覧です。対応する文字ベクトルまたは string スカラーを使用して、いずれかを指定します。

    説明
    "binodeviance"二項分布からの逸脱度
    "classifcost"観測誤分類コスト
    "classiferror"10 進数の誤分類率
    "exponential"指数損失
    "hinge"ヒンジ損失
    "logit"ロジスティック損失
    "mincost"最小予測誤分類コスト (事後確率である分類スコアの場合)
    "quadratic"二次損失

    'mincost' は、事後確率である分類スコアに適しています。線形分類モデルの場合、既定の設定ではロジスティック回帰学習器は事後確率を分類スコアとして返しますが、SVM 学習器はそうではありません (predict を参照)。

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

    nX 内の観測値数、K を異なるクラスの数 (numel(Mdl.ClassNames)Mdl は入力モデル) とします。使用する関数のシグネチャは次のようになっていなければなりません。

    lossvalue = lossfun(C,S,W,Cost)
    ここで、

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

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

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

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

    • S は、分類スコアの nK 列の行列です。列の順序は Mdl.ClassNames のクラスの順序に対応します。S は分類スコアの行列で、predict の出力と同様です。

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

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

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

データ型: char | string | function_handle

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

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

例: 'Mode','individual'

出力引数

すべて展開する

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

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

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

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

kfoldLossL を推定するため、CVMdl を作成したデータを使用します (XY を参照)。

すべて展開する

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

load nlpdata

X は予測子データのスパース行列、Y はクラス ラベルの categorical ベクトルです。データには 2 つを超えるクラスがあります。

モデルでは、ある Web ページの単語数が Statistics and Machine Learning Toolbox™ ドキュメンテーションによるものであるかどうかを識別できなければなりません。したがって、Statistics and Machine Learning Toolbox™ のドキュメンテーション Web ページに対応するラベルを識別します。

Ystats = Y == 'stats';

あるドキュメンテーション Web ページの単語数が Statistics and Machine Learning Toolbox™ ドキュメンテーションによるものであるかどうかを識別できるバイナリ線形分類モデルの交差検証を行います。

rng(1); % For reproducibility 
CVMdl = fitclinear(X,Ystats,'CrossVal','on');

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

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

ce = kfoldLoss(CVMdl)
ce = 7.6017e-04

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

NLP のデータセットを読み込みます。k 分割交差検証の分類誤差の推定で説明されているようにデータを前処理し、予測子データを転置します。

load nlpdata
Ystats = Y == 'stats';
X = X';

5 分割の交差検証を使用してバイナリ線形分類モデルを交差検証します。SpaRSA を使用して目的関数を最適化します。予測子の観測値が列に対応することを指定します。

rng(1) % For reproducibility 
CVMdl = fitclinear(X,Ystats,'Solver','sparsa','KFold',5, ...
    'ObservationsIn','columns');
CMdl = CVMdl.Trained{1};

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

次の線形損失を評価する無名関数を作成します。

L=j-wjyjfjjwj.

wj は観測値 j の重み、yj は応答 j (陰性クラスの場合は -1、それ以外の場合は 1)、fj は観測値 j の生の分類スコアです。カスタム損失関数は特定の形式で記述しなければなりません。カスタム損失関数の記述に関するルールについては、名前と値のペアの引数 LossFun を参照してください。この関数では分類コストを使用しないので、~ を使用して kfoldLoss に分類コストの位置を無視させます。

linearloss = @(C,S,W,~)sum(-W.*sum(S.*C,2))/sum(W);

線形損失関数を使用して平均の交差検証分類損失を推定します。また、各分割の損失を取得します。

ce = kfoldLoss(CVMdl,'LossFun',linearloss)
ce = -8.0982
ceFold = kfoldLoss(CVMdl,'LossFun',linearloss,'Mode','individual')
ceFold = 5×1

   -8.3165
   -8.7633
   -7.4342
   -8.0423
   -7.9347

ロジスティック回帰学習器を使用する線形分類モデルに適した LASSO ペナルティの強度を決定するため、テスト標本の分類誤差率を比較します。

NLP のデータセットを読み込みます。カスタムな分類損失の指定で説明されているようにデータを前処理します。

load nlpdata
Ystats = Y == 'stats';
X = X';

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

Lambda = logspace(-6,-0.5,11);

5 分割の交差検証を使用してバイナリ線形分類モデルを交差検証します。各正則化強度を使用します。SpaRSA を使用して目的関数を最適化します。目的関数の勾配の許容誤差を 1e-8 に下げます。

rng(10); % For reproducibility
CVMdl = fitclinear(X,Ystats,'ObservationsIn','columns',...
    'KFold',5,'Learner','logistic','Solver','sparsa',...
    'Regularization','lasso','Lambda',Lambda,'GradientTolerance',1e-8)
CVMdl = 
  ClassificationPartitionedLinear
    CrossValidatedModel: 'Linear'
           ResponseName: 'Y'
        NumObservations: 31572
                  KFold: 5
              Partition: [1x1 cvpartition]
             ClassNames: [0 1]
         ScoreTransform: 'none'


学習済みの線形分類モデルを抽出します。

Mdl1 = CVMdl.Trained{1}
Mdl1 = 
  ClassificationLinear
      ResponseName: 'Y'
        ClassNames: [0 1]
    ScoreTransform: 'logit'
              Beta: [34023x11 double]
              Bias: [-13.2936 -13.2936 -13.2936 -13.2936 -13.2936 -6.8954 -5.4359 -4.7170 -3.4108 -3.1566 -2.9792]
            Lambda: [1.0000e-06 3.5481e-06 1.2589e-05 4.4668e-05 1.5849e-04 5.6234e-04 0.0020 0.0071 0.0251 0.0891 0.3162]
           Learner: 'logistic'


Mdl1ClassificationLinear モデル オブジェクトです。Lambda は正則化強度のシーケンスなので、Mdl はそれぞれが Lambda の各正則化強度に対応する 11 個のモデルであると考えることができます。

交差検証分類誤差を推定します。

ce = kfoldLoss(CVMdl);

11 個の正則化強度があるので、ce は 1 行 11 列の分類誤差率のベクトルです。

Lambda の値が大きくなると、予測子変数がスパースになります。これは分類器の品質として優れています。データセット全体を使用し、モデルの交差検証を行ったときと同じオプションを指定して、各正則化強度について線形分類モデルに学習をさせます。モデルごとに非ゼロの係数を特定します。

Mdl = fitclinear(X,Ystats,'ObservationsIn','columns',...
    'Learner','logistic','Solver','sparsa','Regularization','lasso',...
    'Lambda',Lambda,'GradientTolerance',1e-8);
numNZCoeff = sum(Mdl.Beta~=0);

同じ図に、各正則化強度についての交差検証分類誤差率と非ゼロ係数の頻度をプロットします。すべての変数を対数スケールでプロットします。

figure;
[h,hL1,hL2] = plotyy(log10(Lambda),log10(ce),...
    log10(Lambda),log10(numNZCoeff)); 
hL1.Marker = 'o';
hL2.Marker = 'o';
ylabel(h(1),'log_{10} classification error')
ylabel(h(2),'log_{10} nonzero-coefficient frequency')
xlabel('log_{10} Lambda')
title('Test-Sample Statistics')
hold off

Figure contains 2 axes objects. Axes object 1 with title Test-Sample Statistics, xlabel log_{10} Lambda, ylabel log_{10} classification error contains an object of type line. Axes object 2 with ylabel log_{10} nonzero-coefficient frequency contains an object of type line.

予測子変数のスパース性と分類誤差の低さのバランスがとれている正則化強度のインデックスを選択します。この場合、10-410-1 の値で十分なはずです。

idxFinal = 7;

選択した正則化強度のモデルを Mdl から選択します。

MdlFinal = selectModels(Mdl,idxFinal);

MdlFinal は、1 つの正則化強度が含まれている ClassificationLinear モデルです。新しい観測値のラベルを推定するには、MdlFinal と新しいデータを predict に渡します。

詳細

すべて展開する

バージョン履歴

R2016a で導入

すべて展開する