Main Content

loss

アンサンブル分類モデルの分類損失

説明

L = loss(ens,tbl,ResponseVarName) は、table tbl 内の予測子データと tbl.ResponseVarName 内の真のクラス ラベルを使用して、学習済みアンサンブル分類モデル ens分類損失 L を返します。L の解釈は損失関数 (LossFun) と加重スキーム (Weights) によって異なります。一般に、優れた分類器の方が分類損失値が小さくなります。LossFun の既定値は "classiferror" (10 進数の誤分類率) です。

L = loss(ens,tbl,Y) は、table tbl 内の予測子データと Y 内の真のクラス ラベルを使用します。

L = loss(ens,X,Y) は、行列 X 内の予測子データと Y 内の真のクラス ラベルを使用します。

L = loss(___,Name=Value) では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、損失の計算に使用するアンサンブル内の弱学習器のインデックスを指定したり、分類損失関数を指定したり、計算を並列に実行したりできます。

メモ

予測子データ X または tbl 内の予測子変数に欠損値がある場合、関数 loss で NaN が返されることがあります。詳細については、欠損値がある予測子データに対して loss で NaN が返されることがあるを参照してください。

入力引数

すべて展開する

完全なアンサンブル分類モデル。fitcensemble で学習させた ClassificationEnsemble モデル オブジェクト、または compact で作成した CompactClassificationEnsemble モデル オブジェクトとして指定します。

標本データ。テーブルとして指定します。tbl の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。tbl には、モデルを学習させるために使用したすべての予測子が含まれていなければなりません。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。

table に格納されている標本データを使用して ens に学習させた場合、loss の入力データも table に含まれていなければなりません。

データ型: table

応答変数の名前。tbl 内の変数の名前で指定します。ens を学習させるために使用した応答変数が tbl に含まれている場合、ResponseVarName を指定する必要はありません。

ResponseVarName を指定する場合は、文字ベクトルまたは string スカラーとして指定しなければなりません。たとえば、応答変数 Ytbl.Y として格納されている場合、"Y" として指定します。それ以外の場合、tbl の列は Y を含めてすべて予測子として扱われます。

応答変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列でなければなりません。応答変数が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。

データ型: char | string

クラス ラベル。categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列として指定します。Y のデータ型は tbl または X と同じでなければなりません。(string 配列は文字ベクトルの cell 配列として扱われます)。

Y の型は ens の学習に使用した分類と同じでなければならず、要素数は tbl または X の行数と等しくなければなりません。

データ型: categorical | char | string | logical | single | double | cell

予測子データ。数値行列として指定します。

X の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。X の列内の変数は、ens の学習に使用した変数と同じでなければなりません。

X の行数は Y の行数と等しくなければなりません。

行列に格納されている標本データを使用して ens に学習させた場合、loss の入力データも行列でなければなりません。

データ型: double | single

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。

R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。

例: loss(ens,X,LossFun="exponential",UseParallel=true) は、指数の損失関数を使用し、並列に実行するように指定します。

loss で使用するアンサンブル内の弱学習器のインデックス。範囲 [1:ens.NumTrained] の正の整数のベクトルとして指定します。既定では、すべての学習器が使用されます。

例: Learners=[1 2 4]

データ型: single | double

損失関数。組み込みの損失関数名または関数ハンドルを指定します。

次の表に、組み込みの損失関数の値を示します。

説明
"binodeviance"二項分布からの逸脱度
"classifcost"観測誤分類コスト
"classiferror"10 進数の誤分類率
"exponential"指数損失
"hinge"ヒンジ損失
"logit"ロジスティック損失
"mincost"最小予測誤分類コスト (事後確率である分類スコアの場合)
"quadratic"二次損失

  • "mincost" は、事後確率である分類スコアに適しています。

  • 既定の設定では、バギング アンサンブルと部分空間アンサンブルは事後確率を返します (ens.Method"Bag" または "Subspace")。

  • アンサンブル法が "AdaBoostM1""AdaBoostM2""GentleBoost"、または "LogitBoost" の場合に事後確率を分類スコアとして使用するには、次のように入力してダブルロジットのスコア変換を指定する必要があります。

    ens.ScoreTransform = "doublelogit";

  • 他のすべてのアンサンブル法の場合、事後確率は分類スコアとしてサポートされていません。

