kfoldLoss
交差検証済みカーネル ECOC モデルの分類損失
説明
は、交差検証済みのカーネル ECOC モデル (loss = kfoldLoss(CVMdl)ClassificationPartitionedKernelECOC) CVMdl によって取得した分類損失を返します。kfoldLoss は、すべての分割について、学習分割観測値に対して学習をさせたモデルを使用して、検証分割観測値の分類損失を計算します。kfoldLoss は、CVMdl の作成に使用されたものと同じデータを適用します (fitcecoc を参照)。
既定では、kfoldLoss は分類誤差を返します。
は、1 つ以上の名前と値のペアの引数で指定された追加オプションを使用して、分類損失を返します。たとえば、分類損失関数、分割数、復号化方式または詳細レベルを指定します。loss = kfoldLoss(CVMdl,Name,Value)
例
フィッシャーのアヤメのデータ セットを読み込みます。X には花の測定値が、Y には花の種類の名前が格納されています。
load fisheriris
X = meas;
Y = species;カーネル バイナリ学習器から構成される ECOC モデルを交差検証します。
CVMdl = fitcecoc(X,Y,'Learners','kernel','CrossVal','on')
CVMdl =
ClassificationPartitionedKernelECOC
CrossValidatedModel: 'KernelECOC'
ResponseName: 'Y'
NumObservations: 150
KFold: 10
Partition: [1×1 cvpartition]
ClassNames: {'setosa' 'versicolor' 'virginica'}
ScoreTransform: 'none'
Properties, Methods
CVMdl は ClassificationPartitionedKernelECOC モデルです。既定では、10 分割交差検証が実行されます。異なる分割数を指定するには、'Crossval' ではなく名前と値のペアの引数 'KFold' を指定します。
交差検証分類損失を推定します。既定では、分類誤差が計算されます。
loss = kfoldLoss(CVMdl)
loss = 0.0333
または、名前と値のペアの引数 'Mode','individual' を kfoldLoss で指定することにより、分割ごとの分類誤差を取得できます。
モデルが通常は観測値を正しく分類するかどうかを調べるだけでなく、モデルがどの程度正しく観測値をその予測されたクラスに分類するかを調べることもできます。このタイプのモデルの品質を調べる方法の 1 つは、カスタム損失関数を kfoldLoss に渡すことです。
フィッシャーのアヤメのデータ セットを読み込みます。X には花の測定値が、Y には花の種類の名前が格納されています。
load fisheriris
X = meas;
Y = species;カーネル バイナリ学習器から構成される ECOC モデルを交差検証します。
rng(1) % For reproducibility CVMdl = fitcecoc(X,Y,'Learners','kernel','CrossVal','on')
CVMdl =
ClassificationPartitionedKernelECOC
CrossValidatedModel: 'KernelECOC'
ResponseName: 'Y'
NumObservations: 150
KFold: 10
Partition: [1×1 cvpartition]
ClassNames: {'setosa' 'versicolor' 'virginica'}
ScoreTransform: 'none'
Properties, Methods
CVMdl は ClassificationPartitionedKernelECOC モデルです。既定では、10 分割交差検証が実行されます。異なる分割数を指定するには、'Crossval' ではなく名前と値のペアの引数 'KFold' を指定します。
各観測値の最小損失を受け入れ、すべての観測値の最小損失の平均を求める、カスタム関数を作成します。S は、kfoldPredict の出力 NegLoss に対応します。
lossfun = @(~,S,~,~)mean(min(-S,[],2));
交差検証されたカスタム損失の計算
kfoldLoss(CVMdl,'LossFun',lossfun)ans = 0.0299
検証分割観測値の平均最小バイナリ損失は約 0.02 です。
入力引数
交差検証済みのカーネル ECOC モデル。ClassificationPartitionedKernelECOC モデルを指定します。ClassificationPartitionedKernelECOC モデルは、fitcecoc を使用し、以下の名前と値のペアの引数を指定して、ECOC モデルに学習をさせることにより作成できます。
'Learners'– 値を'kernel'、templateKernelが返すテンプレート オブジェクト、またはこのようなテンプレート オブジェクトの cell 配列に設定します。引数
'CrossVal'、'CVPartition'、'Holdout'、'KFold'、'Leaveout'のいずれか。
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。
例: kfoldLoss(CVMdl,'Folds',[1 3 5]) は、分類損失の計算に 1 番目、3 番目および 5 番目の分割のみを使用することを指定します。
バイナリ学習器の損失関数。'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 はバイナリ学習器の数です。
既定では、すべてのバイナリ学習器が SVM を使用するカーネル分類モデルである場合、BinaryLoss は 'hinge' です。すべてのバイナリ学習器がロジスティック回帰を使用するカーネル分類モデルである場合、BinaryLoss は 'quadratic' です。
例: 'BinaryLoss','binodeviance'
データ型: char | string | function_handle
バイナリ損失を集計する復号化方式。'Decoding' と 'lossweighted' または 'lossbased' から構成されるコンマ区切りのペアとして指定します。詳細は、バイナリ損失を参照してください。
例: 'Decoding','lossbased'
予測の分割インデックス。'Folds' および正の整数の数値ベクトルで構成されるコンマ区切りのペアとして指定します。Folds の要素は 1 から CVMdl.KFold の範囲でなければなりません。
予測用の Folds で指定された分割のみが使用されます。
例: 'Folds',[1 4 10]
データ型: single | double
損失関数。'classiferror'、'classifcost'、または関数ハンドルとして指定します。
組み込み関数
'classiferror'を指定します。この場合、損失関数は分類誤差です。組み込み関数
'classifcost'を指定します。この場合、損失関数は観測誤分類コストです。既定のコスト行列 (正しい分類の場合の要素値は 0、誤った分類の場合の要素値は 1) を使用する場合、'classifcost'と'classiferror'の損失の値は同じです。または、関数ハンドル表記を使用して独自の関数を指定します。
n は学習データの観測値数 (
CVMdl.NumObservations)、K はクラス数 (numel(CVMdl.ClassNames)) であると仮定します。使用する関数ではlossvalue =というシグネチャが必要です。ここでlossfun(C,S,W,Cost)出力引数
lossvalueはスカラーです。関数名 (
lossfun) を指定します。Cは n 行 K 列の logical 行列であり、対応する観測値が属するクラスを各行が示します。列の順序はCVMdl.ClassNamesのクラスの順序に対応します。Cを作成するには、各行について観測値pがクラスqに含まれている場合にC(p,q) = 1を設定します。p行のすべての要素を0に設定します。Sは、符号を反転したクラスの損失値が含まれている n 行 K 列の数値行列です。各列は観測と対応しています。列の順序はCVMdl.ClassNamesのクラスの順序に対応します。入力Sは、kfoldPredictの出力引数NegLossに似ています。Wは、観測値の重みの n 行 1 列の数値ベクトルです。Wを渡す場合、その要素は正規化され、合計が1になります。Costは、誤分類コストの、K 行 K 列の数値行列です。たとえば、Cost=ones(K) – eye(K)は、正しい分類のコストとして 0 を、誤分類のコストとして 1 を指定します。
'LossFun',@lossfunを使用して独自の関数を指定します。
データ型: char | string | function_handle
出力の集約レベル。'Mode' と 'average' または 'individual' から構成されるコンマ区切りのペアとして指定します。
次の表は値を説明します。
| 値 | 説明 |
|---|---|
'average' | 出力は、すべての分割の平均を表すスカラー値です。 |
'individual' | 出力は、分割ごとに 1 つずつの値が含まれている長さ k のベクトルです。k は分割数です。 |
例: 'Mode','individual'
推定オプション。statset によって返される構造体配列として指定します。
並列計算を起動するには、Parallel Computing Toolbox™ ライセンスが必要です。
例: Options=statset(UseParallel=true)
データ型: struct
詳細レベル。0 または 1 として指定します。Verbose は、コマンド ウィンドウに表示される診断メッセージの量を制御します。
Verbose が 0 の場合、診断メッセージは表示されません。それ以外の場合は、診断メッセージが表示されます。
例: Verbose=1
データ型: single | double
出力引数
詳細
"分類誤差" は次のような形式になります。
ここで
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 分類器の全体的な性能の尺度である全体の分類損失 (オブジェクト関数 kfoldLoss および kfoldPredict の名前と値の引数 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.
拡張機能
並列実行するには、この関数を呼び出すときに名前と値の引数 Options を指定し、statset を使用してオプション構造体の UseParallel フィールドを true に設定します。
Options=statset(UseParallel=true)
並列計算の詳細については、自動並列サポートを使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
この関数は、GPU 配列を完全にサポートします。詳細は、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2018b で導入kfoldLoss は、fitcecoc を使用して学習させた ClassificationPartitionedKernelECOC モデルの GPU 配列を完全にサポートします。
R2023b 以降では、次の分類モデルのオブジェクト関数において、予測子に欠損値がある観測値が再代入 ("resub") と交差検証 ("kfold") による分類エッジ、損失、マージン、および予測の計算でその一部として使用されます。
以前のリリースでは、予測子に欠損値がある観測値は再代入と交差検証の計算で省略されていました。
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)