このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
kfoldLoss
学習で使用しない観測値の分類損失
説明
は、1 つ以上の L
= kfoldLoss(CVMdl
,Name,Value
)Name,Value
引数のペアによって指定された追加オプションを使用します。たとえば、損失の計算に使用する分割や分類損失関数を指定します。
入力引数
CVMdl
— 交差検証済みのバイナリ線形分類モデル
ClassificationPartitionedLinear
モデル オブジェクト
交差検証済みバイナリ線形分類モデル。ClassificationPartitionedLinear
モデル オブジェクトとして指定します。ClassificationPartitionedLinear
モデル オブジェクトを作成するには、fitclinear
を使用し、交差検証用の名前と値のペアの引数のいずれか 1 つ (CrossVal
など) を指定します。
推定値を取得するため、kfoldLoss は線形分類モデルの交差検証に使用したものと同じデータ (X
および Y
) を適用します。
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
Folds
— 分類スコアの予測に使用する分割のインデックス
1:CVMdl.KFold
(既定値) | 正の整数の数値ベクトル
分類スコアの予測に使用する分割のインデックス。'Folds'
と正の整数の数値ベクトルから構成されるコンマ区切りのペアとして指定します。Folds
の要素は 1
から CVMdl.KFold
の範囲でなければなりません。
例: 'Folds',[1 4 10]
データ型: single
| double
LossFun
— 損失関数
'classiferror'
(既定値) | 'binodeviance'
| 'classifcost'
| 'exponential'
| 'hinge'
| 'logit'
| 'mincost'
| 'quadratic'
| 関数ハンドル
損失関数。'LossFun'
と組み込み損失関数名または関数ハンドルから構成されるコンマ区切りのペアとして指定します。
次の表は、使用可能な損失関数の一覧です。対応する文字ベクトルまたは string スカラーを使用して、いずれかを指定します。
値 説明 'binodeviance'
二項分布からの逸脱度 'classifcost'
観測誤分類コスト 'classiferror'
10 進数の誤分類率 'exponential'
指数損失 'hinge'
ヒンジ損失 'logit'
ロジスティック損失 'mincost'
最小予測誤分類コスト (事後確率である分類スコアの場合) 'quadratic'
二次損失 'mincost'
は、事後確率である分類スコアに適しています。線形分類モデルの場合、既定の設定ではロジスティック回帰学習器は事後確率を分類スコアとして返しますが、SVM 学習器はそうではありません (predict
を参照)。関数ハンドル表記を使用して独自の関数を指定します。
n
をX
内の観測値数、K
を異なるクラスの数 (numel(Mdl.ClassNames)
、Mdl
は入力モデル) とします。使用する関数のシグネチャは次のようになっていなければなりません。ここで、lossvalue =
lossfun
(C,S,W,Cost)出力引数
lossvalue
はスカラーです。関数名 (
lossfun
) を選択します。C
はn
行K
列の logical 行列で、行は対応する観測値が属するクラスを示しています。列の順序はMdl.ClassNames
のクラスの順序に対応します。C
を作成するには、各行について観測値p
がクラスq
に含まれている場合にC(p,q) = 1
を設定します。行p
の他のすべての要素を0
に設定します。S
は、分類スコアのn
行K
列の行列です。列の順序はMdl.ClassNames
のクラスの順序に対応します。S
は分類スコアの行列で、predict
の出力と同様です。W
は、観測値の重みのn
行 1 列の数値ベクトルです。W
を渡す場合、要素は正規化され、合計が1
になります。Cost
は、誤分類コストの、K 行K
列の数値行列です。たとえば、Cost = ones(K) - eye(K)
は、正しい分類のコストとして0
を、誤分類のコストとして1
を指定します。
'LossFun',@
を使用して独自の関数を指定します。lossfun
データ型: char
| string
| function_handle
Mode
— 損失の集約レベル
'average'
(既定値) | 'individual'
損失の集約レベル。'Mode'
と 'average'
または 'individual'
から構成されるコンマ区切りのペアとして指定します。
値 | 説明 |
---|---|
'average' | 分割全体で平均した損失を返す |
'individual' | 各分割について損失を返す |
例: 'Mode','individual'
出力引数
L
— 交差検証分類損失
数値スカラー | 数値ベクトル | 数値行列
交差検証分類損失。数値スカラー、ベクトルまたは行列として返されます。L
の解釈は LossFun
によって異なります。
交差検証済みモデルの正則化強度の数 (numel(CVMdl.Trained{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 ベクトルです。データには 2 つを超えるクラスがあります。
モデルでは、ある Web ページの単語数が Statistics and Machine Learning Toolbox™ ドキュメンテーションによるものであるかどうかを識別できなければなりません。したがって、Statistics and Machine Learning Toolbox™ のドキュメンテーション Web ページに対応するラベルを識別します。
Ystats = Y == 'stats';
あるドキュメンテーション Web ページの単語数が Statistics and Machine Learning Toolbox™ ドキュメンテーションによるものであるかどうかを識別できるバイナリ線形分類モデルの交差検証を行います。
rng(1); % For reproducibility CVMdl = fitclinear(X,Ystats,'CrossVal','on');
CVMdl
は ClassificationPartitionedLinear
モデルです。既定では、10 分割交差検証が実行されます。'KFold'
名前と値のペアの引数を使用して分割数を変更できます。
分割外分類誤差率の平均を推定します。
ce = kfoldLoss(CVMdl)
ce = 7.6017e-04
または、名前と値のペアの引数 'Mode','individual'
を kfoldLoss
で指定することにより、分割ごとの分類誤差率を取得できます。
カスタムな分類損失の指定
NLP のデータセットを読み込みます。k 分割交差検証の分類誤差の推定で説明されているようにデータを前処理し、予測子データを転置します。
load nlpdata Ystats = Y == 'stats'; X = X';
5 分割の交差検証を使用してバイナリ線形分類モデルを交差検証します。SpaRSA を使用して目的関数を最適化します。予測子の観測値が列に対応することを指定します。
rng(1) % For reproducibility CVMdl = fitclinear(X,Ystats,'Solver','sparsa','KFold',5, ... 'ObservationsIn','columns'); CMdl = CVMdl.Trained{1};
CVMdl
は ClassificationPartitionedLinear
モデルです。このモデルに含まれている Trained
プロパティは、各分割の学習セットを使用して学習を行った ClassificationLinear
モデルが格納されている 5 行 1 列の cell 配列です。
次の線形損失を評価する無名関数を作成します。
は観測値 j の重み、 は応答 j (陰性クラスの場合は -1、それ以外の場合は 1)、 は観測値 j の生の分類スコアです。カスタム損失関数は特定の形式で記述しなければなりません。カスタム損失関数の記述に関するルールについては、名前と値のペアの引数 LossFun
を参照してください。この関数では分類コストを使用しないので、~
を使用して kfoldLoss
に分類コストの位置を無視させます。
linearloss = @(C,S,W,~)sum(-W.*sum(S.*C,2))/sum(W);
線形損失関数を使用して平均の交差検証分類損失を推定します。また、各分割の損失を取得します。
ce = kfoldLoss(CVMdl,'LossFun',linearloss)
ce = -8.0982
ceFold = kfoldLoss(CVMdl,'LossFun',linearloss,'Mode','individual')
ceFold = 5×1
-8.3165
-8.7633
-7.4342
-8.0423
-7.9347
k 分割分類損失の使用による適切な LASSO ペナルティの特定
ロジスティック回帰学習器を使用する線形分類モデルに適した LASSO ペナルティの強度を決定するため、テスト標本の分類誤差率を比較します。
NLP のデータセットを読み込みます。カスタムな分類損失の指定で説明されているようにデータを前処理します。
load nlpdata Ystats = Y == 'stats'; X = X';
~ の範囲で対数間隔で配置された 11 個の正則化強度を作成します。
Lambda = logspace(-6,-0.5,11);
5 分割の交差検証を使用してバイナリ線形分類モデルを交差検証します。各正則化強度を使用します。SpaRSA を使用して目的関数を最適化します。目的関数の勾配の許容誤差を 1e-8
に下げます。
rng(10); % For reproducibility CVMdl = fitclinear(X,Ystats,'ObservationsIn','columns',... 'KFold',5,'Learner','logistic','Solver','sparsa',... 'Regularization','lasso','Lambda',Lambda,'GradientTolerance',1e-8)
CVMdl = ClassificationPartitionedLinear CrossValidatedModel: 'Linear' ResponseName: 'Y' NumObservations: 31572 KFold: 5 Partition: [1x1 cvpartition] ClassNames: [0 1] ScoreTransform: 'none' Properties, Methods
学習済みの線形分類モデルを抽出します。
Mdl1 = CVMdl.Trained{1}
Mdl1 = ClassificationLinear ResponseName: 'Y' ClassNames: [0 1] ScoreTransform: 'logit' Beta: [34023x11 double] Bias: [-13.3823 -13.3823 -13.3823 -13.3823 -13.3823 ... ] Lambda: [1.0000e-06 3.5481e-06 1.2589e-05 4.4668e-05 ... ] Learner: 'logistic' Properties, Methods
Mdl1
は ClassificationLinear
モデル オブジェクトです。Lambda
は正則化強度のシーケンスなので、Mdl
はそれぞれが Lambda
の各正則化強度に対応する 11 個のモデルであると考えることができます。
交差検証分類誤差を推定します。
ce = kfoldLoss(CVMdl);
11 個の正則化強度があるので、ce
は 1 行 11 列の分類誤差率のベクトルです。
Lambda
の値が大きくなると、予測子変数がスパースになります。これは分類器の品質として優れています。データセット全体を使用し、モデルの交差検証を行ったときと同じオプションを指定して、各正則化強度について線形分類モデルに学習をさせます。モデルごとに非ゼロの係数を特定します。
Mdl = fitclinear(X,Ystats,'ObservationsIn','columns',... 'Learner','logistic','Solver','sparsa','Regularization','lasso',... 'Lambda',Lambda,'GradientTolerance',1e-8); numNZCoeff = sum(Mdl.Beta~=0);
同じ図に、各正則化強度についての交差検証分類誤差率と非ゼロ係数の頻度をプロットします。すべての変数を対数スケールでプロットします。
figure; [h,hL1,hL2] = plotyy(log10(Lambda),log10(ce),... log10(Lambda),log10(numNZCoeff)); hL1.Marker = 'o'; hL2.Marker = 'o'; ylabel(h(1),'log_{10} classification error') ylabel(h(2),'log_{10} nonzero-coefficient frequency') xlabel('log_{10} Lambda') title('Test-Sample Statistics') hold off
予測子変数のスパース性と分類誤差の低さのバランスがとれている正則化強度のインデックスを選択します。この場合、 ~ の値で十分なはずです。
idxFinal = 7;
選択した正則化強度のモデルを Mdl
から選択します。
MdlFinal = selectModels(Mdl,idxFinal);
MdlFinal
は、1 つの正則化強度が含まれている ClassificationLinear
モデルです。新しい観測値のラベルを推定するには、MdlFinal
と新しいデータを predict
に渡します。
詳細
分類損失
"分類損失" 関数は分類モデルの予測誤差を評価します。複数のモデルで同じタイプの損失を比較した場合、損失が低い方が予測モデルとして優れていることになります。
以下のシナリオを考えます。
L は加重平均分類損失です。
n は標本サイズです。
yj は観測されたクラス ラベルです。陰性クラスを示す -1 または陽性クラスを示す 1 (あるいは、
ClassNames
プロパティの最初のクラスを示す -1 または 2 番目のクラスを示す 1) を使用して符号化されます。f(Xj) は予測子データ X の観測値 (行) j に対する陽性クラスの分類スコアです。
mj = yjf(Xj) は、yj に対応するクラスに観測値 j を分類する分類スコアです。正の値の mj は正しい分類を示しており、平均損失に対する寄与は大きくありません。負の値の 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) を通過するように正規化されています。
バージョン履歴
R2016a で導入R2022a: 既定以外のコスト行列をもつモデルに対して kfoldLoss
で異なる値が返される
入力モデル オブジェクトに学習させるときに既定以外のコスト行列を指定すると、関数 kfoldLoss
で以前のリリースとは異なる値が返されます。
関数 kfoldLoss
は、W
プロパティに格納された観測値の重みを使用します。さらに、名前と値の引数 LossFun
を "classifcost"
または "mincost"
として指定した場合、関数は Cost
プロパティに格納されたコスト行列を使用します。W
プロパティと Cost
プロパティの値を関数で使用する方法については変更されていません。ただし、既定以外のコスト行列をもつモデルについて入力モデル オブジェクトに格納されるプロパティの値が変更されたため、関数から異なる値が返されることがあります。
プロパティの値の変更に関する詳細については、Cost プロパティにユーザー指定のコスト行列を格納を参照してください。
ソフトウェアでコスト行列、事前確率、および観測値の重みを以前のリリースと同じように扱う場合は、誤分類コスト行列に応じた事前確率と観測値の重みの調整の説明に従って、既定以外のコスト行列の事前確率と観測値の重みを調整します。その後、分類モデルに学習させるときに、調整後の事前確率と観測値の重みを名前と値の引数 Prior
と Weights
を使用して指定し、既定のコスト行列を使用します。
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)