Main Content

loss

単純ベイズ分類器の分類損失

説明

L = loss(Mdl,tbl,ResponseVarName)分類損失を返します。これは、tbl.ResponseVarName 内の真のクラス ラベルと比較して、学習済みの単純ベイズ分類器 Mdl が table tbl 内の予測子データをどの程度適切に分類するかを表すスカラーです。

loss は、MdlPrior プロパティに格納されている、fitcnb が学習に使用したクラスの事前確率に対して、tbl.ResponseVarName 内のクラス確率を正規化します。

L = loss(Mdl,tbl,Y) は、table tbl 内の予測子データと Y 内の真のクラス ラベルに対する分類損失を返します。

L = loss(Mdl,X,Y) は、行列 X に含まれている予測子データに基づいて、Y に含まれている真のクラス ラベルと比較した分類損失を返します。

L = loss(___,Name,Value) では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値のペアの引数を使用してオプションを指定します。たとえば、損失関数や分類の重みを指定できます。

すべて折りたたむ

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

fisheriris データ セットを読み込みます。150 本のアヤメについて 4 つの花弁の測定値が含まれる数値行列 X を作成します。対応するアヤメの種類が含まれる文字ベクトルの cell 配列 Y を作成します。

load fisheriris
X = meas;
Y = species;
rng('default')  % for reproducibility

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

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 を使用して、単純ベイズ分類器に学習させます。クラス名を指定することが推奨されます。fitcnb は、各予測子が条件付き正規分布に従うと仮定しています。

Mdl = fitcnb(XTrain,YTrain,'ClassNames',{'setosa','versicolor','virginica'})
Mdl = 
  ClassificationNaiveBayes
              ResponseName: 'Y'
     CategoricalPredictors: []
                ClassNames: {'setosa'  'versicolor'  'virginica'}
            ScoreTransform: 'none'
           NumObservations: 105
         DistributionNames: {'normal'  'normal'  'normal'  'normal'}
    DistributionParameters: {3x4 cell}


Mdl は学習させた ClassificationNaiveBayes 分類器です。

テスト標本分類誤差を推定して、アルゴリズムの一般化の精度を特定します。

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

単純ベイズ分類器は、テスト標本のうち約 4% を誤分類しています。

fitcnb で分類器を学習させるときに、より適切な予測子の分布を指定することで、分類誤差を低減できる可能性があります。

fisheriris データ セットを読み込みます。150 本のアヤメについて 4 つの花弁の測定値が含まれる数値行列 X を作成します。対応するアヤメの種類が含まれる文字ベクトルの cell 配列 Y を作成します。

load fisheriris
X = meas;
Y = species;
rng('default')  % for reproducibility

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

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 を使用して、単純ベイズ分類器に学習させます。クラス名を指定することが推奨されます。fitcnb は、各予測子が条件付き正規分布に従うと仮定しています。

Mdl = fitcnb(XTrain,YTrain,'ClassNames',{'setosa','versicolor','virginica'});

Mdl は学習させた ClassificationNaiveBayes 分類器です。

テスト標本ロジット損失を推定して、アルゴリズムの一般化の精度を判定します。

L = loss(Mdl,XTest,YTest,'LossFun','logit')
L = 0.3359

ロジット損失は約 0.34 です。

入力引数

すべて折りたたむ

単純ベイズ分類モデル。fitcnb によって返される ClassificationNaiveBayes モデル オブジェクト、または compact によって返される CompactClassificationNaiveBayes モデル オブジェクトとして指定します。

モデルを学習させるために使用する標本データ。テーブルとして指定します。tbl の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。tbl には、Mdl の学習を行うために使用したすべての予測子が含まれていなければなりません。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。必要に応じて、tbl に応答変数用および観測値の重み用の追加列を含めることができます。

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

応答変数の名前。tbl 内の変数の名前で指定します。

ResponseVarName には文字ベクトルまたは string スカラーを指定しなければなりません。たとえば、応答変数 ytbl.y として格納されている場合、'y' として指定します。それ以外の場合、tbl の列は y を含めてすべて予測子として扱われます。

Mdl を学習させるために使用した応答変数が tbl に含まれている場合、ResponseVarName を指定する必要はありません。

