Main Content

kfoldLoss

交差検証済み分類モデルの分類損失

    説明

    L = kfoldLoss(CVMdl) は、交差検証済みの分類モデル CVMdl で取得した分類損失を返します。kfoldLoss は、すべての分割について、学習分割観測値で学習させた分類器を使用して検証分割観測値の分類損失を計算します。CVMdl.X および CVMdl.Y には、両方の観測値のセットが含まれます。

    L = kfoldLoss(CVMdl,Name,Value) は、1 つ以上の名前と値の引数で指定された追加オプションを使用して分類損失を返します。たとえば、カスタムの損失関数を指定できます。

    すべて折りたたむ

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

    load ionosphere

    分類木を成長させます。

    tree = fitctree(X,Y);

    10 分割交差検証を使用して分類木を交差検証します。

    cvtree = crossval(tree);

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

    L = kfoldLoss(cvtree)
    L = 0.1083
    

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

    load ionosphere

    AdaBoostM1 を使用して、100 本の決定木によるアンサンブル分類に学習をさせます。弱学習器として木の切り株を指定します。

    t = templateTree('MaxNumSplits',1);
    ens = fitcensemble(X,Y,'Method','AdaBoostM1','Learners',t);

    10 分割交差検証を使用してアンサンブルを交差検証します。

    cvens = crossval(ens);

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

    L = kfoldLoss(cvens)
    L = 0.0655
    

    交差検証済みの 10 分割の一般化加法モデル (GAM) に学習させます。その後、kfoldLoss を使用して交差検証の累積分類誤差 (10 進数の誤分類率) を計算します。誤差を使用して、予測子 (予測子の線形項) あたりの最適な木の数と交互作用項あたりの最適な木の数を特定します。

    代わりに、名前と値の引数OptimizeHyperparametersを使用して fitcgam の名前と値の引数の最適な値を特定することもできます。例については、OptimizeHyperparameters を使用した GAM の最適化を参照してください。

    ionosphere データ セットを読み込みます。このデータ セットには、レーダー反射についての 34 個の予測子と、不良 ('b') または良好 ('g') という 351 個の二項反応が含まれています。

    load ionosphere

    既定の交差検証オプションを使用して交差検証済み GAM を作成します。名前と値の引数 'CrossVal''on' として指定します。p 値が 0.05 以下である利用可能な交互作用項をすべて含めるように指定します。

    rng('default') % For reproducibility
    CVMdl = fitcgam(X,Y,'CrossVal','on','Interactions','all','MaxPValue',0.05);

    'Mode''cumulative' として指定すると、関数 kfoldLoss は累積誤差を返します。これは、各分割に同じ数の木を使用して取得したすべての分割の平均誤差です。各分割の木の数を表示します。

    CVMdl.NumTrainedPerFold 
    ans = struct with fields:
          PredictorTrees: [65 64 59 61 60 66 65 62 64 61]
        InteractionTrees: [1 2 2 2 2 1 2 2 2 2]
    
    

    kfoldLoss では、最大で 59 個の予測子木と 1 個の交互作用木を使用して累積誤差を計算できます。

    10 分割交差検証を行った累積分類誤差 (10 進数の誤分類率) をプロットします。'IncludeInteractions'false として指定して、計算から交互作用項を除外します。

    L_noInteractions = kfoldLoss(CVMdl,'Mode','cumulative','IncludeInteractions',false);
    figure
    plot(0:min(CVMdl.NumTrainedPerFold.PredictorTrees),L_noInteractions)

    Figure contains an axes object. The axes object contains an object of type line.

    L_noInteractions の最初の要素は、切片 (定数) 項のみを使用して取得したすべての分割の平均誤差です。L_noInteractions の (J+1) 番目の要素は、切片項と各線形項の最初の J 個の予測子木を使用して取得した平均誤差です。累積損失をプロットすると、GAM の予測子木の数が増えるにつれて誤差がどのように変化するかを観察できます。

    最小誤差とその最小誤差の達成時に使用された予測子木の数を調べます。

    [M,I] = min(L_noInteractions)
    M = 0.0655
    
    I = 23
    

    GAM に 22 個の予測子木が含まれるときに誤差が最小になっています。

    線形項と交互作用項の両方を使用して累積分類誤差を計算します。

    L = kfoldLoss(CVMdl,'Mode','cumulative')
    L = 2×1
    
        0.0712
        0.0712
    
    

    L の最初の要素は、切片 (定数) 項と各線形項のすべての予測子木を使用して取得したすべての分割の平均誤差です。L の 2 番目の要素は、切片項、各線形項のすべての予測子木、および各交互作用項の 1 つの交互作用木を使用して取得した平均誤差です。交互作用項を追加しても誤差は小さくなっていません。

    予測子木の数が 22 個のときの誤差で問題がなければ、一変量の GAM にもう一度学習させ、交差検証を使用せずに 'NumTreesPerPredictor',22 と指定して予測モデルを作成できます。

    入力引数

    すべて折りたたむ

    交差検証された分割済みの分類器。ClassificationPartitionedModel オブジェクト、ClassificationPartitionedEnsemble オブジェクトまたは ClassificationPartitionedGAM オブジェクトを指定します。オブジェクトは 2 つの方法で作成できます。

    • 次の表に記載されている学習済み分類モデルをそのオブジェクト関数 crossval に渡す。

    • 次の表に記載されている関数を使用して分類モデルに学習をさせ、その関数の交差検証に関する名前と値の引数のいずれかを指定する。

    名前と値の引数

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

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

    例: kfoldLoss(CVMdl,'Folds',[1 2 3 5]) は、分類損失の計算に 1 番目、2 番目、3 番目、および 5 番目の分割を使用し、4 番目の分割は除外するように指定します。

    使用する分割のインデックス。正の整数ベクトルとして指定します。Folds の要素は 1 から CVMdl.KFold の範囲でなければなりません。

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

    例: 'Folds',[1 4 10]

    データ型: single | double

    モデルの交互作用項を含むというフラグ。true または false として指定します。この引数は、一般化加法モデル (GAM) の場合のみ有効です。つまり、この引数を指定できるのは、CVMdlClassificationPartitionedGAM である場合だけです。

    CVMdl のモデル (CVMdl.Trained) に交互作用項が含まれる場合、既定値は true です。モデルに交互作用項が含まれない場合、値は false でなければなりません。

    データ型: logical

    損失関数。組み込みの損失関数名または関数ハンドルを指定します。既定の損失関数は、モデル CVMdl のタイプによって異なります。

    • モデル タイプがアンサンブルまたはサポート ベクター マシン分類器の場合、既定値は 'classiferror' です。

    • モデル タイプが判別分析、k 最近傍、単純ベイズ、ニューラル ネットワーク、または木分類器の場合、既定値は 'mincost' です。

    • モデル タイプが一般化加法モデル分類器の場合、入力モデル オブジェクト (CVMdl.ScoreTransform) の ScoreTransform プロパティが 'logit' であれば既定値は 'mincost'、それ以外であれば既定値は 'classiferror' です。

    'classiferror''mincost' は、既定のコスト行列を使用する場合は同じです。詳細については、アルゴリズムを参照してください。

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

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

      'mincost' は、事後確率である分類スコアに適しています。判別分析、一般化加法モデル、k 最近傍、単純ベイズ、ニューラル ネットワーク、および木分類器の関数 predictkfoldPredict は、そのようなスコアを既定で返します。

      • 'Bag' または 'Subspace' のメソッドを使用するアンサンブル モデルの場合、分類スコアは既定で事後確率になります。'AdaBoostM1''AdaBoostM2'GentleBoost、または 'LogitBoost' のメソッドを使用するアンサンブル モデルの場合は、ダブルロジットのスコア変換を指定することで事後確率を分類スコアとして使用できます。たとえば、次のように入力します。

        CVMdl.ScoreTransform = 'doublelogit';
        他のすべてのアンサンブル法の場合、事後確率は分類スコアとしてサポートされていません。

      • SVM モデルの場合、fitcsvm を使用してモデルを交差検証するときに 'FitPosterior',true を設定することで、事後確率を分類スコアとして使用するように指定できます。

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

      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 のクラスの順序に対応します。入力 S は、kfoldPredict の出力引数 score に似ています。

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

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

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

    損失関数の詳細については、分類損失を参照してください。

    例: 'LossFun','hinge'

    データ型: char | string | function_handle

    出力の集約レベル。'average''individual'、または 'cumulative' として指定します。

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

    メモ

    この値を指定する場合、CVMdlClassificationPartitionedEnsemble オブジェクトまたは ClassificationPartitionedGAM オブジェクトでなければなりません。

    • CVMdlClassificationPartitionedEnsemble の場合、出力は長さ min(CVMdl.NumTrainedPerFold) のベクトルです。各要素 j は、弱学習器 1:j で学習させたアンサンブルを使用して取得したすべての分割の平均です。

    • CVMdlClassificationPartitionedGAM の場合、出力の値は IncludeInteractions の値によって異なります。

      • IncludeInteractionsfalse の場合、L(1 + min(NumTrainedPerFold.PredictorTrees)) 行 1 列の数値列ベクトルです。L の最初の要素は、切片 (定数) 項のみを使用して取得したすべての分割の平均です。L(j + 1) 番目の要素は、切片項と各線形項の最初の j 個の予測子木を使用して取得した平均です。

      • IncludeInteractionstrue の場合、L(1 + min(NumTrainedPerFold.InteractionTrees)) 行 1 列の数値列ベクトルです。L の最初の要素は、切片 (定数) 項と各線形項のすべての予測子木を使用して取得したすべての分割の平均です。L(j + 1) 番目の要素は、切片項、各線形項のすべての予測子木、および各交互作用項の最初の j 個の交互作用木を使用して取得した平均です。

    例: 'Mode','individual'

    出力引数

    すべて折りたたむ

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

    • Mode'average' である場合、L はすべての分割の平均分類損失です。

    • Mode'individual' である場合、L は各分割の分類損失が含まれている k 行 1 列の数値列ベクトルです。k は分割数です。

    • Mode'cumulative'CVMdlClassificationPartitionedEnsemble である場合、Lmin(CVMdl.NumTrainedPerFold) 行 1 列の数値列ベクトルです。各要素 j は、弱学習器 1:j で学習させたアンサンブルを使用して取得したすべての分割の平均分類損失です。

    • Mode'cumulative'CVMdlClassificationPartitionedGAM の場合、出力の値は IncludeInteractions の値によって異なります。

      • IncludeInteractionsfalse の場合、L(1 + min(NumTrainedPerFold.PredictorTrees)) 行 1 列の数値列ベクトルです。L の最初の要素は、切片 (定数) 項のみを使用して取得したすべての分割の平均分類損失です。L(j + 1) 番目の要素は、切片項と各線形項の最初の j 個の予測子木を使用して取得した平均損失です。

      • IncludeInteractionstrue の場合、L(1 + min(NumTrainedPerFold.InteractionTrees)) 行 1 列の数値列ベクトルです。L の最初の要素は、切片 (定数) 項と各線形項のすべての予測子木を使用して取得したすべての分割の平均分類損失です。L(j + 1) 番目の要素は、切片項、各線形項のすべての予測子木、および各交互作用項の最初の j 個の交互作用木を使用して取得した平均損失です。

    詳細

    すべて折りたたむ

    分類損失

    "分類損失" 関数は分類モデルの予測誤差を評価します。複数のモデルで同じタイプの損失を比較した場合、損失が低い方が予測モデルとして優れていることになります。

    以下のシナリオを考えます。

    • L は加重平均分類損失です。

    • n は標本サイズです。

    • バイナリ分類は以下です。

      • yj は観測されたクラス ラベルです。陰性クラスを示す -1 または陽性クラスを示す 1 (あるいは、ClassNames プロパティの最初のクラスを示す -1 または 2 番目のクラスを示す 1) を使用して符号化されます。

      • f(Xj) は予測子データ X の観測値 (行) j に対する陽性クラスの分類スコアです。

      • mj = yjf(Xj) は、yj に対応するクラスに観測値 j を分類する分類スコアです。正の値の mj は正しい分類を示しており、平均損失に対する寄与は大きくありません。負の値の mj は正しくない分類を示しており、平均損失に大きく寄与します。

    • マルチクラス分類 (つまり、K ≥ 3) をサポートするアルゴリズムの場合、次のようになります。

      • yj* は、K - 1 個の 0 と、観測された真のクラス yj に対応する位置の 1 から構成されるベクトルです。たとえば、2 番目の観測値の真のクラスが 3 番目のクラスであり K = 4 の場合、y2* = [0 0 1 0]′ になります。クラスの順序は入力モデルの ClassNames プロパティ内の順序に対応します。

      • f(Xj) は予測子データ X の観測値 j に対するクラス スコアのベクトルで、長さは K です。スコアの順序は入力モデルの ClassNames プロパティ内のクラスの順序に対応します。

      • mj = yj*′f(Xj).したがって mj は、観測された真のクラスについてモデルが予測するスカラー分類スコアです。

    • 観測値 j の重みは wj です。観測値の重みは、その合計が Prior プロパティに格納された対応するクラスの事前確率になるように正規化されます。そのため、次のようになります。

      j=1nwj=1.

    この状況では、名前と値の引数 LossFun を使用して指定できる、サポートされる損失関数は次の表のようになります。

    損失関数LossFun の値
    二項分布からの逸脱度"binodeviance"L=j=1nwjlog{1+exp[2mj]}.
    観測誤分類コスト"classifcost"

    L=j=1nwjcyjy^j,

    ここで、y^j はスコアが最大のクラスに対応するクラス ラベル、cyjy^j は真のクラスが yj である場合に観測値をクラス y^j に分類するユーザー指定のコストです。

    10 進数の誤分類率"classiferror"

    L=j=1nwjI{y^jyj},

    ここで、I{·} はインジケーター関数です。

    クロスエントロピー損失"crossentropy"

    "crossentropy" はニューラル ネットワーク モデルのみに適しています。

    加重クロスエントロピー損失は次となります。

    L=j=1nw˜jlog(mj)Kn,

    ここで重み w˜j は、合計が 1 ではなく n になるように正規化されます。

    指数損失"exponential"L=j=1nwjexp(mj).
    ヒンジ損失"hinge"L=j=1nwjmax{0,1mj}.
    ロジット損失"logit"L=j=1nwjlog(1+exp(mj)).
    最小予測誤分類コスト"mincost"

    "mincost" は、分類スコアが事後確率の場合にのみ適しています。

    重み付きの最小予測分類コストは、次の手順を観測値 j = 1、...、n について使用することにより計算されます。

    1. 観測値 Xj をクラス k に分類する予測誤分類コストを推定します。

      γjk=(f(Xj)C)k.

      f(Xj) は観測値 Xj のクラス事後確率の列ベクトルです。C はモデルの Cost プロパティに格納されるコスト行列です。

    2. 最小予測誤分類コストに対応するクラス ラベルを観測値 j について予測します。

      y^j=argmink=1,...,Kγjk.

    3. C を使用して、予測を行うために必要なコスト (cj) を求めます。

    最小予測誤分類コスト損失の加重平均は次となります。

    L=j=1nwjcj.

    二次損失"quadratic"L=j=1nwj(1mj)2.

    既定のコスト行列 (正しい分類の場合の要素値は 0、誤った分類の場合の要素値は 1) を使用する場合、"classifcost""classiferror"、および "mincost" の損失の値は同じです。既定以外のコスト行列をもつモデルでは、ほとんどの場合は "classifcost" の損失と "mincost" の損失が等価になります。これらの損失が異なる値になる可能性があるのは、最大の事後確率をもつクラスへの予測と最小の予測コストをもつクラスへの予測が異なる場合です。"mincost" は分類スコアが事後確率の場合にしか適さないことに注意してください。

    次の図では、1 つの観測値のスコア m に対する損失関数 ("classifcost""crossentropy"、および "mincost" を除く) を比較しています。いくつかの関数は、点 (0,1) を通過するように正規化されています。

    Comparison of classification losses for different loss functions

    アルゴリズム

    kfoldLoss は、対応するオブジェクト関数 loss で説明されているように、分類損失を計算します。モデル固有の説明については、次の表に示す該当する関数 loss のリファレンス ページを参照してください。

    モデル タイプ関数 loss
    判別分析分類器loss
    アンサンブル分類器loss
    一般化加法モデル分類器loss
    k 最近傍分類器loss
    単純ベイズ分類器loss
    ニューラル ネットワーク分類器loss
    サポート ベクター マシン分類器loss
    マルチクラス分類用の二分決定木loss

    拡張機能

    バージョン履歴

    R2011a で導入

    すべて展開する