kfoldLoss
学習で使用しない観測値の分類損失
説明
 は、1 つ以上の L = kfoldLoss(CVMdl,Name,Value)Name,Value 引数のペアによって指定された追加オプションを使用します。たとえば、復号化方式、損失の計算に使用する分割、詳細レベルなどを指定します。
入力引数
線形分類モデルから構成される交差検証済みの ECOC モデル。ClassificationPartitionedLinearECOC モデル オブジェクトとして指定します。ClassificationPartitionedLinearECOC モデルを作成するには、fitcecoc を使用し、以下を行います。
交差検証用の名前と値のペアの引数のいずれか 1 つ (
CrossValなど) を指定名前と値のペアの引数
Learnersを、'linear'に、またはtemplateLinearによって返される線形分類モデル テンプレートに設定
推定値を取得するため、kfoldLoss は ECOC モデルの交差検証に使用したものと同じデータ (X および Y) を適用します。
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。 
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。 
バイナリ学習器の損失関数。'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','lossbased'
分類スコアの予測に使用する分割のインデックス。正の整数の数値ベクトルとして指定します。Folds の要素は 1 から CVMdl.KFold の範囲でなければなりません。
例: 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を使用して独自の関数を指定します。
データ型: function_handle | char | string
損失の集約レベル。"average" または "individual" として指定します。
| 値 | 説明 | 
|---|---|
"average" | 分割全体で平均した損失を返す | 
"individual" | 各分割について損失を返す | 
例: Mode="individual"
推定オプション。statset によって返される構造体配列として指定します。
並列計算を起動するには、Parallel Computing Toolbox™ ライセンスが必要です。
例: Options=statset(UseParallel=true)
データ型: struct
詳細レベル。0 または 1 として指定します。Verbose は、コマンド ウィンドウに表示される診断メッセージの量を制御します。
Verbose が 0 の場合、診断メッセージは表示されません。それ以外の場合は、診断メッセージが表示されます。
例: Verbose=1
データ型: single | double
出力引数
交差検証分類損失。数値スカラー、ベクトルまたは行列として返されます。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に対する分類損失です。
例
NLP のデータ セットを読み込みます。
load nlpdataX は予測子データのスパース行列、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: {6×1 cell}
      CodingMatrix: [4×6 double]
  Properties, Methods
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
ロジスティック回帰学習器を使用する線形分類モデルから構成される ECOC モデルに適した LASSO ペナルティの強度を決定するため、5 分割の交差検証を実装します。
NLP のデータ セットを読み込みます。
load nlpdataX は予測子データのスパース行列、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.
拡張機能
並列実行するには、この関数を呼び出すときに名前と値の引数 Options を指定し、statset を使用してオプション構造体の UseParallel フィールドを true に設定します。
Options=statset(UseParallel=true)
並列計算の詳細については、自動並列サポートを使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
この関数は、GPU 配列を完全にサポートします。詳細は、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2016a で導入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)