kfoldLoss
交差検証済み線形分類モデルの分類損失
説明
例
NLP のデータ セットを読み込みます。
load nlpdataX は予測子データのスパース行列、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
ロジスティック回帰学習器を使用する線形分類モデルに適した 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: [1×1 cvpartition]
ClassNames: [0 1]
ScoreTransform: 'none'
Properties, Methods
学習済みの線形分類モデルを抽出します。
Mdl1 = CVMdl.Trained{1}Mdl1 =
ClassificationLinear
ResponseName: 'Y'
ClassNames: [0 1]
ScoreTransform: 'logit'
Beta: [34023×11 double]
Bias: [-13.2936 -13.2936 -13.2936 -13.2936 -13.2936 -6.8954 -5.4359 -4.7170 -3.4108 -3.1566 -2.9792]
Lambda: [1.0000e-06 3.5481e-06 1.2589e-05 4.4668e-05 1.5849e-04 5.6234e-04 0.0020 0.0071 0.0251 0.0891 0.3162]
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 に渡します。
入力引数
交差検証済みバイナリ線形分類モデル。ClassificationPartitionedLinear モデル オブジェクトとして指定します。ClassificationPartitionedLinear モデル オブジェクトを作成するには、fitclinear を使用し、交差検証用の名前と値のペアの引数のいずれか 1 つ (CrossVal など) を指定します。
推定値を取得するため、kfoldLoss は線形分類モデルの交差検証に使用したものと同じデータ (X および Y) を適用します。
名前と値の引数
オプションの引数のペアを 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 4 10]
データ型: single | double
損失関数。組み込みの損失関数名または関数ハンドルとして指定します。
次の表は、使用可能な損失関数の一覧です。対応する文字ベクトルまたは 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
例: LossFun="classifcost"
データ型: char | string | function_handle
損失の集約レベル。"average" または "individual" として指定します。
| 値 | 説明 |
|---|---|
"average" | 分割全体で平均した損失を返す |
"individual" | 各分割について損失を返す |
例: Mode="individual"
出力引数
交差検証分類損失。数値スカラー、ベクトルまたは行列として返されます。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に対する分類損失です。
詳細
"分類損失" 関数は分類モデルの予測誤差を評価します。複数のモデルで同じタイプの損失を比較した場合、損失が低い方が予測モデルとして優れていることになります。
以下のシナリオを考えます。
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) を通過するように正規化されています。

拡張機能
この関数は、GPU 配列を完全にサポートします。詳細は、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2016a で導入kfoldLoss は GPU 配列を完全にサポートします。
R2023b 以降では、次の分類モデルのオブジェクト関数において、予測子に欠損値がある観測値が再代入 ("resub") と交差検証 ("kfold") による分類エッジ、損失、マージン、および予測の計算でその一部として使用されます。
以前のリリースでは、予測子に欠損値がある観測値は再代入と交差検証の計算で省略されていました。
入力モデル オブジェクトに学習させるときに既定以外のコスト行列を指定すると、関数 kfoldLoss で以前のリリースとは異なる値が返されます。
関数 kfoldLoss は、W プロパティに格納された観測値の重みを使用します。さらに、名前と値の引数 LossFun を "classifcost" または "mincost" として指定した場合、関数は Cost プロパティに格納されたコスト行列を使用します。W プロパティと Cost プロパティの値を関数で使用する方法については変更されていません。ただし、既定以外のコスト行列をもつモデルについて入力モデル オブジェクトに格納されるプロパティの値が変更されたため、関数から異なる値が返されることがあります。
プロパティの値の変更に関する詳細については、Cost プロパティにユーザー指定のコスト行列を格納を参照してください。
ソフトウェアでコスト行列、事前確率、および観測値の重みを以前のリリースと同じように扱う場合は、誤分類コスト行列に応じた事前確率と観測値の重みの調整の説明に従って、既定以外のコスト行列の事前確率と観測値の重みを調整します。その後、分類モデルに学習させるときに、調整後の事前確率と観測値の重みを名前と値の引数 Prior と Weights を使用して指定し、既定のコスト行列を使用します。
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)