関数ハンドル表記を使用して独自の関数を指定できます。nX 内の観測値の個数、K は異なるクラスの個数 (numel(ens.ClassNames)ens は入力モデル) であるとします。使用する関数のシグネチャは次のようになっていなければなりません。

lossvalue = lossfun(C,S,W,Cost)
ここで、

  • 出力引数 lossvalue はスカラーです。

  • 関数名 (lossfun) を指定します。

  • CnK 列の logical 行列であり、対応する観測値が属するクラスを各行が示します。列の順序は ens.ClassNames のクラスの順序に対応します。

    各行について観測値 p がクラス q に属する場合は C(p,q) = 1 を設定することにより、C を作成します。行 p の他のすべての要素を 0 に設定します。

  • S は、分類スコアの nK 列の行列です。列の順序は ens.ClassNames のクラスの順序に対応します。S は分類スコアの行列で、predict の出力と同様です。

  • W は、観測値の重みの n 行 1 列の数値ベクトルです。W を渡す場合、重みは合計が 1 になるように正規化されます。

  • Cost は、誤分類コストの、K 行 K 列の数値行列です。たとえば、Cost = ones(K) - eye(K) は、正しい分類のコストとして 0 を、誤分類のコストとして 1 を指定します。

損失関数の詳細については、分類損失を参照してください。

例: LossFun="binodeviance"

例: LossFun=@Lossfun

データ型: char | string | function_handle

出力の集約レベル。"ensemble""individual"、または "cumulative" として指定します。

説明
"ensemble"出力は、アンサンブル全体に対する損失を表すスカラー値になります。
"individual"出力は、学習させた学習器ごとに 1 つの要素をもつベクトルになります。
"cumulative"出力は、学習器の入力リストから学習器 1:J を使用して要素 J が取得されたベクトルになります。

例: Mode="individual"

データ型: char | string

学習器の観測値を使用するオプション。NT 列のサイズの logical 行列として指定します。

  • NX の行の数です。

  • T は、ens に存在する弱学習器の数です。

UseObsForLearner(i,j)true (既定) の場合、学習器 jX の行 i のクラスの予測に使用されます。

例: UseObsForLearner=logical([1 1; 0 1; 1 0])

データ型: logical matrix

並列実行のフラグ。数値または logical の 1 (true) または 0 (false) として指定します。UseParallel=true を指定した場合、関数 lossparfor を使用して for ループの反復を実行します。Parallel Computing Toolbox™ がある場合、ループが並列に実行されます。

例: UseParallel=true

データ型: logical

観測値の重み。数値ベクトルまたは tbl 内の変数の名前を指定します。重みを指定すると、loss は各クラスの観測値の重みの合計がそのクラスの事前確率になるように重みを正規化します。

数値ベクトルで Weights を指定する場合、Weights のサイズは X または tbl 内の観測値の数と等しくなければなりません。合計が各クラスの事前確率の値と等しくなるように Weights が正規化されます。

tbl 内の変数名を Weights として指定する場合、文字ベクトルまたは string スカラーとして指定しなければなりません。たとえば、重みが tbl.w として格納されている場合、Weights として "w" を指定します。それ以外の場合、tbl の列は tbl.w を含めてすべて予測子として扱われます。

データ型: single | double | char | string

出力引数

すべて展開する

分類損失。数値スカラーまたは数値列ベクトルとして返されます。

  • Mode"ensemble" の場合、L はアンサンブル全体に対する損失を表すスカラー値です。

  • Mode"individual" の場合、L は学習させた学習器ごとに 1 つの要素をもつベクトルです。

  • Mode"cumulative" の場合、L は学習器の入力リストから学習器 1:J を使用して要素 J が取得されたベクトルです。

関数 loss は、損失を計算するときに、ensPrior プロパティに格納されている、学習に使用されたクラス確率に対して、ResponseVarName または Y のクラス確率を正規化します。

