このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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: {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 です。
入力引数
Mdl
— 単純ベイズ分類モデル
ClassificationNaiveBayes
モデル オブジェクト | CompactClassificationNaiveBayes
モデル オブジェクト
単純ベイズ分類モデル。fitcnb
によって返される ClassificationNaiveBayes
モデル オブジェクト、または compact
によって返される CompactClassificationNaiveBayes
モデル オブジェクトとして指定します。
tbl
— 標本データ
テーブル
モデルを学習させるために使用する標本データ。テーブルとして指定します。tbl
の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。tbl
には、Mdl
の学習を行うために使用したすべての予測子が含まれていなければなりません。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。必要に応じて、tbl
に応答変数用および観測値の重み用の追加列を含めることができます。
テーブルに格納されている標本データを使用して Mdl
の学習を行った場合、loss
の入力データもテーブルに格納されていなければなりません。
ResponseVarName
— 応答変数名
tbl
内の変数の名前
応答変数の名前。tbl
内の変数の名前で指定します。
ResponseVarName
には文字ベクトルまたは string スカラーを指定しなければなりません。たとえば、応答変数 y
が tbl.y
として格納されている場合、'y'
として指定します。それ以外の場合、tbl
の列は y
を含めてすべて予測子として扱われます。
Mdl
を学習させるために使用した応答変数が tbl
に含まれている場合、ResponseVarName
を指定する必要はありません。
応答変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列でなければなりません。応答変数が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。
データ型: char
| string
X
— 予測子データ
数値行列
予測子データ。数値行列として指定します。
X
の各行は 1 つの観測値 ("インスタンス" や "例" とも呼ばれます) に対応し、各列は 1 つの変数 ("特徴" とも呼ばれます) に対応します。X
の列内の変数は、分類器 Mdl
に学習させた変数と同じでなければなりません。
Y
の長さと X
の行数は等しくなければなりません。
データ型: double
| single
Y
— クラス ラベル
categorical 配列 | 文字配列 | string 配列 | logical ベクトル | 数値ベクトル | 文字ベクトルの cell 配列
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
例: loss(Mdl,tbl,Y,'Weights',W)
は、変数 W
の各行に格納されている対応する重みを使用して、tbl
の各行の観測値に重みを付けます。
LossFun
— 損失関数
'mincost'
(既定値) | 'binodeviance'
| 'classifcost'
| 'classiferror'
| 'exponential'
| 'hinge'
| 'logit'
| 'quadratic'
| 関数ハンドル
損失関数。'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
Weights
— 観測値の重み
ones(size(X,1),1)
(既定値) | 数値ベクトル | tbl
内の変数の名前
観測値の重み。数値ベクトルまたは 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
は汎化または再代入品質測定です。解釈は損失関数と加重スキームによって異なります。通常は、優れた分類器の方が損失値がより小さくなります。
詳細
分類損失
"分類損失" 関数は分類モデルの予測誤差を評価します。複数のモデルで同じタイプの損失を比較した場合、損失が低い方が予測モデルとして優れていることになります。
以下のシナリオを考えます。
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
は事前分布を保存します。は予測子の同時密度です。各クラスは離散的なので、次のようになります。
事前確率
クラスの "事前確率" は、母集団内でそのクラスの観測値が出現すると考えられる相対頻度です。
拡張機能
tall 配列
メモリの許容量を超えるような多数の行を含む配列を計算します。
この関数は、tall 配列を完全にサポートします。この関数でインメモリ データまたは tall データに対して学習を行ったモデルを使用できます。
詳細は、tall 配列を参照してください。
バージョン履歴
R2014b で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)