loss
説明
では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、L
= loss(___,Name,Value
)'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'});
Mdl
は ClassificationGAM
モデル オブジェクトです。
テスト標本分類誤差を推定して、アルゴリズムの一般化の精度を特定します。既定では、ClassificationGAM
の関数 loss
は、'classiferror'
の損失 (10 進数の誤分類率) を使用して分類誤差を推定します。
L = loss(Mdl,XTest,YTest)
L = 0.1052
学習させた分類器は、テスト標本のうち約 11% を誤分類しています。
分類損失の検査による GAM の比較
予測子の線形項と交互作用項の両方が格納されている一般化加法モデル (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
Mdl
は ClassificationGAM
モデル オブジェクトです。
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% を誤分類しています。
入力引数
Mdl
— 一般化加法モデル
ClassificationGAM
モデル オブジェクト | CompactClassificationGAM
モデル オブジェクト
一般化加法モデル。ClassificationGAM
または CompactClassificationGAM
モデル オブジェクトとして指定します。
Tbl
— 標本データ
table
標本データ。テーブルとして指定します。Tbl
の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。
Tbl
には、Mdl
に学習させるために使用したすべての予測子が含まれていなければなりません。必要に応じて、Tbl
に応答変数用の列と観測値の重み用の列を含めることができます。
応答変数のデータ型は
Mdl.Y
と同じでなければなりません。(string 配列は文字ベクトルの cell 配列として扱われます)。Tbl
に含まれる応答変数がMdl
の学習に使用した応答変数と同じ名前である場合、ResponseVarName
を指定する必要はありません。重みの値は数値ベクトルでなければなりません。
Tbl
内の観測値の重みは'Weights'
を使用して指定しなければなりません。
table に格納されている標本データを使用して Mdl
に学習をさせた場合、loss
の入力データも table に含まれていなければなりません。
データ型: table
ResponseVarName
— 応答変数名
Tbl
内の変数の名前
応答変数名。Tbl
内の応答変数の名前を含む文字ベクトルまたは string スカラーとして指定します。たとえば、応答変数 Y
が Tbl.Y
に格納されている場合、'Y'
として指定します。
データ型: char
| string
Y
— クラス ラベル
categorical 配列 | 文字配列 | string 配列 | logical ベクトル | 数値ベクトル | 文字ベクトルの cell 配列
X
— 予測子データ
数値行列
予測子データ。数値行列として指定します。X
の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。
行列に格納されている標本データを使用して Mdl
に学習させた場合、loss
の入力データも行列でなければなりません。
データ型: single
| double
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
例: 'IncludeInteractions',false,'Weights',w
は、モデルから交互作用項を除外し、観測値の重み w
を使用するように指定します。
IncludeInteractions
— 交互作用項を含むというフラグ
true
| false
モデルの交互作用項を含むというフラグ。true
または false
として指定します。
Mdl
に交互作用項が含まれる場合、'IncludeInteractions'
の既定値は true
です。モデルに交互作用項が含まれない場合、値は false
でなければなりません。
例: 'IncludeInteractions',false
データ型: logical
LossFun
— 損失関数
'binodeviance'
| 'classifcost'
| 'classiferror'
| 'exponential'
| 'hinge'
| 'logit'
| 'mincost'
| 'quadratic'
| 関数ハンドル
損失関数。組み込みの損失関数名または関数ハンドルを指定します。
入力モデル オブジェクトの ScoreTransform
プロパティ (
) が Mdl
.ScoreTransform'logit'
であれば既定値は 'mincost'
、それ以外であれば既定値は 'classiferror'
です。
次の表は、使用できる損失関数の一覧です。対応する文字ベクトルまたは string スカラーを使用して、いずれかを指定します。
値 説明 "binodeviance"
二項分布からの逸脱度 "classifcost"
観測誤分類コスト "classiferror"
10 進数の誤分類率 "exponential"
指数損失 "hinge"
ヒンジ損失 "logit"
ロジスティック損失 "mincost"
最小予測誤分類コスト (事後確率である分類スコアの場合) "quadratic"
二次損失 損失関数の詳細については、分類損失を参照してください。
カスタム損失関数を指定するには、関数ハンドル表記を使用します。関数は次の形式でなければなりません。
lossvalue =
lossfun
(C,S,W,Cost)出力引数
lossvalue
はスカラーです。関数名 (
lossfun
) を指定します。C
はn
行K
列の logical 行列であり、対応する観測値が属するクラスを各行が示します。n
はTbl
またはX
内の観測値の個数、K
は異なるクラスの個数 (numel(Mdl.ClassNames)
) です。列の順序はMdl.ClassNames
のクラスの順序に対応します。各行について観測値p
がクラスq
に属する場合はC(p,q) = 1
を設定することにより、C
を作成します。行p
の他のすべての要素を0
に設定します。S
は、分類スコアのn
行K
列の行列です。列の順序はMdl.ClassNames
のクラスの順序に対応します。S
は分類スコアの行列で、predict
の出力と同様です。W
は、観測値の重みのn
行 1 列の数値ベクトルです。Cost
は、誤分類コストの、K
行K
列の数値行列です。たとえば、Cost = ones(K) – eye(K)
は、正しい分類のコストとして0
を、誤分類のコストとして1
を指定します。
例: 'LossFun','binodeviance'
データ型: char
| string
| function_handle
Weights
— 観測値の重み
ones(size(X,1),1)
(既定値) | スカラー値のベクトル | Tbl
内の変数の名前
観測値の重み。スカラー値のベクトルまたは Tbl
内の変数の名前として指定します。X
または Tbl
の各行に含まれている観測値には、Weights
の対応する値で重みが付けられます。Weights
のサイズは、X
または Tbl
の行数と同じでなければなりません。
入力データをテーブル Tbl
として指定した場合、Weights
は数値ベクトルが含まれている Tbl
内の変数の名前にすることができます。この場合、Weights
には文字ベクトルまたは string スカラーを指定しなければなりません。たとえば、重みのベクトル W
が Tbl.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
プロパティに格納された対応するクラスの事前確率になるように正規化されます。そのため、次のようになります。
この状況では、名前と値の引数 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) を通過するように正規化されています。
バージョン履歴
R2021a で導入R2022a: LossFun
の既定値の変更
R2022a 以降では、GAM オブジェクトで事後確率を分類スコアに使用する場合、つまり入力モデル オブジェクトの ScoreTransform
プロパティが 'logit'
である場合に、関数 loss
で名前と値の引数 LossFun
の既定値として "mincost"
オプション (最小予測誤分類コスト) が使用されるようになりました。それ以外の場合は、"classiferror"
オプション (10 進数の誤分類率) が既定で使用されます。以前のリリースでは、既定値は常に "classiferror"
でした。
既定のコスト行列 (正しい分類の場合の要素値は 0、誤った分類の場合の要素値は 1) を使用する場合、コードに変更を加える必要はありません。"mincost"
オプションは既定のコスト行列の "classiferror"
オプションと等価になります。
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)