すべて展開する

フィッシャーのアヤメのデータ セットを読み込みます。

load fisheriris

AdaBoostM2 を使用して、100 本の決定木によるアンサンブル分類に学習をさせます。弱学習器として木の切り株を指定します。

t = templateTree(MaxNumSplits=1);
ens = fitcensemble(meas,species,Method="AdaBoostM2",Learners=t);

学習観測値を使用してモデルの分類誤差を推定します。

L = loss(ens,meas,species)
L = 0.0333

または、ens がコンパクトでない場合は、ensresubLoss に渡すことにより学習標本の分類誤差を推定できます。

ブースティング木のアンサンブルを作成し、各予測子の重要度を検査します。テスト データを使用して、アンサンブルの分類精度を評価します。

不整脈データセットを読み込みます。データのクラス表現を判別します。

load arrhythmia
Y = categorical(Y);
tabulate(Y)
  Value    Count   Percent
      1      245     54.20%
      2       44      9.73%
      3       15      3.32%
      4       15      3.32%
      5       13      2.88%
      6       25      5.53%
      7        3      0.66%
      8        2      0.44%
      9        9      1.99%
     10       50     11.06%
     14        4      0.88%
     15        5      1.11%
     16       22      4.87%

データ セットには 16 個のクラスが含まれていますが、すべてのクラスは表現されていません (たとえば、クラス 13)。ほとんどの観測値は不整脈がないものとして分類されています (クラス 1)。このデータセットは非常に離散的であり、クラスが不均衡です。

不整脈があるすべての観測値 (クラス 2 ~ 15) を 1 つのクラスに結合します。不整脈の状況が不明である観測値 (クラス 16) をデータ セットから削除します。

idx = (Y ~= "16");
Y = Y(idx);
X = X(idx,:);
Y(Y ~= "1") = "WithArrhythmia";
Y(Y == "1") = "NoArrhythmia";
Y = removecats(Y);

データを学習セットとテスト セットに均等に分割します。

rng("default") % For reproducibility
cvp = cvpartition(Y,"Holdout",0.5);
idxTrain = training(cvp);
idxTest = test(cvp);

cvp は、学習セットとテスト セットを指定する交差検証分割オブジェクトです。

AdaBoostM1 を使用して 100 本のブースティング分類木のアンサンブルに学習をさせます。弱学習器として木の切り株を使用するように指定します。また、欠損値がデータ セットに含まれているので、代理分岐を使用するように指定します。

t = templateTree("MaxNumSplits",1,"Surrogate","on");
numTrees = 100;
mdl = fitcensemble(X(idxTrain,:),Y(idxTrain),"Method","AdaBoostM1", ...
    "NumLearningCycles",numTrees,"Learners",t);

mdl は学習させた ClassificationEnsemble モデルです。

各予測子について重要度を調べます。

predImportance = predictorImportance(mdl);
bar(predImportance)
title("Predictor Importance")
xlabel("Predictor")
ylabel("Importance Measure")

Figure contains an axes object. The axes object with title Predictor Importance, xlabel Predictor, ylabel Importance Measure contains an object of type bar.

重要度が上位 10 番目までの予測子を識別します。

[~,idxSort] = sort(predImportance,"descend");
idx10 = idxSort(1:10)
idx10 = 1×10

   228   233   238    93    15   224    91   177   260   277

テスト セットの観測値を分類します。混同行列を使用して結果を表示します。青色の値は正しい分類を示し、赤色の値は誤分類された観測値を示します。

predictedValues = predict(mdl,X(idxTest,:));
confusionchart(Y(idxTest),predictedValues)

Figure contains an object of type ConfusionMatrixChart.

テスト セットでモデルの精度を計算します。

error = loss(mdl,X(idxTest,:),Y(idxTest), ...
    "LossFun","classiferror");
accuracy = 1 - error
accuracy = 0.7731

accuracy で、正しく分類された観測値の比率が推定されます。

詳細

すべて展開する

拡張機能

バージョン履歴

R2011a で導入

すべて展開する