kfoldLoss
交差検証済み分類モデルの分類損失
説明
例
交差検証分類誤差の推定
ionosphere
データセットを読み込みます。
load ionosphere
分類木を成長させます。
tree = fitctree(X,Y);
10 分割交差検証を使用して分類木を交差検証します。
cvtree = crossval(tree);
交差検証分類誤差を推定します。
L = kfoldLoss(cvtree)
L = 0.1083
交差検証分類誤差の推定
ionosphere
データセットを読み込みます。
load ionosphere
AdaBoostM1 を使用して、100 本の決定木によるアンサンブル分類に学習をさせます。弱学習器として木の切り株を指定します。
t = templateTree('MaxNumSplits',1); ens = fitcensemble(X,Y,'Method','AdaBoostM1','Learners',t);
10 分割交差検証を使用してアンサンブルを交差検証します。
cvens = crossval(ens);
交差検証分類誤差を推定します。
L = kfoldLoss(cvens)
L = 0.0655
kfoldLoss
を使用した GAM の最適な木の数の特定
交差検証済みの 10 分割の一般化加法モデル (GAM) に学習させます。その後、kfoldLoss
を使用して交差検証の累積分類誤差 (10 進数の誤分類率) を計算します。誤差を使用して、予測子 (予測子の線形項) あたりの最適な木の数と交互作用項あたりの最適な木の数を特定します。
代わりに、名前と値の引数OptimizeHyperparametersを使用して fitcgam
の名前と値の引数の最適な値を特定することもできます。例については、OptimizeHyperparameters を使用した GAM の最適化を参照してください。
ionosphere
データセットを読み込みます。このデータセットには、レーダー反射についての 34 個の予測子と、不良 ('b'
) または良好 ('g'
) という 351 個の二項反応が含まれています。
load ionosphere
既定の交差検証オプションを使用して交差検証済み GAM を作成します。名前と値の引数 'CrossVal'
を 'on'
として指定します。p 値が 0.05 以下である利用可能な交互作用項をすべて含めるように指定します。
rng('default') % For reproducibility CVMdl = fitcgam(X,Y,'CrossVal','on','Interactions','all','MaxPValue',0.05);
'Mode'
を 'cumulative'
として指定すると、関数 kfoldLoss
は累積誤差を返します。これは、各分割に同じ数の木を使用して取得したすべての分割の平均誤差です。各分割の木の数を表示します。
CVMdl.NumTrainedPerFold
ans = struct with fields:
PredictorTrees: [65 64 59 61 60 66 65 62 64 61]
InteractionTrees: [1 2 2 2 2 1 2 2 2 2]
kfoldLoss
では、最大で 59 個の予測子木と 1 個の交互作用木を使用して累積誤差を計算できます。
10 分割交差検証を行った累積分類誤差 (10 進数の誤分類率) をプロットします。'IncludeInteractions'
を false
として指定して、計算から交互作用項を除外します。
L_noInteractions = kfoldLoss(CVMdl,'Mode','cumulative','IncludeInteractions',false); figure plot(0:min(CVMdl.NumTrainedPerFold.PredictorTrees),L_noInteractions)
L_noInteractions
の最初の要素は、切片 (定数) 項のみを使用して取得したすべての分割の平均誤差です。L_noInteractions
の (J+1
) 番目の要素は、切片項と各線形項の最初の J
個の予測子木を使用して取得した平均誤差です。累積損失をプロットすると、GAM の予測子木の数が増えるにつれて誤差がどのように変化するかを観察できます。
最小誤差とその最小誤差の達成時に使用された予測子木の数を調べます。
[M,I] = min(L_noInteractions)
M = 0.0655
I = 23
GAM に 22 個の予測子木が含まれるときに誤差が最小になっています。
線形項と交互作用項の両方を使用して累積分類誤差を計算します。
L = kfoldLoss(CVMdl,'Mode','cumulative')
L = 2×1
0.0712
0.0712
L
の最初の要素は、切片 (定数) 項と各線形項のすべての予測子木を使用して取得したすべての分割の平均誤差です。L
の 2 番目の要素は、切片項、各線形項のすべての予測子木、および各交互作用項の 1 つの交互作用木を使用して取得した平均誤差です。交互作用項を追加しても誤差は小さくなっていません。
予測子木の数が 22 個のときの誤差で問題がなければ、一変量の GAM にもう一度学習させ、交差検証を使用せずに 'NumTreesPerPredictor',22
と指定して予測モデルを作成できます。
入力引数
CVMdl
— 交差検証された分割済みの分類器
ClassificationPartitionedModel
オブジェクト | ClassificationPartitionedEnsemble
オブジェクト | ClassificationPartitionedGAM
オブジェクト
交差検証された分割済みの分類器。ClassificationPartitionedModel
オブジェクト、ClassificationPartitionedEnsemble
オブジェクトまたは ClassificationPartitionedGAM
オブジェクトを指定します。オブジェクトは 2 つの方法で作成できます。
次の表に記載されている学習済み分類モデルをそのオブジェクト関数
crossval
に渡す。次の表に記載されている関数を使用して分類モデルに学習をさせ、その関数の交差検証に関する名前と値の引数のいずれかを指定する。
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
例: kfoldLoss(CVMdl,'Folds',[1 2 3 5])
は、分類損失の計算に 1 番目、2 番目、3 番目、および 5 番目の分割を使用し、4 番目の分割は除外するように指定します。
Folds
— 使用する分割のインデックス
1:CVMdl.KFold
(既定値) | 正の整数ベクトル
使用する分割のインデックス。正の整数ベクトルとして指定します。Folds
の要素は 1
から CVMdl.KFold
の範囲でなければなりません。
Folds
で指定された分割のみが使用されます。
例: 'Folds',[1 4 10]
データ型: single
| double
IncludeInteractions
— 交互作用項を含むというフラグ
true
| false
モデルの交互作用項を含むというフラグ。true
または false
として指定します。この引数は、一般化加法モデル (GAM) の場合のみ有効です。つまり、この引数を指定できるのは、CVMdl
が ClassificationPartitionedGAM
である場合だけです。
CVMdl
のモデル (CVMdl.Trained
) に交互作用項が含まれる場合、既定値は true
です。モデルに交互作用項が含まれない場合、値は false
でなければなりません。
データ型: logical
LossFun
— 損失関数
'binodeviance'
| 'classifcost'
| 'classiferror'
| 'crossentropy'
| 'exponential'
| 'hinge'
| 'logit'
| 'mincost'
| 'quadratic'
| 関数ハンドル
損失関数。組み込みの損失関数名または関数ハンドルを指定します。既定の損失関数は、モデル CVMdl
のタイプによって異なります。
モデル タイプがアンサンブルまたはサポート ベクター マシン分類器の場合、既定値は
'classiferror'
です。モデル タイプが判別分析、k 最近傍、単純ベイズ、ニューラル ネットワーク、または木分類器の場合、既定値は
'mincost'
です。モデル タイプが一般化加法モデル分類器の場合、入力モデル オブジェクト (
) のCVMdl
.ScoreTransformScoreTransform
プロパティが'logit'
であれば既定値は'mincost'
、それ以外であれば既定値は'classiferror'
です。
'classiferror'
と 'mincost'
は、既定のコスト行列を使用する場合は同じです。詳細については、アルゴリズムを参照してください。
次の表は、使用できる損失関数の一覧です。対応する文字ベクトルまたは string スカラーを使用して、いずれかを指定します。
値 説明 'binodeviance'
二項分布からの逸脱度 'classifcost'
観測誤分類コスト 'classiferror'
10 進数の誤分類率 'crossentropy'
クロスエントロピー損失 (ニューラル ネットワークの場合のみ) 'exponential'
指数損失 'hinge'
ヒンジ損失 'logit'
ロジスティック損失 'mincost'
最小予測誤分類コスト (事後確率である分類スコアの場合) 'quadratic'
二次損失 'mincost'
は、事後確率である分類スコアに適しています。判別分析、一般化加法モデル、k 最近傍、単純ベイズ、ニューラル ネットワーク、および木分類器の関数predict
とkfoldPredict
は、そのようなスコアを既定で返します。'Bag'
または'Subspace'
のメソッドを使用するアンサンブル モデルの場合、分類スコアは既定で事後確率になります。'AdaBoostM1'
、'AdaBoostM2'
、GentleBoost
、または'LogitBoost'
のメソッドを使用するアンサンブル モデルの場合は、ダブルロジットのスコア変換を指定することで事後確率を分類スコアとして使用できます。たとえば、次のように入力します。他のすべてのアンサンブル法の場合、事後確率は分類スコアとしてサポートされていません。CVMdl.ScoreTransform = 'doublelogit';
SVM モデルの場合、
fitcsvm
を使用してモデルを交差検証するときに'FitPosterior',true
を設定することで、事後確率を分類スコアとして使用するように指定できます。
関数ハンドル表記を使用して独自の関数を指定します。
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
の出力引数score
に似ています。W
は、観測値の重みのn
行 1 列の数値ベクトルです。W
を渡す場合、その要素は正規化され、合計が1
になります。Cost
は、誤分類コストの、K
行K
列の数値行列です。たとえば、Cost = ones(K) – eye(K)
は、正しい分類のコストとして0
を、誤分類のコストとして1
を指定します。
'LossFun',@
を使用して独自の関数を指定します。lossfun
損失関数の詳細については、分類損失を参照してください。
例: 'LossFun','hinge'
データ型: char
| string
| function_handle
Mode
— 出力の集約レベル
'average'
(既定値) | 'individual'
| 'cumulative'
出力の集約レベル。'average'
、'individual'
、または 'cumulative'
として指定します。
値 | 説明 |
---|---|
'average' | 出力は、すべての分割の平均を表すスカラー値です。 |
'individual' | 出力は、分割ごとに 1 つずつの値が含まれている長さ k のベクトルです。k は分割数です。 |
'cumulative' | メモ この値を指定する場合、
|
例: 'Mode','individual'
出力引数
L
— 分類損失
数値スカラー | 数値列ベクトル
分類損失。数値スカラーまたは数値列ベクトルとして返されます。
Mode
が'average'
である場合、L
はすべての分割の平均分類損失です。Mode
が'individual'
である場合、L
は各分割の分類損失が含まれている k 行 1 列の数値列ベクトルです。k は分割数です。Mode
が'cumulative'
でCVMdl
がClassificationPartitionedEnsemble
である場合、L
はmin(CVMdl.NumTrainedPerFold)
行 1 列の数値列ベクトルです。各要素j
は、弱学習器1:j
で学習させたアンサンブルを使用して取得したすべての分割の平均分類損失です。Mode
が'cumulative'
でCVMdl
がClassificationPartitionedGAM
の場合、出力の値はIncludeInteractions
の値によって異なります。IncludeInteractions
がfalse
の場合、L
は(1 + min(NumTrainedPerFold.PredictorTrees))
行 1 列の数値列ベクトルです。L
の最初の要素は、切片 (定数) 項のみを使用して取得したすべての分割の平均分類損失です。L
の(j + 1)
番目の要素は、切片項と各線形項の最初のj
個の予測子木を使用して取得した平均損失です。IncludeInteractions
がtrue
の場合、L
は(1 + min(NumTrainedPerFold.InteractionTrees))
行 1 列の数値列ベクトルです。L
の最初の要素は、切片 (定数) 項と各線形項のすべての予測子木を使用して取得したすべての分割の平均分類損失です。L
の(j + 1)
番目の要素は、切片項、各線形項のすべての予測子木、および各交互作用項の最初のj
個の交互作用木を使用して取得した平均損失です。
詳細
分類損失
"分類損失" 関数は分類モデルの予測誤差を評価します。複数のモデルで同じタイプの損失を比較した場合、損失が低い方が予測モデルとして優れていることになります。
以下のシナリオを考えます。
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) を通過するように正規化されています。
アルゴリズム
kfoldLoss
は、対応するオブジェクト関数 loss
で説明されているように、分類損失を計算します。モデル固有の説明については、次の表に示す該当する関数 loss
のリファレンス ページを参照してください。
拡張機能
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
使用上の注意事項および制限事項:
この関数は、次の交差検証済みモデル オブジェクトの GPU 配列を完全にサポートします。
fitcensemble
で学習させたアンサンブル分類器fitcknn
で学習させた k 最近傍分類器fitcsvm
で学習させたサポート ベクター マシン分類器fitctree
で学習させたマルチクラス分類用の二分決定木
詳細は、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2011a で導入R2022a: 既定以外のコスト行列をもつ交差検証 SVM およびアンサンブル分類器に対して kfoldLoss
で異なる値が返される
SVM またはアンサンブル分類モデルの入力モデル オブジェクトを交差検証するときに既定以外のコスト行列を指定すると、関数 kfoldLoss
で以前のリリースとは異なる値が返されます。
関数 kfoldLoss
は、W
プロパティに格納された観測値の重みを使用します。さらに、名前と値の引数 LossFun
を "classifcost"
または "mincost"
として指定した場合、関数は Cost
プロパティに格納されたコスト行列を使用します。W
プロパティと Cost
プロパティの値を関数で使用する方法については変更されていません。ただし、既定以外のコスト行列をもつ交差検証 SVM およびアンサンブル モデル オブジェクトについて入力モデル オブジェクトに格納されるプロパティの値が変更されたため、関数から異なる値が返されることがあります。
プロパティの値の変更に関する詳細については、Cost プロパティにユーザー指定のコスト行列を格納 (交差検証 SVM 分類器) またはCost プロパティにユーザー指定のコスト行列を格納 (交差検証アンサンブル分類器) を参照してください。
ソフトウェアでコスト行列、事前確率、および観測値の重みを以前のリリースと同じように扱う場合は、誤分類コスト行列に応じた事前確率と観測値の重みの調整の説明に従って、既定以外のコスト行列の事前確率と観測値の重みを調整します。その後、分類モデルに学習させるときに、調整後の事前確率と観測値の重みを名前と値の引数 Prior
と Weights
を使用して指定し、既定のコスト行列を使用します。
R2022a: 交差検証 GAM およびニューラル ネットワーク分類器に対する LossFun
の既定値の変更
R2022a 以降では、一般化加法モデル (GAM) とニューラル ネットワーク モデルの両方について、名前と値の引数 LossFun
の既定値が変更され、交差検証分類オブジェクトで事後確率を分類スコアに使用する場合に関数 kfoldLoss
が "mincost"
オプション (最小予測誤分類コスト) を既定で使用するようになりました。
入力モデル オブジェクト
CVMdl
のモデル タイプが GAM 分類器の場合、CVMdl
(
) のCVMdl
.ScoreTransformScoreTransform
プロパティが'logit'
であれば既定値は"mincost"
、それ以外であれば既定値は"classiferror"
です。CVMdl
のモデル タイプがニューラル ネットワーク モデル分類器の場合、"mincost"
です。
以前のリリースでは、既定値は '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)