メインコンテンツ

resubLoss

分類木モデルの再代入分類損失

説明

L = resubLoss(tree) は、tree.X に格納されている学習データと tree.Y に格納されている対応する真のクラス ラベルを使用して、学習済み分類木モデル tree の再代入による分類損失 L を返します。resubLoss で既定で使用される損失は、fitctree での tree の作成に使用されたデータについて計算された損失です。

分類損失 (L) は再代入の品質に対する尺度です。解釈は損失関数 (LossFun) によって異なりますが、一般に、優れた分類器の方が分類損失値が小さくなります。LossFun の既定値は "mincost" (最小予測誤分類コスト) です。

L = resubLoss(tree,Name=Value) では、1 つ以上の名前と値の引数を使用して追加オプションを指定します。たとえば、resubLoss が分類損失の計算に使用する損失関数、枝刈りレベル、木のサイズを指定できます。

[L,SE,Nleaf,BestLevel] = resubLoss(___) は、分類誤差の標準誤差、枝刈り順序の木に含まれる葉ノードの数、および名前と値の引数 TreeSize で定義される最適な枝刈りレベルも返します。既定では、BestLevel は、損失が最小損失の 1 標準偏差以内になる枝刈りレベルです。

すべて折りたたむ

ionosphere データについて、再代入分類誤差を計算します。

load ionosphere
tree = fitctree(X,Y);
L = resubLoss(tree)
L = 
0.0114

枝刈りをしていない決定木は、過適合になる傾向があります。モデルの複雑さと標本外性能のバランスをとる方法の 1 つとして、標本内性能と標本外性能が十分高くなるように木の枝刈りを行います (つまり木の成長を制限します)。

フィッシャーのアヤメのデータ セットを読み込みます。データを学習セット (50%) と検証セット (50%) に分割します。

load fisheriris
n = size(meas,1);
rng(1) % For reproducibility
idxTrn = false(n,1);
idxTrn(randsample(n,round(0.5*n))) = true; % Training set logical indices 
idxVal = idxTrn == false;                  % Validation set logical indices

学習セットを使用して分類木を成長させます。

Mdl = fitctree(meas(idxTrn,:),species(idxTrn));

分類木を表示します。

view(Mdl,'Mode','graph');

Figure Classification tree viewer contains an axes object and other objects of type uimenu, uicontrol. The axes object contains 18 objects of type line, text. One or more of the lines displays its values using only markers

この分類木には 4 つの枝刈りレベルがあります。レベル 0 は、(表示のように) 枝刈りされていない完全な木です。レベル 3 はルート ノードのみ (分割なし) です。

最上位レベルを除く各部分木 (枝刈りレベル) について、学習標本の分類誤差を確認します。

m = max(Mdl.PruneList) - 1;
trnLoss = resubLoss(Mdl,'Subtrees',0:m)
trnLoss = 3×1

    0.0267
    0.0533
    0.3067

  • 枝刈りされていない完全な木では、学習観測値の約 2.7% が誤分類されています。

  • レベル 1 まで枝刈りされた木では、学習観測値の約 5.3% が誤分類されています。

  • レベル 2 (切り株) まで枝刈りされた木では、学習観測値の約 30.6% が誤分類されています。

最上位を除く各レベルで検証標本の分類誤差を確認します。

valLoss = loss(Mdl,meas(idxVal,:),species(idxVal),'Subtrees',0:m)
valLoss = 3×1

    0.0369
    0.0237
    0.3067

  • 枝刈りされていない完全な木では、検証観測値の約 3.7% が誤分類されています。

  • レベル 1 まで枝刈りされた木では、検証観測値の約 2.4% が誤分類されています。

  • レベル 2 (切り株) まで枝刈りされた木では、検証観測値の約 30.7% が誤分類されています。

モデルの複雑さと標本外性能のバランスをとるには、Mdl をレベル 1 まで枝刈りすることを検討します。

pruneMdl = prune(Mdl,'Level',1);
view(pruneMdl,'Mode','graph')

Figure Classification tree viewer contains an axes object and other objects of type uimenu, uicontrol. The axes object contains 12 objects of type line, text. One or more of the lines displays its values using only markers

入力引数

すべて折りたたむ

分類木モデル。fitctree で学習させた ClassificationTree モデル オブジェクトとして指定します。

名前と値の引数

すべて折りたたむ

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

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

例: L = resubLoss(tree,Subtrees="all") は、tree の再代入分類損失を計算するときにすべての部分木を使用するように指定します。

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

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

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

"mincost" は、事後確率である分類スコアに適しています。既定の設定では、分類木は分類スコアとして事後確率を返します (predict を参照)。

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

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

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

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

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

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

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

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

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

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

例: LossFun="binodeviance"

例: LossFun=@lossfun

データ型: char | string | function_handle

枝刈りレベル。昇順の非負の整数のベクトルまたは "all" として指定します。

ベクトルを指定する場合、すべての要素が 0 から max(tree.PruneList) の範囲になければなりません。0 は枝刈りしない完全な木を、max(tree.PruneList) は完全に枝刈りした木 (つまり、ルート ノードのみ) を表します。

"all" を指定した場合、resubLoss はすべての部分木 (つまり、枝刈り順序全体) に作用します。これは、0:max(tree.PruneList) を指定することと同じです。

resubLoss では、Subtrees で指定された各レベルまで tree の枝刈りを行ってから、対応する出力引数を推定します。Subtrees のサイズにより、一部の出力引数のサイズが決まります。

関数で Subtrees を呼び出すために、treePruneList プロパティと PruneAlpha プロパティは空以外でなければなりません。言い換えると、fitctree を使用するときに Prune="on" を設定して tree を成長させるか、prune を使用して tree を枝刈りすることで成長させます。

例: Subtrees="all"

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

木のサイズ。次の値のいずれかとして指定します。

  • "se"resubLoss は、損失が最小値 (L+se、ここで LseSubtrees における最小値) の 1 標準偏差以内である最も高い枝刈りレベルを最適な枝刈りレベル (BestLevel) として返します。

  • "min"resubLoss は、損失が最も小さい Subtrees の要素を最適な枝刈りレベルとして返します。通常、この要素は Subtrees の最小要素です。

例: TreeSize="min"

データ型: char | string

出力引数

すべて折りたたむ

分類損失Subtrees と同じ長さのスカラー値のベクトルとして返されます。誤差の意味は損失関数 (LossFun) によって異なります。

損失の標準誤差。Subtrees と同じ長さの数値ベクトルとして返されます。

枝刈りされた部分木における葉ノードの数。Subtrees と同じ長さの整数値のベクトルとして返されます。葉ノードは終端ノードであり、分割ではなく応答を与えます。

最適な枝刈りレベル。数値スカラーとして返されます。値は TreeSize に応じて次のようになります。

  • TreeSize"se" の場合、関数 loss は、損失が最小値 (L+se、ここで LseSubtrees における最小値) の 1 標準偏差以内である最も高い枝刈りレベルを返します。

  • TreeSize"min" の場合、関数 loss は、損失が最も小さい Subtrees の要素を返します。通常、これは Subtrees の最小要素です。

詳細

すべて折りたたむ

拡張機能

すべて展開する

バージョン履歴

R2011a で導入