Main Content

loss

構文

L = loss(ens,tbl,ResponseVarName)
L = loss(ens,tbl,Y)
L = loss(ens,X,Y)
L = loss(___,Name,Value)

説明

L = loss(ens,tbl,ResponseVarName) は、予測子のテーブル tbl と真のクラス ラベル tbl.ResponseVarName を使用して計算したアンサンブル ens の分類誤差を返します。

L = loss(ens,tbl,Y) は、予測子のテーブル tbl と真のクラス ラベル Y を使用して計算したアンサンブル ens の分類誤差を返します。

L = loss(ens,X,Y) は、予測の行列 X と真のクラス ラベル Y を使用して計算されたアンサンブル ens の分類誤差を返します。

L = loss(___,Name,Value) は、前の構文のいずれかを使用し、1 つ以上の Name,Value ペア引数で指定されたオプションを追加して、分類誤差を計算します。

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

メモ

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

入力引数

ens

関数 fitcensemble で作成されたアンサンブル分類、または、compact を使用して作成されたコンパクト アンサンブル分類。

tbl

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

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

ResponseVarName

応答変数の名前。tbl 内の変数の名前で指定します。

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

X

分類するデータの行列。X の各行は 1 つの観測値を表し、各列は、1 つの予測子を表します。X は、ens の学習に使用されるデータと同じ列数でなければなりません。X は、Y に含まれる要素数と同じ数の行がなければなりません。

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

Y

tbl または X における観測値のクラス ラベル。Y のデータ型は ens の学習に使用した分類と同じでなければならず、要素数は tbl または X の行数に等しくなければなりません。

名前と値の引数

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

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

learners

アンサンブルに含まれている 1 から ens.NumTrained までの弱学習器のインデックス。loss は、これらの学習器のみを損失の計算に使用します。

既定値: 1:NumTrained

Lossfun

損失関数。'LossFun' と組み込み損失関数名または関数ハンドルから構成されるコンマ区切りのペアとして指定します。

  • 次の表は、使用可能な損失関数の一覧です。対応する文字ベクトルまたは string スカラーを使用して、いずれかを指定します。

    説明
    '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 のクラスの順序に対応します。

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

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

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

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

    'LossFun',@lossfun を使用して独自の関数を指定します。

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

既定値: 'classiferror'

mode

出力 L の意味:

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

  • 'individual'L は、学習された学習器ごとに 1 つの要素をもつベクトルです。

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

既定値: 'ensemble'

UseObsForLearner

NT 列のサイズの logical 行列です。

  • NX の行の数です。

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

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

既定値: true(N,T)

UseParallel

推定を並列で実行するための指定。false (逐次計算) または true (並列計算) として指定します。並列計算には Parallel Computing Toolbox™ が必要です。特に大規模なデータセットでは、並列推定の方が逐次推定よりも高速になる可能性があります。並列計算は木学習器でのみサポートされます。

既定値: false

weights

非負のエントリをもつ、観測の重みのベクトル。weights の長さは、X の行数と等しくなければなりません。重みを指定すると、loss は各クラスの観測の重みを正規化し、そのクラスの事前確率の合計になるようにします。

既定値: ones(size(X,1),1)

出力引数

L

分類損失。既定の設定では、誤分類データの比率です。L はベクトルになる可能性があり、名前と値のペアの引数の設定によっては意味が異なります。

すべて展開する

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

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 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 で、正しく分類された観測値の比率が推定されます。

詳細

すべて展開する

拡張機能

バージョン履歴

すべて展開する

参考

| | |