Main Content

loss

一般化加法モデル (GAM) の分類損失

R2021a 以降

    説明

    L = loss(Mdl,Tbl,ResponseVarName) は、分類損失 (L) を返します。これは、Tbl.ResponseVarName 内の真のクラス ラベルと比較して、一般化加法モデル MdlTbl 内の予測子データをどの程度の精度で分類するかを表すスカラーです。

    L の解釈は損失関数 ('LossFun') と加重スキーム ('Weights') によって異なります。一般に、優れた分類器の方が分類損失値が小さくなります。'LossFun' の既定値は 'classiferror' (10 進数の誤分類率) です。

    L = loss(Mdl,Tbl,Y) は、table Tbl 内の予測子データと Y 内の真のクラス ラベルを使用します。

    L = loss(Mdl,X,Y) は、行列 X 内の予測子データと Y 内の真のクラス ラベルを使用します。

    L = loss(___,Name,Value) では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、'LossFun','mincost' は損失関数を最小予測誤分類コスト関数に設定します。

    すべて折りたたむ

    一般化加法モデルのテスト標本分類誤差 (損失) を判定します。複数のモデルで同じタイプの損失を比較した場合、損失が低い方が予測モデルとして優れていることになります。

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

    load ionosphere

    Y のクラス情報を使用して、観測値を階層的に学習セットとテスト セットに無作為に分割します。テスト用の 30% のホールドアウト標本を指定します。

    rng('default') % For reproducibility
    cv = cvpartition(Y,'HoldOut',0.30);

    学習インデックスとテスト インデックスを抽出します。

    trainInds = training(cv);
    testInds = test(cv);

    学習データ セットとテスト データ セットを指定します。

    XTrain = X(trainInds,:);
    YTrain = Y(trainInds);
    XTest = X(testInds,:);
    YTest = Y(testInds);

    予測子 XTrain とクラス ラベル YTrain を使用して、GAM に学習させます。クラス名を指定することが推奨されます。

    Mdl = fitcgam(XTrain,YTrain,'ClassNames',{'b','g'});

    MdlClassificationGAM モデル オブジェクトです。

    テスト標本分類誤差を推定して、アルゴリズムの一般化の精度を特定します。既定では、ClassificationGAM の関数 loss は、'classiferror' の損失 (10 進数の誤分類率) を使用して分類誤差を推定します。

    L = loss(Mdl,XTest,YTest)
    L = 
    0.1052
    

    学習させた分類器は、テスト標本のうち約 11% を誤分類しています。

    予測子の線形項と交互作用項の両方が格納されている一般化加法モデル (GAM) に学習させて、交互作用項を含む分類損失と含まない分類損失を推定します。学習データとテスト データの分類損失を推定する際に交互作用項を含めるかどうかを指定します。

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

    load ionosphere

    データ セットを 2 つのセットに分割します。1 つは学習データを含め、もう 1 つは新しい未観測のテスト データを含めます。新しいテスト データ セットの 50 件の観測値を保持します。

    rng('default') % For reproducibility
    n = size(X,1);
    newInds = randsample(n,50);
    inds = ~ismember(1:n,newInds);
    XNew = X(newInds,:);
    YNew = Y(newInds);

    予測子 X とクラス ラベル Y を使用して、GAM に学習させます。クラス名を指定することが推奨されます。上位 10 個の最も重要な交互作用項を含めるように指定します。

    Mdl = fitcgam(X(inds,:),Y(inds),'ClassNames',{'b','g'},'Interactions',10)
    Mdl = 
      ClassificationGAM
                 ResponseName: 'Y'
        CategoricalPredictors: []
                   ClassNames: {'b'  'g'}
               ScoreTransform: 'logit'
                    Intercept: 2.0026
                 Interactions: [10x2 double]
              NumObservations: 301
    
    
    

    MdlClassificationGAM モデル オブジェクトです。

    Mdl に交互作用項を含める場合と含めない場合の両方の再代入分類損失を計算します。交互作用項を除外するには、'IncludeInteractions',false を指定します。

    resubl = resubLoss(Mdl)
    resubl = 
    0
    
    resubl_nointeraction = resubLoss(Mdl,'IncludeInteractions',false)
    resubl_nointeraction = 
    0
    

    Mdl に交互作用項を含める場合と含めない場合の両方の分類損失を推定します。

    l = loss(Mdl,XNew,YNew)
    l = 
    0.0615
    
    l_nointeraction = loss(Mdl,XNew,YNew,'IncludeInteractions',false)
    l_nointeraction = 
    0.0615
    

    交互作用項を含めても、Mdl の分類損失は変わりません。学習済みモデルはすべての学習標本を正しく分類し、テスト標本のうち約 6% を誤分類しています。

    入力引数

    すべて折りたたむ

    一般化加法モデル。ClassificationGAM または CompactClassificationGAM モデル オブジェクトとして指定します。

    • table に格納されている標本データを使用して Mdl に学習させた場合、loss の入力データも table (Tbl) でなければなりません。

    • 行列に格納されている標本データを使用して Mdl に学習させた場合、loss の入力データも行列 (X) でなければなりません。

    標本データ。テーブルとして指定します。Tbl の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。

    Tbl には、Mdl に学習させるために使用したすべての予測子が含まれていなければなりません。必要に応じて、Tbl に応答変数用の列と観測値の重み用の列を含めることができます。

    • 応答変数のデータ型は Mdl.Y と同じでなければなりません。(string 配列は文字ベクトルの cell 配列として扱われます)。Tbl に含まれる応答変数が Mdl の学習に使用した応答変数と同じ名前である場合、ResponseVarName を指定する必要はありません。

    • 重みの値は数値ベクトルでなければなりません。Tbl 内の観測値の重みは 'Weights' を使用して指定しなければなりません。

    table に格納されている標本データを使用して Mdl に学習をさせた場合、loss の入力データも table に含まれていなければなりません。

    データ型: table

    応答変数名。Tbl 内の応答変数の名前を含む文字ベクトルまたは string スカラーとして指定します。たとえば、応答変数 YTbl.Y に格納されている場合、'Y' として指定します。

    データ型: char | string

    クラス ラベル。categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列を指定します。Y の各行は、X または Tbl の対応する行の分類を表します。

    Y のデータ型は Mdl.Y と同じでなければなりません。(string 配列は文字ベクトルの cell 配列として扱われます)。

    データ型: single | double | categorical | logical | char | string | cell

    予測子データ。数値行列として指定します。X の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。

    行列に格納されている標本データを使用して Mdl に学習させた場合、loss の入力データも行列でなければなりません。

    データ型: single | double

    名前と値の引数

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

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

    例: 'IncludeInteractions',false,'Weights',w は、モデルから交互作用項を除外し、観測値の重み w を使用するように指定します。

    モデルの交互作用項を含むというフラグ。true または false として指定します。

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

    例: 'IncludeInteractions',false

    データ型: logical

    損失関数。組み込みの損失関数名または関数ハンドルを指定します。

    入力モデル オブジェクトの ScoreTransform プロパティ (Mdl.ScoreTransform) が 'logit' であれば既定値は 'mincost'、それ以外であれば既定値は 'classiferror' です。

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

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

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

    • カスタム損失関数を指定するには、関数ハンドル表記を使用します。関数は次の形式でなければなりません。

      lossvalue = lossfun(C,S,W,Cost)

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

      • 関数名 (lossfun) を指定します。

      • CnK 列の logical 行列であり、対応する観測値が属するクラスを各行が示します。nTbl または X 内の観測値の個数、K は異なるクラスの個数 (numel(Mdl.ClassNames)) です。列の順序は Mdl.ClassNames のクラスの順序に対応します。各行について観測値 p がクラス q に属する場合は C(p,q) = 1 を設定することにより、C を作成します。行 p の他のすべての要素を 0 に設定します。

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

      • W は、観測値の重みの n 行 1 列の数値ベクトルです。

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

    例: 'LossFun','binodeviance'

    データ型: char | string | function_handle

    観測値の重み。スカラー値のベクトルまたは Tbl 内の変数の名前として指定します。X または Tbl の各行に含まれている観測値には、Weights の対応する値で重みが付けられます。Weights のサイズは、X または Tbl の行数と同じでなければなりません。

    入力データをテーブル Tbl として指定した場合、Weights は数値ベクトルが含まれている Tbl 内の変数の名前にすることができます。この場合、Weights には文字ベクトルまたは string スカラーを指定しなければなりません。たとえば、重みのベクトル WTbl.W に格納されている場合、'W' として指定します。

    loss は、合計がクラスの事前確率の値になるように各クラスの重みを正規化します。

    データ型: single | double | char | string

    詳細

    すべて折りたたむ

    分類損失

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

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

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

    • n は標本サイズです。

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

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

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

    バージョン履歴

    R2021a で導入

    すべて展開する