loss
単純ベイズ分類器の分類損失
説明
では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値のペアの引数を使用してオプションを指定します。たとえば、損失関数や分類の重みを指定できます。L = loss(___,Name,Value)
例
単純ベイズ分類器のテスト標本分類誤差 (損失) を判定します。複数のモデルで同じタイプの損失を比較した場合、損失が低い方が予測モデルとして優れていることになります。
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: {3×4 cell}
Properties, Methods
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 スカラーを指定しなければなりません。たとえば、応答変数 y が tbl.y として格納されている場合、'y' として指定します。それ以外の場合、tbl の列は y を含めてすべて予測子として扱われます。
Mdl を学習させるために使用した応答変数が tbl に含まれている場合、ResponseVarName を指定する必要はありません。
応答変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列でなければなりません。応答変数が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。
データ型: char | string
予測子データ。数値行列として指定します。
X の各行は 1 つの観測値 ("インスタンス" や "例" とも呼ばれます) に対応し、各列は 1 つの変数 ("特徴" とも呼ばれます) に対応します。X の列内の変数は、分類器 Mdl に学習させた変数と同じでなければなりません。
Y の長さと X の行数は等しくなければなりません。
データ型: double | single
名前と値の引数
オプションの引数のペアを 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を参照)。関数ハンドル表記を使用して独自の関数を指定します。
nはX内の観測値の個数、Kは異なるクラスの個数 (numel(Mdl.ClassNames)。Mdlは入力モデル) であると仮定します。使用する関数のシグネチャは次のようになっていなければなりません。ここでlossvalue =lossfun(C,S,W,Cost)出力引数
lossvalueはスカラーです。関数名 (
lossfun) を指定します。Cはn行K列の logical 行列であり、対応する観測値が属するクラスを各行が示します。列の順序はMdl.ClassNamesのクラスの順序に対応します。各行について観測値
pがクラスqに属する場合はC(p,q) = 1を設定することにより、Cを作成します。行pの他のすべての要素を0に設定します。Sは、分類スコアのn行K列の行列です。列の順序は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
観測値の重み。数値ベクトルまたは 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プロパティに格納された対応するクラスの事前確率になるように正規化されます。そのため、次のようになります。
この状況では、名前と値の引数 LossFun を使用して指定できる、サポートされる損失関数は次の表のようになります。
| 損失関数 | LossFun の値 | 式 |
|---|---|---|
| 二項分布からの逸脱度 | "binodeviance" | |
| 観測誤分類コスト | "classifcost" | ここで、 はスコアが最大のクラスに対応するクラス ラベル、 は真のクラスが yj である場合に観測値をクラス に分類するユーザー指定のコストです。 |
| 10 進数の誤分類率 | "classiferror" | ここで、I{·} はインジケーター関数です。 |
| クロスエントロピー損失 | "crossentropy" |
加重クロスエントロピー損失は次となります。 ここで重み は、合計が 1 ではなく n になるように正規化されます。 |
| 指数損失 | "exponential" | |
| ヒンジ損失 | "hinge" | |
| ロジスティック損失 | "logit" | |
| 最小予測誤分類コスト | "mincost" |
重み付きの最小予測分類コストは、次の手順を観測値 j = 1、...、n について使用することにより計算されます。
最小予測誤分類コスト損失の加重平均は次となります。 |
| 二次損失 | "quadratic" |
既定のコスト行列 (正しい分類の場合の要素値は 0、誤った分類の場合の要素値は 1) を使用する場合、"classifcost"、"classiferror"、および "mincost" の損失の値は同じです。既定以外のコスト行列をもつモデルでは、ほとんどの場合は "classifcost" の損失と "mincost" の損失が等価になります。これらの損失が異なる値になる可能性があるのは、最大の事後確率をもつクラスへの予測と最小の予測コストをもつクラスへの予測が異なる場合です。"mincost" は分類スコアが事後確率の場合にしか適さないことに注意してください。
次の図では、1 つの観測値のスコア m に対する損失関数 ("classifcost"、"crossentropy"、および "mincost" を除く) を比較しています。いくつかの関数は、点 (0,1) を通過するように正規化されています。

"誤分類コスト" は、観測を誤ったクラスにラベル付けする分類器の相対的な重大度です。
誤分類コストには、真と予測の 2 種類があります。K をクラスの数と仮定します。
"真の誤分類コスト" — K 行 K 列の行列で、要素 (i,j) は、真のクラスが i である場合に観測値をクラス j に分類するコストを示します。誤分類コストはプロパティ
Mdl.Costに格納され、計算に使用されます。既定の設定では、i≠jの場合にMdl.Cost(i,j)= 1 で、i=jの場合Mdl.Cost(i,j)= 0 です。つまり、正しい分類のコストは0で、誤った分類では1です。"予測誤分類コスト" — K 次元のベクトルで、要素 k は、観測値をクラス k に分類するクラス事後確率で重み付けされた加重平均コストです。
つまり、観測値は予測誤分類コストが最も低いクラスに分類されます。
"事後確率" はデータが与えられる場合に、観測値が特定のクラスに属している確率です。
単純ベイズの場合、与えられた観測値 (x1,...,xP) の分類が k になる事後確率は次のようになります。
ここで
は、予測子がクラス k に含まれる場合の条件付き同時密度です。予測子の分布名は
Mdl.DistributionNamesに格納します。π(Y = k) はクラスの事前確率の分布です。
Mdl.Priorは事前分布を保存します。は予測子の同時密度です。各クラスは離散的なので、次のようになります。
クラスの "事前確率" は、母集団内でそのクラスの観測値が出現すると考えられる相対頻度です。
拡張機能
バージョン履歴
R2014b で導入
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)