最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。
学習で使用しない観測値の分類損失
は、1 つ以上の L
= kfoldLoss(CVMdl
,Name,Value
)Name,Value
引数のペアによって指定された追加オプションを使用します。たとえば、復号化方式、損失の計算に使用する分割、詳細レベルなどを指定します。
CVMdl
— 線形分類モデルから構成される交差検証済みの ECOC モデルClassificationPartitionedLinearECOC
モデル オブジェクト線形分類モデルから構成される交差検証済みの ECOC モデル。ClassificationPartitionedLinearECOC
モデル オブジェクトを指定します。ClassificationPartitionedLinearECOC
モデルを作成するには、fitcecoc
を使用し、以下を行います。
交差検証用の名前と値のペアの引数のいずれか 1 つ (CrossVal
など) を指定
名前と値のペアの引数 Learners
を、'linear'
に、または templateLinear
によって返される線形分類モデル テンプレートに設定
推定値を取得するため、kfoldLoss は ECOC モデルの交差検証に使用したものと同じデータ (X
および Y
) を適用します。
オプションの Name,Value
引数のコンマ区切りペアを指定します。Name
は引数名で、Value
は対応する値です。Name
は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN
のように、複数の名前と値のペアの引数を、任意の順番で指定できます。
'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 行 L 列のコーディング行列です。
s
は、1 行 L 列の分類スコアの行ベクトルです。
bLoss
は分類損失です。このスカラーは、特定のクラスのすべての学習器についてバイナリ損失を集計します。たとえば、平均バイナリ損失を使用して、各クラスの学習器の損失を集計できます。
K は、クラスの数です。
L は、バイナリ学習器の数です。
カスタムなバイナリ損失関数を渡す例については、カスタム バイナリ損失関数の使用による 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'
(既定値) | 関数ハンドル損失関数。'LossFun'
および関数ハンドルまたは 'classiferror'
のいずれかで構成されるコンマ区切りのペアとして指定します。
次が可能です。
組み込み関数 '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
に対する分類損失です。
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 = classreg.learning.classif.CompactClassificationECOC ResponseName: 'Y' ClassNames: [comm dsp simulink others] ScoreTransform: 'none' BinaryLearners: {6x1 cell} CodingMatrix: [4x6 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.0243
ceFold = kfoldLoss(CVMdl,'LossFun',lossfun,'Mode','individual')
ceFold = 5×1
0.0244
0.0255
0.0248
0.0240
0.0226
ロジスティック回帰学習器を使用する線形分類モデルから構成される 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 = classreg.learning.classif.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.3125 -0.3596 -0.3596 -0.3596 -0.3596 -0.3596 -0.1593 -0.0737 -0.1759 -0.3452 -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
に渡します。
"バイナリ損失" は、バイナリ学習器がどの程度の精度で観測値をクラスに分類するかを判断する、クラスと分類スコアの関数です。
以下のように仮定します。
mkj は符号化設計行列 M の要素 (k,j)、つまりバイナリ学習器 j のクラス k に対応するコード。
sj は観測値に対するバイナリ学習器 j のスコア。
g はバイナリ損失関数。
は観測値の予測クラス。
"損失に基づく復号化" [Escalera 他] では、バイナリ学習器全体のバイナリ損失の和が最小になるクラスにより、観測値の予測クラスが決まります。つまり、次のようになります。
"損失に重みを付けた復号化" [Escalera 他] では、バイナリ学習器全体のバイナリ損失の平均が最小になるクラスにより、観測値の予測クラスが決まります。つまり、次のようになります。
Allwein 他によると、すべてのクラスで損失値が同じ動的範囲に収まるので、損失に重みを付けた復号化では分類精度が向上します。
次の表は、サポートされる損失関数をまとめています。ここで、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 になるように正規化され、バイナリ学習器の平均を使用して集計されます [Allwein 他]。
ECOC 分類器の全体的な性能の尺度である全体の分類損失 (オブジェクト関数 loss
および predict
の名前と値のペアの引数 'LossFun'
により指定) とバイナリ損失を混同しないでください。
"分類誤差" はバイナリ分類誤差の尺度で、次のような形式になります。
ここで
wj は観測値 j の重みです。重みは再度正規化され、合計は 1 になります。
観測 j の予測クラスが真のクラスと異なる場合、ej = 1 になり、それ以外の場合は 0 になります。
つまり、分類誤差は、分類器が誤分類した観測値の比率です。
[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. “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.
[3] Escalera, S., O. Pujol, and P. Radeva. “Separability of ternary codes for sparse designs of error-correcting output codes.” Pattern Recogn. Vol. 30, Issue 3, 2009, pp. 285–297.
並列実行するには、'UseParallel'
オプションを true
に設定します。
statset
を使用してオプション構造体の 'UseParallel'
フィールドを true
に設定し、この関数を呼び出すときに名前と値のペアの引数 'Options'
を指定します。
たとえば、次のようにします。'Options',statset('UseParallel',true)
詳細は、名前と値のペアの引数 'Options'
を参照してください。
並列計算の全般的な情報については、自動並列サポートを使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
ClassificationECOC
| ClassificationLinear
| ClassificationPartitionedLinearECOC
| fitcecoc
| kfoldPredict
| loss
| statset
A modified version of this example exists on your system. Do you want to open this version instead? (ja_JP)
MATLAB のコマンドを実行するリンクがクリックされました。
このリンクは、Web ブラウザーでは動作しません。MATLAB コマンド ウィンドウに以下を入力すると、このコマンドを実行できます。
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: .
Select web siteYou can also select a web site from the following list:
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.