kfoldLoss
学習で使用しない観測値の分類損失
説明
は、1 つ以上の L
= kfoldLoss(CVMdl
,Name,Value
)Name,Value
引数のペアによって指定された追加オプションを使用します。たとえば、復号化方式、損失の計算に使用する分割、詳細レベルなどを指定します。
入力引数
CVMdl
— 線形分類モデルから構成される交差検証済みの ECOC モデル
ClassificationPartitionedLinearECOC
モデル オブジェクト
線形分類モデルから構成される交差検証済みの ECOC モデル。ClassificationPartitionedLinearECOC
モデル オブジェクトとして指定します。ClassificationPartitionedLinearECOC
モデルを作成するには、fitcecoc
を使用し、以下を行います。
交差検証用の名前と値のペアの引数のいずれか 1 つ (
CrossVal
など) を指定名前と値のペアの引数
Learners
を、'linear'
に、またはtemplateLinear
によって返される線形分類モデル テンプレートに設定
推定値を取得するため、kfoldLoss は ECOC モデルの交差検証に使用したものと同じデータ (X
および Y
) を適用します。
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
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 になるように正規化されます。また、各クラスについて平均のバイナリ損失が計算されます。
カスタム バイナリ損失関数、たとえば
customFunction
は関数ハンドル'BinaryLoss',@customFunction
を指定します。customFunction
は以下のような形式になります。ここで、bLoss = customFunction(M,s)
M
はMdl.CodingMatrix
に格納された K 行 B 列の符号化行列です。s
は 1 行 B 列の分類スコアの行ベクトルです。bLoss
は分類損失です。このスカラーは、特定のクラスのすべての学習器についてバイナリ損失を集計します。たとえば、平均バイナリ損失を使用して、各クラスの学習器の損失を集計できます。K は、クラスの数です。
B はバイナリ学習器の数です。
カスタムなバイナリ損失関数を渡す例については、カスタム バイナリ損失関数の使用による ECOC モデルのテスト標本ラベルの予測を参照してください。
既定の設定では、すべてのバイナリ学習器が以下を使用する線形分類モデルである場合、次のようになります。
SVM の場合、
BinaryLoss
は'hinge'
になります。ロジスティック回帰の場合、
BinaryLoss
は'quadratic'
になります。
例: 'BinaryLoss','binodeviance'
データ型: char
| string
| function_handle
Decoding
— 復号化スキーム
'lossweighted'
(既定値) | 'lossbased'
バイナリ損失を集計する復号化方式。'Decoding'
と 'lossweighted'
または 'lossbased'
から構成されるコンマ区切りのペアとして指定します。詳細については、バイナリ損失を参照してください。
例: 'Decoding','lossbased'
Folds
— 分類スコアの予測に使用する分割のインデックス
1:CVMdl.KFold
(既定値) | 正の整数の数値ベクトル
分類スコアの予測に使用する分割のインデックス。'Folds'
と正の整数の数値ベクトルから構成されるコンマ区切りのペアとして指定します。Folds
の要素は 1
から CVMdl.KFold
の範囲でなければなりません。
例: 'Folds',[1 4 10]
データ型: single
| double
LossFun
— 損失関数
'classiferror'
(既定値) | 'classifcost'
| 関数ハンドル
損失関数。'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
を使用して独自の関数を指定します。
データ型: function_handle
| char
| string
Mode
— 損失の集約レベル
'average'
(既定値) | 'individual'
損失の集約レベル。'Mode'
と 'average'
または 'individual'
から構成されるコンマ区切りのペアとして指定します。
値 | 説明 |
---|---|
'average' | 分割全体で平均した損失を返す |
'individual' | 各分割について損失を返す |
例: 'Mode','individual'
Options
— 推定オプション
[]
(既定値) | statset
によって返される構造体配列
推定オプション。statset
により返される 'Options'
と構造体配列から構成されるコンマ区切りのペアとして指定します。
並列計算を起動するには、以下を行います。
Parallel Computing Toolbox™ ライセンスが必要です。
'Options',statset('UseParallel',true)
を指定します。
Verbose
— 詳細レベル
0
(既定値) | 1
詳細レベル。'Verbose'
と 0
または 1
から構成されるコンマ区切りのペアとして指定します。Verbose
は、コマンド ウィンドウに表示される診断メッセージの量を制御します。
Verbose
が 0
の場合、診断メッセージは表示されません。それ以外の場合は、診断メッセージが表示されます。
例: 'Verbose',1
データ型: single
| double
出力引数
L
— 交差検証分類損失
数値スカラー | 数値ベクトル | 数値行列
交差検証分類損失。数値スカラー、ベクトルまたは行列として返されます。L
の解釈は LossFun
によって異なります。
交差検証済みモデルの正則化強度の数 (CVMdl.Trained{1}.BinaryLearners{1}.Lambda
) を R
、分割数 (CVMdl.KFold
に格納) を F
とします。
Mode
が'average'
の場合、L
は 1 行R
列のベクトルになります。L(
は、正則化強度j
)j
を使用する交差検証済みモデルのすべての分割に対する平均分類損失です。それ以外の場合、
L
はF
行R
列の行列になります。L(
は、正則化強度i
,j
)j
を使用する交差検証済みモデルの分割i
に対する分類損失です。
例
k 分割交差検証の分類誤差の推定
NLP のデータ セットを読み込みます。
load nlpdata
X
は予測子データのスパース行列、Y
はクラス ラベルの categorical ベクトルです。
線形分類モデルから構成されている ECOC モデルを交差検証します。
rng(1); % For reproducibility CVMdl = fitcecoc(X,Y,'Learner','linear','CrossVal','on');
CVMdl
は ClassificationPartitionedLinearECOC
モデルです。既定では、10 分割交差検証が実行されます。
分割外分類誤差率の平均を推定します。
ce = kfoldLoss(CVMdl)
ce = 0.0958
または、名前と値のペアの引数 'Mode','individual'
を kfoldLoss
で指定することにより、分割ごとの分類誤差率を取得できます。
カスタムな分類損失の指定
NLP のデータ セットを読み込みます。予測子データを転置します。
load nlpdata
X = X';
簡単にするため、'simulink'
、'dsp'
、'comm'
のいずれでもない Y
の観測値すべてに対して 'others' というラベルを使用します。
Y(~(ismember(Y,{'simulink','dsp','comm'}))) = 'others';
SpaRSA を使用して目的関数を最適化するように指定する線形分類モデル テンプレートを作成します。
t = templateLinear('Solver','sparsa');
5 分割の交差検証を使用して、線形分類モデルから構成されている ECOC モデルを交差検証します。SpaRSA を使用して目的関数を最適化します。予測子の観測値が列に対応することを指定します。
rng(1); % For reproducibility CVMdl = fitcecoc(X,Y,'Learners',t,'KFold',5,'ObservationsIn','columns'); CMdl1 = CVMdl.Trained{1}
CMdl1 = CompactClassificationECOC ResponseName: 'Y' ClassNames: [comm dsp simulink others] ScoreTransform: 'none' BinaryLearners: {6x1 cell} CodingMatrix: [4x6 double]
CVMdl
は ClassificationPartitionedLinearECOC
モデルです。このモデルに含まれている Trained
プロパティは、各分割の学習セットを使用して学習させた CompactClassificationECOC
モデルを格納する 5 行 1 列の cell 配列です。
各観測値の最小損失を取る関数を作成し、すべての観測値の最小損失を平均化します。この関数ではクラス識別行列 (C
)、観測値の重み (W
)、および分類コスト (Cost
) を使用しないので、~
を使用して kfoldLoss
にそれらの位置を無視させます。
lossfun = @(~,S,~,~)mean(min(-S,[],2));
観測値ごとの最小損失を求める関数を使用して、平均の交差検証分類損失を推定します。また、各分割の損失を取得します。
ce = kfoldLoss(CVMdl,'LossFun',lossfun)
ce = 0.0485
ceFold = kfoldLoss(CVMdl,'LossFun',lossfun,'Mode','individual')
ceFold = 5×1
0.0488
0.0511
0.0496
0.0479
0.0452
交差検証の使用による適切な LASSO ペナルティの特定
ロジスティック回帰学習器を使用する線形分類モデルから構成される ECOC モデルに適した LASSO ペナルティの強度を決定するため、5 分割の交差検証を実装します。
NLP のデータ セットを読み込みます。
load nlpdata
X
は予測子データのスパース行列、Y
はクラス ラベルの categorical ベクトルです。
簡単にするため、'simulink'
、'dsp'
、'comm'
のいずれでもない Y
の観測値すべてに対して 'others' というラベルを使用します。
Y(~(ismember(Y,{'simulink','dsp','comm'}))) = 'others';
~ の範囲で対数間隔で配置された 11 個の正則化強度を作成します。
Lambda = logspace(-7,-2,11);
ロジスティック回帰学習器を使用するように指定する線形分類モデル テンプレートを作成し、Lambda
の強度をもつ LASSO ペナルティを使用し、SpaRSA を使用して学習させ、目的関数の勾配の許容誤差を 1e-8
に下げます。
t = templateLinear('Learner','logistic','Solver','sparsa',... 'Regularization','lasso','Lambda',Lambda,'GradientTolerance',1e-8);
モデルを交差検証します。実行速度を向上させるため、予測子データを転置し、観測値が列単位であることを指定します。
X = X'; rng(10); % For reproducibility CVMdl = fitcecoc(X,Y,'Learners',t,'ObservationsIn','columns','KFold',5);
CVMdl
は ClassificationPartitionedLinearECOC
モデルです。
CVMdl
および格納されている各モデルを分析します。
numECOCModels = numel(CVMdl.Trained)
numECOCModels = 5
ECOCMdl1 = CVMdl.Trained{1}
ECOCMdl1 = CompactClassificationECOC ResponseName: 'Y' ClassNames: [comm dsp simulink others] ScoreTransform: 'none' BinaryLearners: {6×1 cell} CodingMatrix: [4×6 double] Properties, Methods
numCLModels = numel(ECOCMdl1.BinaryLearners)
numCLModels = 6
CLMdl1 = ECOCMdl1.BinaryLearners{1}
CLMdl1 = ClassificationLinear ResponseName: 'Y' ClassNames: [-1 1] ScoreTransform: 'logit' Beta: [34023×11 double] Bias: [-0.3169 -0.3169 -0.3168 -0.3168 -0.3168 -0.3167 -0.1725 -0.0805 -0.1762 -0.3450 -0.5174] Lambda: [1.0000e-07 3.1623e-07 1.0000e-06 3.1623e-06 1.0000e-05 3.1623e-05 1.0000e-04 3.1623e-04 1.0000e-03 0.0032 0.0100] Learner: 'logistic' Properties, Methods
fitcecoc
は 5 分割の交差検証を実装するので、各分割について学習させる CompactClassificationECOC
モデルから構成される 5 行 1 列の cell 配列が CVMdl
に格納されます。各 CompactClassificationECOC
モデルの BinaryLearners
プロパティには ClassificationLinear
モデルが格納されます。各コンパクト ECOC モデル内の ClassificationLinear
モデルの数は、それぞれのラベルの数と符号化設計によって決まります。Lambda
は正則化強度のシーケンスなので、CLMdl1
はそれぞれが Lambda
の各正則化強度に対応する 11 個のモデルであると考えることができます。
各正則化強度について 5 分割分類誤差の平均をプロットすることにより、モデルがどの程度一般化を行うかを判断します。グリッド全体で汎化誤差を最小化する正則化強度を特定します。
ce = kfoldLoss(CVMdl); figure; plot(log10(Lambda),log10(ce)) [~,minCEIdx] = min(ce); minLambda = Lambda(minCEIdx); hold on plot(log10(minLambda),log10(ce(minCEIdx)),'ro'); ylabel('log_{10} 5-fold classification error') xlabel('log_{10} Lambda') legend('MSE','Min classification error') hold off
データ セット全体を使用して線形分類モデルから構成される ECOC モデルに学習をさせ、最小の正則化強度を指定します。
t = templateLinear('Learner','logistic','Solver','sparsa',... 'Regularization','lasso','Lambda',minLambda,'GradientTolerance',1e-8); MdlFinal = fitcecoc(X,Y,'Learners',t,'ObservationsIn','columns');
新しい観測値のラベルを推定するには、MdlFinal
と新しいデータを predict
に渡します。
詳細
分類誤差
"分類誤差" は次のような形式になります。
ここで
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.
拡張機能
自動並列サポート
Parallel Computing Toolbox™ を使用して自動的に並列計算を実行することで、コードを高速化します。
並列実行するには、この関数を呼び出すときに名前と値の引数 Options
を指定し、statset
を使用してオプション構造体の UseParallel
フィールドを true
に設定します。
Options=statset(UseParallel=true)
並列計算の詳細については、自動並列サポートを使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2016a で導入R2023b: 予測子に欠損値がある観測値を再代入と交差検証の計算に使用
R2023b 以降では、次の分類モデルのオブジェクト関数において、予測子に欠損値がある観測値が再代入 ("resub") と交差検証 ("kfold") による分類エッジ、損失、マージン、および予測の計算でその一部として使用されます。
以前のリリースでは、予測子に欠損値がある観測値は再代入と交差検証の計算で省略されていました。
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)