Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

loss

説明

L = loss(tree,TBL,ResponseVarName) から返されるスカラーは、TBL.ResponseVarName が真の分類を含む場合に、treeTBL データをどの程度の精度で分類するかを表します。

損失を計算する場合、lossY のクラス確率を、treePrior プロパティに格納されている学習に使用されるクラス確率に正規化します。

L = loss(tree,TBL,Y) から返されるスカラーは、Y が真の分類を含む場合に、treeTBL データをどの程度の精度で分類するかを表します。

L = loss(tree,X,Y) から返されるスカラーは、Y が真の分類を含む場合に、treeX データをどの程度の精度で分類するかを表します。

L = loss(___,Name,Value) は、前の構文のいずれかを使用し、1 つ以上の Name,Value ペア引数で指定されたオプションを追加して、損失を返します。たとえば、損失関数や観測値の重みを指定できます。

[L,se,NLeaf,bestlevel] = loss(___) は、分類誤差の標準誤差のベクトル (se)、枝刈り系列の木における葉ノードの数のベクトル (NLeaf)、および名前と値のペア TreeSize で定義された最適な枝刈りレベル (bestlevel) も返します。

入力引数

すべて展開する

学習済みの分類木。ClassificationTree または CompactClassificationTree モデル オブジェクトとして指定します。つまり、treefitctree または compact が返す学習済み分類モデルです。

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

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

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

データ型: table

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

データ型: single | double

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

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

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

データ型: char | string

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

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

名前と値の引数

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

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

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

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

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

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

  • 関数ハンドル表記を使用して独自の関数を指定します。

    X 内の観測値数を n、異なるクラスの数 (numel(tree.ClassNames)) を K とします。使用する関数のシグネチャは次のようになっていなければなりません。

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

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

    • 関数名 (lossfun) を選択します。

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

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

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

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

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

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

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

データ型: char | string | function_handle

観測値の重み。'Weights' と、正の値の数値ベクトルまたは TBL 内の変数の名前から構成されるコンマ区切りのペアとして指定します。

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

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

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

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

枝刈りしたサブツリーに関連する Name,Value 引数。

枝刈りレベル。'Subtrees' と昇順の非負の整数のベクトルまたは 'all' から構成されるコンマ区切りのペアとして指定します。

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

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

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

Subtrees を呼び出すために、treePruneList プロパティまたは PruneAlpha プロパティを空にすることはできません。言い換えると、'Prune','on' を設定して tree を成長させるか、prune を使用して tree の枝刈りを行います。

例: 'Subtrees','all'

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

木のサイズ。'TreeSize' と次のいずれかの値から構成されるコンマ区切りのペアとして指定します。

  • 'se'loss は、最小の 1 標準偏差内の損失 (L+se、このとき L および se は、Subtrees での最小値に相関します) をもつ、最も高い枝刈りレベルを返します。

  • 'min'loss は、最も損失が少ない Subtrees の要素を戻します。通常、これは Subtrees の最小要素です。

出力引数

すべて展開する

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

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

枝刈りされた部分木における葉 (終端ノード) の数。長さが Subtrees のベクトルとして返されます。

名前と値のペア TreeSize で定義した最適な枝刈りレベル。スカラー値として返されます。値は、TreeSize の設定に応じて次のようになります。

  • TreeSize = 'se'loss は、最小の 1 標準偏差内の損失 (L+se、このとき L および se は、Subtrees での最小値に相関します) をもつ、最も高い枝刈りレベルを返します。

  • TreeSize = 'min'loss は、最も損失が少ない Subtrees の要素を返します。通常、これは Subtrees の最小要素です。

既定では、bestlevel は、最も損失の少ない、1 標準偏差内の損失の枝刈りレベルです。

すべて展開する

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');

{"String":"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.","Tex":[],"LaTex":[]}

この分類木には 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')

{"String":"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.","Tex":[],"LaTex":[]}

詳細

すべて展開する

拡張機能