loss
説明
loss
は、構成されたインクリメンタル学習用のマルチクラス誤り訂正出力符号 (ECOC) 分類モデル (incrementalClassificationECOC
オブジェクト) の分類損失を返します。
データ ストリームでのモデルの性能を測定し、結果を出力モデルに保存するには、updateMetrics
または updateMetricsAndFit
を呼び出します。
例
ストリーミング データでのインクリメンタル モデルの性能を 3 通りの方法で測定します。
累積メトリクスで、インクリメンタル学習の開始以降の性能を測定します。
ウィンドウ メトリクスで、指定した観測値ウィンドウでの性能を測定します。指定したウィンドウをモデルが処理するたびにメトリクスが更新されます。
関数
loss
で、指定したデータのバッチについてのみ性能を測定します。
人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。
load humanactivity n = numel(actid); rng(1) % For reproducibility idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
データ セットの詳細については、コマンド ラインで Description
を入力してください。
インクリメンタル学習用の ECOC 分類モデルを作成します。クラス名を指定し、メトリクス ウィンドウ サイズを観測値 1000 個に指定します。モデルを最初の 10 個の観測値に当てはめて loss
用に構成します。
Mdl = incrementalClassificationECOC(ClassNames=unique(Y),MetricsWindowSize=1000); initobs = 10; Mdl = fit(Mdl,X(1:initobs,:),Y(1:initobs));
Mdl
は incrementalClassificationECOC
モデルです。そのプロパティはすべて読み取り専用です。
データ ストリームをシミュレートし、100 個の観測値の入力チャンクごとに次のアクションを実行します。
updateMetrics
を呼び出して、累積性能および観測値ウィンドウ内での性能を測定します。前のインクリメンタル モデルを新しいモデルで上書きして、パフォーマンス メトリクスを追跡します。loss
を呼び出して、入力チャンクでのモデルの性能を測定します。fit
を呼び出して、モデルを入力チャンクに当てはめます。前のインクリメンタル モデルを、入力観測値に当てはめた新しいモデルで上書きします。すべてのパフォーマンス メトリクスを保存して、インクリメンタル学習中にそれらがどのように進化するかを確認します。
% Preallocation numObsPerChunk = 100; nchunk = floor((n - initobs)/numObsPerChunk); mc = array2table(zeros(nchunk,3),VariableNames=["Cumulative","Window","Chunk"]); % Incremental learning for j = 1:nchunk ibegin = min(n,numObsPerChunk*(j-1) + 1 + initobs); iend = min(n,numObsPerChunk*j + initobs); idx = ibegin:iend; Mdl = updateMetrics(Mdl,X(idx,:),Y(idx)); mc{j,["Cumulative","Window"]} = Mdl.Metrics{"ClassificationError",:}; mc{j,"Chunk"} = loss(Mdl,X(idx,:),Y(idx)); Mdl = fit(Mdl,X(idx,:),Y(idx)); end
Mdl
は、ストリーム内のすべてのデータで学習させた incrementalClassificationECOC
モデル オブジェクトです。インクリメンタル学習中およびモデルがウォームアップされた後、updateMetrics
は入力観測値でのモデルの性能をチェックし、関数 fit
はモデルをそれらの観測値に当てはめます。loss
はメトリクスのウォームアップ期間に依存しないため、すべてのチャンクについて分類誤差を測定します。
パフォーマンス メトリクスが学習中にどのように進化するかを確認するには、それらをプロットします。
plot(mc.Variables) xlim([0 nchunk]) ylabel("Classification Error") xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,"--") grid on legend(mc.Properties.VariableNames) xlabel("Iteration")
黄色の線は、入力データの各チャンクの分類誤差を表します。メトリクスのウォームアップ期間後、Mdl
は累積およびウィンドウ メトリクスを追跡します。
インクリメンタル学習用の ECOC 分類モデルをストリーミング データに当てはめ、データの入力チャンクで最小の平均バイナリ損失を計算します。
人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。
load humanactivity n = numel(actid); rng(1) % For reproducibility idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
データ セットの詳細については、コマンド ラインで Description
を入力してください。
インクリメンタル学習用の ECOC 分類モデルを作成します。次のようにモデルを構成します。
クラス名を指定します。
メトリクスのウォームアップ期間を観測値 1000 個に指定します。
メトリクス ウィンドウ サイズを観測値 2000 個に指定します。
最小の平均バイナリ損失を追跡してモデルの性能を測定します。新しい各観測値の最小の平均バイナリ損失を測定する無名関数を作成します。名前
MinimalLoss
とそれに対応する関数ハンドルを含む構造体配列を作成します。モデルを最初の 10 個の観測値に当てはめて分類損失を計算します。
tolerance = 1e-10; minimalBinaryLoss = @(~,S,~)min(-S,[],2); ce = struct("MinimalLoss",minimalBinaryLoss); Mdl = incrementalClassificationECOC(ClassNames=unique(Y), ... MetricsWarmupPeriod=1000,MetricsWindowSize=2000, ... Metrics=ce); initobs = 10; Mdl = fit(Mdl,X(1:initobs,:),Y(1:initobs));
Mdl
はインクリメンタル学習用に構成された incrementalClassificationECOC
モデル オブジェクトです。
インクリメンタル学習を実行します。各反復で次を行います。
100 個の観測値のチャンクを処理して、データ ストリームをシミュレートします。
updateMetrics
を呼び出して、データの入力チャンクの累積メトリクスとウィンドウ メトリクスを計算します。前のインクリメンタル モデルを、前のメトリクスを上書きするように当てはめた新しいモデルで上書きします。loss
を呼び出して、データの入力チャンクの最小の平均バイナリ損失を計算します。累積メトリクスおよびウィンドウ メトリクスでは、カスタム損失が各観測値の損失を返す必要がありますが、loss
ではチャンク全体での損失が必要です。チャンク内の損失の平均を計算します。fit
を呼び出して、データの入力チャンクにインクリメンタル モデルを当てはめます。累積、ウィンドウ、およびチャンクのメトリクスを保存して、インクリメンタル学習中にそれらがどのように進化するかを確認します。
% Preallocation numObsPerChunk = 100; nchunk = floor((n - initobs)/numObsPerChunk); tanloss = array2table(zeros(nchunk,3), ... VariableNames=["Cumulative","Window","Chunk"]); % Incremental fitting for j = 1:nchunk ibegin = min(n,numObsPerChunk*(j-1) + 1 + initobs); iend = min(n,numObsPerChunk*j + initobs); idx = ibegin:iend; Mdl = updateMetrics(Mdl,X(idx,:),Y(idx)); tanloss{j,1:2} = Mdl.Metrics{"MinimalLoss",:}; tanloss{j,3} = loss(Mdl,X(idx,:),Y(idx), ... LossFun=@(z,zfit,w)mean(minimalBinaryLoss(z,zfit,w))); Mdl = fit(Mdl,X(idx,:),Y(idx)); end
Mdl
は、ストリーム内のすべてのデータで学習させた incrementalClassificationECOC
モデル オブジェクトです。インクリメンタル学習中およびモデルがウォームアップされた後、updateMetrics
は入力観測値でのモデルの性能をチェックし、関数 fit
はモデルをその観測値に当てはめます。
パフォーマンス メトリクスをプロットして、インクリメンタル学習中にそれらがどのように進化するかを確認します。
semilogy(tanloss.Variables) xlim([0 nchunk]) ylabel("Minimal Average Binary Loss") xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,"-.") xlabel("Iteration") legend(tanloss.Properties.VariableNames)
プロットは次のことを示しています。
updateMetrics
は、パフォーマンス メトリクスをメトリクスのウォームアップ期間後にのみ計算します。updateMetrics
は、累積メトリクスを各反復中に計算します。updateMetrics
は、ウィンドウ メトリクスを 2000 個の観測値 (20 回の反復) の処理後に計算します。Mdl
がインクリメンタル学習の初めから観測値を予測するように構成されているため、loss
はデータの入力チャンクごとに最小の平均バイナリ損失を計算できます。
入力引数
インクリメンタル学習用の ECOC 分類モデル。incrementalClassificationECOC
モデル オブジェクトとして指定します。Mdl
は、incrementalClassificationECOC
を直接呼び出して作成することも、サポートされている従来式の学習済み機械学習モデルを関数 incrementalLearner
で変換して作成することもできます。
観測値のバッチでラベルを予測するように Mdl
を構成しなければなりません。
Mdl
が従来式の学習済みモデルから変換されたモデルの場合、いかなる修正も行うことなくラベルを予測できます。それ以外の場合、
fit
またはupdateMetricsAndFit
を使用してMdl
をデータに当てはめる必要があります。
予測子データのバッチ。n 個の観測値と Mdl.NumPredictors
個の予測子変数で構成される浮動小数点行列として指定します。名前と値の引数 ObservationsIn
の値は、変数と観測値の方向を決定します。ObservationsIn
の既定値は "rows"
であり、予測子データの観測値が X
の行に沿うことを示しています。
観測値のラベル Y
の長さと X
の観測値の数は同じでなければなりません。Y(
は j
)X
内の観測値 j (行または列) のラベルです。
データ型: single
| double
ラベルのバッチ。categorical 配列、文字配列、string 配列、logical ベクトル、浮動小数点ベクトル、または文字ベクトルの cell 配列として指定します。
観測値のラベル Y
の長さと X
の観測値の数は同じでなければなりません。Y(
は j
)X
内の観測値 j (行または列) のラベルです。
Y
が Mdl.ClassNames
のメンバーではないラベルを含む場合、関数 loss
はエラーを生成します。Y
と Mdl.ClassNames
のデータ型は同じでなければなりません。
データ型: char
| string
| cell
| categorical
| logical
| single
| double
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで、Name
は引数名で、Value
は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
例: BinaryLoss="quadratic",Decoding="lossbased"
は、バイナリ学習器の損失関数として 2 次関数を使用し、損失に基づく復号化方式をバイナリ損失の集計に使用するよう指定します。
バイナリ学習器損失関数。組み込みの損失関数の名前または関数ハンドルとして指定します。
次の表で、組み込み関数について説明します。ここで、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 モデルのテスト標本ラベルの予測を参照してください。この例は従来式の学習済みモデルの例です。この例で示しているように、インクリメンタル学習用のカスタム損失関数を定義できます。
詳細については、バイナリ損失を参照してください。
データ型: char
| string
| function_handle
復号化方式。"lossweighted"
または "lossbased"
として指定します。
ソフトウェアでバイナリ損失をどのように集計して各観測値の予測クラスを判定するかは、ECOC モデルの復号化方式で指定します。ソフトウェアでは 2 つの復号化方式をサポートしています。
"lossweighted"
— 観測値の予測クラスは、バイナリ学習器におけるバイナリ損失の合計が最小になるクラスに対応します。"lossbased"
— 観測値の予測クラスは、バイナリ学習器におけるバイナリ損失の平均が最小になるクラスに対応します。
詳細については、バイナリ損失を参照してください。
例: Decoding="lossbased"
データ型: char
| string
損失関数。"classiferror"
(分類誤差) またはカスタム損失関数の関数ハンドルとして指定します。
カスタム損失関数を指定するには、関数ハンドル表記を使用します。関数は次の形式でなければなりません。
lossval = lossfcn(C,S,W)
出力引数
lossval
は n 行 1 列の浮動小数点ベクトルです。n はX
内の観測値の個数です。lossval(
の値は観測値j
)
の分類損失です。j
関数名 (
) を指定します。lossfcn
C
は n 行 K 列の logical 行列であり、対応する観測値が属するクラスを各行が示します。K
は異なるクラスの個数 (numel(Mdl.ClassNames)
) で、列の順序はClassNames
プロパティのクラスの順序に対応します。C
を作成するには、指定されたデータの各観測値について観測値
がクラスp
に属する場合にq
C(
=p
,q
)1
を設定します。行
の他の要素をp
0
に設定します。S
は、予測分類スコアの n 行 K 列の数値行列です。S
はpredict
の出力NegLoss
に似ています。ここで、行はデータの観測値に対応し、列の順序はClassNames
プロパティのクラスの順序に対応しています。S(
は、クラスp
,q
)
に分類されている観測値q
の分類スコアです。p
W
は、観測値の重みの n 行 1 列の数値ベクトルです。
例: LossFun=@
lossfcn
データ型: char
| string
| function_handle
予測子データにおける観測値の次元。"rows"
または "columns"
として指定します。
例: ObservationsIn="columns"
データ型: char
| string
観測値の重みのバッチ。正の値の浮動小数点ベクトルとして指定します。loss
は、Weights
内の対応する値を使用して入力データ内の観測値に重みを付けます。Weights
のサイズは入力データ内の観測値の数 n と同じでなければなりません。
既定では Weights
は ones(
です。n
,1)
詳細については、観測値の重みを参照してください。
例: Weights=W
は、観測値の重みをベクトル W
として指定します。
データ型: double
| single
出力引数
分類損失。数値スカラーとして返されます。L
はモデルの品質を示す尺度です。解釈は損失関数と加重スキームによって異なります。
詳細
"分類誤差" は次のような形式になります。
ここで
wj は観測値 j の重みです。重みは再度正規化され、合計は 1 になります。
観測 j の予測クラスが真のクラスと異なる場合、ej = 1 になり、それ以外の場合は 0 になります。
つまり、分類誤差は、分類器が誤分類した観測値の比率です。
"バイナリ損失" は、バイナリ学習器がどの程度の精度で観測値をクラスに分類するかを決定する、クラスと分類スコアの関数です。ソフトウェアでバイナリ損失をどのように集計して各観測値の予測クラスを判定するかは、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
により指定) とバイナリ損失を混同しないでください。
アルゴリズム
事前クラス確率分布が既知の場合 (つまり、事前分布が経験分布でない場合)、loss
は、観測値の重みを正規化して、それぞれのクラスの事前クラス確率の合計になるようにします。このアクションは、既定の観測値の重みがそれぞれの事前クラス確率であることを前提としています。
クラスの事前確率分布が経験分布の場合、ソフトウェアは、loss
が呼び出されるたびに、指定された観測値の重みを正規化して、合計が 1 になるようにします。
参照
[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.
拡張機能
使用上の注意および制限:
saveLearnerForCoder
、loadLearnerForCoder
およびcodegen
(MATLAB Coder) を使用して、関数loss
のコードを生成します。saveLearnerForCoder
を使用して、学習済みモデルを保存します。loadLearnerForCoder
を使用して保存済みモデルを読み込んで関数loss
を呼び出す、エントリポイント関数を定義します。次に、codegen
を使用して、エントリポイント関数のコードを生成します。loss
の単精度の C/C++ コードを生成するには、loadLearnerForCoder
関数を呼び出すときにDataType="single"
を指定します。浮動小数点の入力引数およびオブジェクト プロパティには、すべて同質なデータ型を使用します。具体的には、
single
またはdouble
のいずれかです。次の表は、
loss
の引数に関する注意です。この表に含まれていない引数は、完全にサポートされています。引数 注意と制限 Mdl
モデル オブジェクトの使用上の注意および制限については、
incrementalClassificationECOC
を参照してください。X
バッチ間の観測値の数は可変サイズにすることができますが、対応する
Y
の観測値の数と等しくなければなりません。予測子変数の数は
Mdl.NumPredictors
と等しくなければなりません。X
はsingle
またはdouble
でなければなりません。
Y
バッチ間の観測値の数は可変サイズにすることができますが、対応する
X
の観測値の数と等しくなければなりません。分類問題では、
Y
のすべてのラベルがMdl.ClassNames
に含まれていなければなりません。Y
とMdl.ClassNames
は同じデータ型でなければなりません。
"LossFun"
指定する関数を無名関数にすることはできません。
詳細は、コード生成の紹介を参照してください。
バージョン履歴
R2022a で導入
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)