loss
マルチクラス誤り訂正出力符号 (ECOC) モデルの分類損失
説明
は、分類損失 (L
= loss(Mdl
,tbl
,ResponseVarName
)L
) を返します。これは、tbl.ResponseVarName
内の真のクラス ラベルと比較して、学習済みのマルチクラス誤り訂正出力符号 (ECOC) モデル Mdl
が tbl
内の予測子データをどの程度の精度で分類するかを表すスカラーです。既定では、loss
は分類誤差を使用して L
を計算します。
では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値のペアの引数を使用してオプションを指定します。たとえば、復号化方式、分類損失関数、詳細レベルなどを指定できます。L
= loss(___,Name,Value
)
例
ECOC モデルのテスト標本損失の特定
フィッシャーのアヤメのデータ セットを読み込みます。予測子データ X
、応答データ Y
、および Y
内のクラスの順序を指定します。
load fisheriris X = meas; Y = categorical(species); classOrder = unique(Y); % Class order rng(1); % For reproducibility
SVM バイナリ分類器を使用して ECOC モデルを学習させます。15% のホールドアウト標本を指定し、SVM テンプレートを使用して予測子を標準化し、クラスの順序を指定します。
t = templateSVM('Standardize',true); PMdl = fitcecoc(X,Y,'Holdout',0.15,'Learners',t,'ClassNames',classOrder); Mdl = PMdl.Trained{1}; % Extract trained, compact classifier
PMdl
は ClassificationPartitionedECOC
モデルです。これには Trained
プロパティが含まれています。これは、学習セットを使用して学習をさせた CompactClassificationECOC
モデルが格納されている、1 行 1 列の cell 配列です。
テスト標本の分類誤差を推定します。これは既定の分類損失です。
testInds = test(PMdl.Partition); % Extract the test indices
XTest = X(testInds,:);
YTest = Y(testInds,:);
L = loss(Mdl,XTest,YTest)
L = 0
ECOC モデルは、テスト標本のアヤメをすべて正しく分類します。
カスタム損失の使用による ECOC モデルの品質の判別
各観測値の最小バイナリ損失を考慮するカスタム損失関数を使用して、ECOC モデルの品質を判別します。
フィッシャーのアヤメのデータ セットを読み込みます。予測子データ X
、応答データ Y
、および Y
内のクラスの順序を指定します。
load fisheriris X = meas; Y = categorical(species); classOrder = unique(Y); % Class order rng(1) % For reproducibility
SVM バイナリ分類器を使用して ECOC モデルを学習させます。15% のホールドアウト標本を指定し、SVM テンプレートを使用して予測子を標準化し、クラスの順序を定義します。
t = templateSVM('Standardize',true); PMdl = fitcecoc(X,Y,'Holdout',0.15,'Learners',t,'ClassNames',classOrder); Mdl = PMdl.Trained{1}; % Extract trained, compact classifier
PMdl
は ClassificationPartitionedECOC
モデルです。これには Trained
プロパティが含まれています。これは、学習セットを使用して学習をさせた CompactClassificationECOC
モデルが格納されている、1 行 1 列の cell 配列です。
各観測値の最小損失を受け入れ、すべての観測値の最小損失の平均を求める、関数を作成します。S
は、predict
の出力 NegLoss
に対応します。
lossfun = @(~,S,~,~)mean(min(-S,[],2));
テスト標本のカスタム損失を計算します。
testInds = test(PMdl.Partition); % Extract the test indices XTest = X(testInds,:); YTest = Y(testInds,:); loss(Mdl,XTest,YTest,'LossFun',lossfun)
ans = 0.0049
テスト標本観測値の平均最小バイナリ損失は 0.0033
です。
入力引数
Mdl
— 完全またはコンパクトなマルチクラス ECOC モデル
ClassificationECOC
モデル オブジェクト | CompactClassificationECOC
モデル オブジェクト
完全またはコンパクトなマルチクラス ECOC モデル。ClassificationECOC
または CompactClassificationECOC
モデル オブジェクトを指定します。
完全またはコンパクトな ECOC モデルを作成する方法については、ClassificationECOC
または CompactClassificationECOC
を参照してください。
tbl
— 標本データ
テーブル
標本データ。テーブルとして指定します。tbl
の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。必要に応じて、応答変数用および観測値の重み用の追加列を tbl
に含めることができます。tbl
には、Mdl
を学習させるために使用したすべての予測子が含まれていなければなりません。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。
table
に格納されている標本データを使用して Mdl
に学習をさせた場合、loss
の入力データも table に含まれていなければなりません。
Mdl
に学習をさせるときに、fitcecoc
の名前と値のペアの引数 'Learners'
で指定したテンプレート オブジェクトについて 'Standardize',true
を設定したとします。この場合、対応するバイナリ学習器 j
について、対応する Mdl.BinaryLearner{j}.Mu
内の平均および Mdl.BinaryLearner{j}.Sigma
内の標準偏差を使用して、新しい予測子データの列が標準化されます。
データ型: table
ResponseVarName
— 応答変数名
tbl
内の変数の名前
応答変数の名前。tbl
内の変数の名前で指定します。Mdl
を学習させるために使用した応答変数が tbl
に含まれている場合、ResponseVarName
を指定する必要はありません。
ResponseVarName
を指定する場合は、文字ベクトルまたは string スカラーとして指定しなければなりません。たとえば、応答変数が tbl.y
として格納されている場合、ResponseVarName
として 'y'
を指定します。それ以外の場合、tbl
の列は tbl.y
を含めてすべて予測子として扱われます。
応答変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列でなければなりません。応答変数が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。
データ型: char
| string
X
— 予測子データ
数値行列
予測子データ。数値行列として指定します。
X
の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。X
の列内の変数は、分類器 Mdl
に学習させた変数と同じでなければなりません。
X
の行数は Y
の行数と等しくなければなりません。
Mdl
に学習をさせるときに、fitcecoc
の名前と値のペアの引数 'Learners'
で指定したテンプレート オブジェクトについて 'Standardize',true
を設定したとします。この場合、対応するバイナリ学習器 j
について、対応する Mdl.BinaryLearner{j}.Mu
内の平均および Mdl.BinaryLearner{j}.Sigma
内の標準偏差を使用して、新しい予測子データの列が標準化されます。
データ型: double
| single
Y
— クラス ラベル
categorical 配列 | 文字配列 | string 配列 | logical ベクトル | 数値ベクトル | 文字ベクトルの cell 配列
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
例: loss(Mdl,X,Y,'BinaryLoss','hinge','LossFun',@lossfun)
は、バイナリ学習器の損失関数として 'hinge'
を、全体的な損失関数としてカスタム関数ハンドル @lossfun
を指定します。
BinaryLoss
— バイナリ学習器損失関数
'hamming'
| 'linear'
| 'logit'
| 'exponential'
| 'binodeviance'
| 'hinge'
| 'quadratic'
| 関数ハンドル
バイナリ学習器の損失関数。'BinaryLoss'
と組み込みの損失関数名または関数ハンドルから構成されるコンマ区切りのペアとして指定します。
次の表で、組み込み関数について説明します。ここで、yj は特定のバイナリ学習器のクラス ラベル (集合 {–1,1,0} 内)、sj は観測値 j のスコア、g(yj,sj) はバイナリ損失の式です。
値 説明 スコア領域 g(yj,sj) "binodeviance"
二項分布からの逸脱度 (–∞,∞) log[1 + exp(–2yjsj)]/[2log(2)] "exponential"
指数 (–∞,∞) exp(–yjsj)/2 "hamming"
ハミング [0,1] または (–∞,∞) [1 – sign(yjsj)]/2 "hinge"
ヒンジ (–∞,∞) max(0,1 – yjsj)/2 "linear"
線形 (–∞,∞) (1 – yjsj)/2 "logit"
ロジスティック (–∞,∞) log[1 + exp(–yjsj)]/[2log(2)] "quadratic"
2 次 [0,1] [1 – yj(2sj – 1)]2/2 バイナリ損失は、yj = 0 の場合に損失が 0.5 になるように正規化されます。また、各クラスについて平均のバイナリ損失が計算されます[1]。
カスタム バイナリ損失関数の場合は関数ハンドルを指定します。たとえば、
customFunction
の場合は'BinaryLoss',@customFunction
を指定します。customFunction
の形式は次のとおりです。bLoss = customFunction(M,s)
M
はMdl.CodingMatrix
に格納された K 行 B 列の符号化行列です。s
は 1 行 B 列の分類スコアの行ベクトルです。bLoss
は分類損失です。このスカラーは、特定のクラスのすべての学習器についてバイナリ損失を集計します。たとえば、平均バイナリ損失を使用して、各クラスの学習器の損失を集計できます。K は、クラスの数です。
B はバイナリ学習器の数です。
カスタムなバイナリ損失関数を渡す例については、カスタム バイナリ損失関数の使用による ECOC モデルのテスト標本ラベルの予測を参照してください。
次の表に BinaryLoss
の既定値を示します。既定値は、バイナリ学習器が返すスコアの範囲によって異なります。
仮定 | 既定値 |
---|---|
すべてのバイナリ学習器が次のいずれかである。
| 'quadratic' |
すべてのバイナリ学習器が SVM であるか、SVM 学習器の線形またはカーネル分類モデルである。 | 'hinge' |
すべてのバイナリ学習器が、AdaboostM1 または GentleBoost によって学習をさせたアンサンブルである。 | 'exponential' |
すべてのバイナリ学習器が、LogitBoost によって学習をさせたアンサンブルである。 | 'binodeviance' |
fitcecoc で 'FitPosterior',true を設定して、クラスの事後確率を予測するように指定している。 | 'quadratic' |
バイナリ学習器が異種混合で、さまざまな損失関数を使用している。 | 'hamming' |
既定値を確認するには、コマンド ラインでドット表記を使用して学習済みモデルの BinaryLoss
プロパティを表示します。
例: 'BinaryLoss','binodeviance'
データ型: char
| string
| function_handle
Decoding
— 復号化スキーム
'lossweighted'
(既定値) | 'lossbased'
バイナリ損失を集計する復号化方式。'Decoding'
と 'lossweighted'
または 'lossbased'
から構成されるコンマ区切りのペアとして指定します。詳細は、バイナリ損失を参照してください。
例: 'Decoding','lossbased'
LossFun
— 損失関数
'classiferror'
(既定値) | 'classifcost'
| 関数ハンドル
損失関数。'classiferror'
、'classifcost'
、または関数ハンドルとして指定します。
組み込み関数
'classiferror'
を指定します。この場合、損失関数は分類誤差であり、誤分類された観測値の比率です。組み込み関数
'classifcost'
を指定します。この場合、損失関数は観測誤分類コストです。既定のコスト行列 (正しい分類の場合の要素値は 0、誤った分類の場合の要素値は 1) を使用する場合、'classifcost'
と'classiferror'
の損失の値は同じです。または、関数ハンドル表記を使用して独自の関数を指定します。
n = size(X,1)
が標本サイズ、K
がクラス数であると仮定します。関数には署名lossvalue = lossfun(C,S,W,Cost)
がなければなりません。ここで、次のようになります。出力引数
lossvalue
はスカラーです。関数名 (
lossfun
) を指定します。C
はn
行K
列の logical 行列であり、対応する観測値が属するクラスを各行が示します。列の順序はMdl.ClassNames
のクラスの順序に対応します。C
を作成するには、各行について観測値p
がクラスq
に含まれている場合にC(p,q) = 1
を設定します。行p
の他のすべての要素を0
に設定します。S
は、符号を反転したクラスの損失値が含まれているn
行K
列の数値行列です。各列は観測と対応しています。列の順序はMdl.ClassNames
のクラスの順序に対応します。入力S
は、predict
の出力引数NegLoss
に似ています。W
は、観測値の重みのn
行 1 列の数値ベクトルです。W
を渡す場合、その要素は正規化され、合計が1
になります。Cost
は、誤分類コストの、K
行K
列の数値行列です。たとえば、Cost = ones(K) – eye(K)
は、正しい分類のコストとして 0 を、誤分類のコストとして 1 を指定します。
'LossFun',@lossfun
を使用して独自の関数を指定します。
データ型: char
| string
| function_handle
ObservationsIn
— 予測子データにおける観測値の次元
'rows'
(既定値) | 'columns'
予測子データにおける観測値の次元。'ObservationsIn'
と 'columns'
または 'rows'
から構成されるコンマ区切りのペアとして指定します。Mdl.BinaryLearners
には ClassificationLinear
モデルが格納されていなければなりません。
メモ
観測値が列に対応するように予測子行列を配置して 'ObservationsIn','columns'
を指定すると、実行時間が大幅に短縮される可能性があります。table の予測子データに対して 'ObservationsIn','columns'
を指定することはできません。
Options
— 推定オプション
[]
(既定値) | statset
によって返される構造体配列
推定オプション。statset
により返される 'Options'
と構造体配列から構成されるコンマ区切りのペアとして指定します。
並列計算を起動するには、以下を行います。
Parallel Computing Toolbox™ ライセンスが必要です。
'Options',statset('UseParallel',true)
を指定します。
Verbose
— 詳細レベル
0
(既定値) | 1
詳細レベル。'Verbose'
と 0
または 1
から構成されるコンマ区切りのペアとして指定します。Verbose
は、コマンド ウィンドウに表示される診断メッセージの量を制御します。
Verbose
が 0
の場合、診断メッセージは表示されません。それ以外の場合は、診断メッセージが表示されます。
例: 'Verbose',1
データ型: single
| double
Weights
— 観測値の重み
ones(size(X,1),1)
(既定値) | 数値ベクトル | tbl
内の変数の名前
観測値の重み。'Weights'
と数値ベクトル、または tbl
に含まれる変数の名前から構成されるコンマ区切りのペアとして指定します。重みを指定した場合、loss
は重み付きの損失を計算します。
数値ベクトルで Weights
を指定する場合、Weights
のサイズは X
または tbl
の行数と等しくなければなりません。
tbl
内の変数名を Weights
として指定する場合、文字ベクトルまたは string スカラーを指定しなければなりません。たとえば、重みが tbl.w
として格納されている場合、Weights
として 'w'
を指定します。それ以外の場合、tbl
の列は tbl.w
を含めてすべて予測子として扱われます。
独自の損失関数を (LossFun
を使用して) 指定しない場合、Weights
が正規化され、合計が各クラスの事前確率の値になります。
データ型: single
| double
| char
| string
出力引数
L
— 分類損失
数値スカラー | 数値行ベクトル
分類損失。数値スカラーまたは行ベクトルとして返されます。L
は汎化または再代入の品質の尺度です。解釈は損失関数と加重スキームによって異なりますが、一般に、優れた分類器の方が分類損失値が小さくなります。
Mdl.BinaryLearners
に ClassificationLinear
モデルが含まれている場合、L
は 1 行 ℓ 列のベクトルになります。ℓ は、線形分類モデル内の正則化強度の個数 (numel(Mdl.BinaryLearners{1}.Lambda)
) です。値 L(j)
は、正則化強度 Mdl.BinaryLearners{1}.Lambda(j)
を使用して学習をさせたモデルの損失です。
それ以外の場合、L
はスカラー値です。
詳細
分類誤差
"分類誤差" は次のような形式になります。
ここで
wj は観測値 j の重みです。重みは再度正規化され、合計は 1 になります。
観測 j の予測クラスが真のクラスと異なる場合、ej = 1 になり、それ以外の場合は 0 になります。
つまり、分類誤差は、分類器が誤分類した観測値の比率です。
観測誤分類コスト
"観測誤分類コスト" は次のような形式になります。
ここで
wj は観測値 j の重みです。重みは再度正規化され、合計は 1 になります。
は真のクラスが yj である場合に観測値をクラス に分類するユーザー指定のコストです。
バイナリ損失
"バイナリ損失" は、バイナリ学習器がどの程度の精度で観測値をクラスに分類するかを決定する、クラスと分類スコアの関数です。ソフトウェアでバイナリ損失をどのように集計して各観測値の予測クラスを判定するかは、ECOC モデルの "復号化方式" で指定します。
以下のように仮定します。
mkj は符号化設計行列 M の要素 (k,j)、つまりバイナリ学習器 j のクラス k に対応する符号。M は K 行 B 列の行列であり、K はクラスの数、B はバイナリ学習器の数です。
sj は観測値に対するバイナリ学習器 j のスコア。
g はバイナリ損失関数。
は観測値の予測クラス。
ソフトウェアでは 2 つの復号化方式をサポートしています。
関数 predict
、resubPredict
、および kfoldPredict
は、それぞれの観測値とクラスについて、argmin
の目的関数の符号反転値を 2 番目の出力引数 (NegLoss
) として返します。
次の表は、サポートされる損失関数をまとめたものです。ここで、yj は特定のバイナリ学習器のクラス ラベル (集合 {–1,1,0} 内)、sj は観測値 j のスコア、g(yj,sj) はバイナリ損失関数です。
値 | 説明 | スコア領域 | g(yj,sj) |
---|---|---|---|
"binodeviance" | 二項分布からの逸脱度 | (–∞,∞) | log[1 + exp(–2yjsj)]/[2log(2)] |
"exponential" | 指数 | (–∞,∞) | exp(–yjsj)/2 |
"hamming" | ハミング | [0,1] または (–∞,∞) | [1 – sign(yjsj)]/2 |
"hinge" | ヒンジ | (–∞,∞) | max(0,1 – yjsj)/2 |
"linear" | 線形 | (–∞,∞) | (1 – yjsj)/2 |
"logit" | ロジスティック | (–∞,∞) | log[1 + exp(–yjsj)]/[2log(2)] |
"quadratic" | 2 次 | [0,1] | [1 – yj(2sj – 1)]2/2 |
yj = 0 のときに損失が 0.5 になるようにバイナリ損失が正規化され、バイナリ学習器の平均が集計に使用されます[1]。
ECOC 分類器の全体的な性能の尺度である全体の分類損失 (オブジェクト関数 loss
および predict
の名前と値の引数 LossFun
により指定) とバイナリ損失を混同しないでください。
参照
[1] Allwein, E., R. Schapire, and Y. Singer. “Reducing multiclass to binary: A unifying approach for margin classifiers.” Journal of Machine Learning Research. Vol. 1, 2000, pp. 113–141.
[2] Escalera, S., O. Pujol, and P. Radeva. “Separability of ternary codes for sparse designs of error-correcting output codes.” Pattern Recog. Lett. Vol. 30, Issue 3, 2009, pp. 285–297.
[3] Escalera, S., O. Pujol, and P. Radeva. “On the decoding process in ternary error-correcting output codes.” IEEE Transactions on Pattern Analysis and Machine Intelligence. Vol. 32, Issue 7, 2010, pp. 120–134.
拡張機能
tall 配列
メモリの許容量を超えるような多数の行を含む配列を計算します。
自動並列サポート
Parallel Computing Toolbox™ を使用して自動的に並列計算を実行することで、コードを高速化します。
並列実行するには、この関数を呼び出すときに名前と値の引数 Options
を指定し、statset
を使用してオプション構造体の UseParallel
フィールドを true
に設定します。
Options=statset(UseParallel=true)
並列計算の詳細については、自動並列サポートを使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
使用上の注意事項および制限事項:
関数
loss
では代理分岐をもつ決定木学習器を使用して学習させたモデルはサポートしていません。関数
loss
では SVM 学習器を使用して学習させたモデルはサポートしていません。
詳細は、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
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)