応答変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列でなければなりません。応答変数が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。

データ型: char | string

予測子データ。数値行列として指定します。

X の各行は 1 つの観測値 ("インスタンス" や "例" とも呼ばれます) に対応し、各列は 1 つの変数 ("特徴" とも呼ばれます) に対応します。X の列内の変数は、分類器 Mdl に学習させた変数と同じでなければなりません。

Y の長さと X の行数は等しくなければなりません。

データ型: double | single

クラス ラベル。categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトルのいずれか、あるいは文字ベクトルの cell 配列として指定します。Y のデータ型は Mdl.ClassNames と同じでなければなりません。(string 配列は文字ベクトルの cell 配列として扱われます)。

Y の長さは tbl または X の行数と等しくなければなりません。

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

名前と値の引数

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

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

例: loss(Mdl,tbl,Y,'Weights',W) は、変数 W の各行に格納されている対応する重みを使用して、tbl の各行の観測値に重みを付けます。

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

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

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

    'mincost' は、事後確率である分類スコアに適しています。既定の設定では、単純ベイズ モデルは分類スコアとして事後確率を返します (predict を参照)。

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

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

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

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

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

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

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

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

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

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

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

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

データ型: char | string | function_handle

観測値の重み。数値ベクトルまたは tbl 内の変数の名前を指定します。X または tbl の各行に含まれている観測値には、Weights の対応する重みが適用されます。

数値ベクトルで Weights を指定する場合、Weights のサイズは X または tbl の行数と等しくなければなりません。

Weights として tbl 内の変数名を指定する場合、名前は文字ベクトルまたは string スカラーでなければなりません。たとえば、重みが tbl.w として格納されている場合、Weights として 'w' を指定します。それ以外の場合、tbl の列は tbl.w を含めてすべて予測子として扱われます。

損失関数を指定しない場合、Weights は合計が 1 になるように正規化されます。

データ型: double | char | string

出力引数

すべて折りたたむ

分類損失。スカラーとして返されます。L は汎化または再代入品質測定です。解釈は損失関数と加重スキームによって異なります。通常は、優れた分類器の方が損失値がより小さくなります。

詳細

すべて折りたたむ

分類損失

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

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

  • 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

誤分類コスト

"誤分類コスト" は、観測を誤ったクラスにラベル付けする分類器の相対的な重大度です。

誤分類コストには、真と予測の 2 種類があります。K をクラスの数と仮定します。

  • "真の誤分類コスト" — K 行 K 列の行列で、要素 (i,j) は、真のクラスが i である場合に観測値をクラス j に分類するコストを示します。誤分類コストはプロパティ Mdl.Cost に格納され、計算に使用されます。既定の設定では、ij の場合に Mdl.Cost(i,j) = 1 で、i = j の場合Mdl.Cost(i,j) = 0 です。つまり、正しい分類のコストは 0 で、誤った分類では 1 です。

  • "予測誤分類コスト" — K 次元のベクトルで、要素 k は、観測値をクラス k に分類するクラス事後確率で重み付けされた加重平均コストです。

    ck=j=1KP^(Y=j|x1,...,xP)Costjk.

    つまり、観測値は予測誤分類コストが最も低いクラスに分類されます。

事後確率

"事後確率" はデータが与えられる場合に、観測値が特定のクラスに属している確率です。

単純ベイズの場合、与えられた観測値 (x1,...,xP) の分類が k になる事後確率は次のようになります。

P^(Y=k|x1,..,xP)=P(X1,...,XP|y=k)π(Y=k)P(X1,...,XP),

ここで

  • P(X1,...,XP|y=k) は、予測子がクラス k に含まれる場合の条件付き同時密度です。予測子の分布名は Mdl.DistributionNames に格納します。

  • π(Y = k) はクラスの事前確率の分布です。Mdl.Prior は事前分布を保存します。

  • P(X1,..,XP) は予測子の同時密度です。各クラスは離散的なので、次のようになります。P(X1,...,XP)=k=1KP(X1,...,XP|y=k)π(Y=k).

事前確率

クラスの "事前確率" は、母集団内でそのクラスの観測値が出現すると考えられる相対頻度です。

拡張機能

バージョン履歴

R2014b で導入