メインコンテンツ

loss

分類木モデルの分類損失

説明

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

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

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

L = loss(___,Name=Value) では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、損失関数や観測値の重みを指定できます。

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

すべて折りたたむ

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

load ionosphere
tree = fitctree(X,Y);
L = loss(tree,X,Y)
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 モデル オブジェクト、または compact で作成した CompactClassificationTree モデル オブジェクトとして指定します。

標本データ。table として指定します。Tbl の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。必要に応じて、応答変数用および観測値の重み用の追加列を Tbl に含めることができます。Tbl には、tree に学習させるために使用したすべての予測子が含まれていなければなりません。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。

tree に学習させるために使用した応答変数が Tbl に含まれている場合、ResponseVarName または Y を指定する必要はありません。

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

データ型: table

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

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

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

データ型: char | string

クラス ラベル。categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列として指定します。Y の型は tree の学習に使用した分類と同じでなければならず、要素数は X の行数に等しくなければなりません。

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

予測子データ。数値行列として指定します。X の各列が 1 つの変数を表し、各行が 1 つの観測値を表します。

X の列数は tree の学習に使用したデータと同じでなければなりません。X の行数は Y の行数と同じでなければなりません。

データ型: single | double

名前と値の引数

すべて折りたたむ

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

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

例: L = loss(tree,X,Y,LossFun="exponential") は、指数の損失関数を使用するように指定します。

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

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

説明
"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

観測値の重み。数値ベクトルまたは Tbl 内の変数の名前を指定します。

数値ベクトルで Weights を指定する場合、Weights のサイズは X または Tbl の行数と等しくなければなりません。

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

loss は、各クラスにおける観測値の重みの合計がそのクラスの事前確率になるように重みを正規化します。Weights を指定した場合、loss は重み付きの分類損失を計算します。

例: Weights="W"

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

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

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

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

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

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

例: Subtrees="all"

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

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

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

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

例: TreeSize="min"

データ型: char | string

出力引数

すべて折りたたむ

分類損失Subtrees と同じ長さの数値ベクトルとして返されます。誤差の意味は、Weights および LossFun の値によって異なります。

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

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

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

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

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

詳細

すべて折りたたむ

拡張機能

すべて展開する

バージョン履歴

R2011a で導入