resubLoss
分類木モデルの再代入分類損失
説明
は、L = resubLoss(tree)tree.X に格納されている学習データと tree.Y に格納されている対応する真のクラス ラベルを使用して、学習済み分類木モデル tree の再代入による分類損失 L を返します。resubLoss で既定で使用される損失は、fitctree での tree の作成に使用されたデータについて計算された損失です。
分類損失 (L) は再代入の品質に対する尺度です。解釈は損失関数 (LossFun) によって異なりますが、一般に、優れた分類器の方が分類損失値が小さくなります。LossFun の既定値は "mincost" (最小予測誤分類コスト) です。
L = resubLoss( では、1 つ以上の名前と値の引数を使用して追加オプションを指定します。たとえば、tree,Name=Value)resubLoss が分類損失の計算に使用する損失関数、枝刈りレベル、木のサイズを指定できます。
例
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');

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

入力引数
分類木モデル。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 を参照)。
関数ハンドル表記を使用して独自の関数を指定します。n は X 内の観測値の個数、K は異なるクラスの個数 (numel(tree.ClassNames)) であるとします。使用する関数のシグネチャは次のようになっていなければなりません。
lossvalue = lossfun(C,S,W,Cost)出力引数
lossvalueはスカラーです。関数名 (
lossfun) を指定します。Cは n 行 K 列の logical 行列であり、対応する観測値が属するクラスを各行が示します。列の順序はtree.ClassNamesのクラスの順序に対応します。各行について観測値
pがクラスqに属する場合はC(p,q) = 1を設定することにより、Cを作成します。行pの他のすべての要素を0に設定します。Sは、分類スコアの n 行 K 列の行列です。列の順序はtree.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
枝刈りレベル。昇順の非負の整数のベクトルまたは "all" として指定します。
ベクトルを指定する場合、すべての要素が 0 から max(tree.PruneList) の範囲になければなりません。0 は枝刈りしない完全な木を、max(tree.PruneList) は完全に枝刈りした木 (つまり、ルート ノードのみ) を表します。
"all" を指定した場合、resubLoss はすべての部分木 (つまり、枝刈り順序全体) に作用します。これは、0:max(tree.PruneList) を指定することと同じです。
resubLoss では、Subtrees で指定された各レベルまで tree の枝刈りを行ってから、対応する出力引数を推定します。Subtrees のサイズにより、一部の出力引数のサイズが決まります。
関数で Subtrees を呼び出すために、tree の PruneList プロパティと PruneAlpha プロパティは空以外でなければなりません。言い換えると、fitctree を使用するときに Prune="on" を設定して tree を成長させるか、prune を使用して tree を枝刈りすることで成長させます。
例: Subtrees="all"
データ型: single | double | char | string
木のサイズ。次の値のいずれかとして指定します。
"se"—resubLossは、損失が最小値 (L+se、ここでLとseはSubtreesにおける最小値) の 1 標準偏差以内である最も高い枝刈りレベルを最適な枝刈りレベル (BestLevel) として返します。"min"—resubLossは、損失が最も小さいSubtreesの要素を最適な枝刈りレベルとして返します。通常、この要素はSubtreesの最小要素です。
例: TreeSize="min"
データ型: char | string
出力引数
損失の標準誤差。Subtrees と同じ長さの数値ベクトルとして返されます。
枝刈りされた部分木における葉ノードの数。Subtrees と同じ長さの整数値のベクトルとして返されます。葉ノードは終端ノードであり、分割ではなく応答を与えます。
詳細
"分類損失" 関数は分類モデルの予測誤差を評価します。複数のモデルで同じタイプの損失を比較した場合、損失が低い方が予測モデルとして優れていることになります。
以下のシナリオを考えます。
L は加重平均分類損失です。
n は標本サイズです。
バイナリ分類は以下です。
yj は観測されたクラス ラベルです。陰性クラスを示す -1 または陽性クラスを示す 1 (あるいは、
ClassNamesプロパティの最初のクラスを示す -1 または 2 番目のクラスを示す 1) を使用して符号化されます。f(Xj) は予測子データ X の観測値 (行) j に対する陽性クラスの分類スコアです。
mj = yjf(Xj) は、yj に対応するクラスに観測値 j を分類する分類スコアです。正の値の mj は正しい分類を示しており、平均損失に対する寄与は大きくありません。負の値の mj は正しくない分類を示しており、平均損失に大きく寄与します。
マルチクラス分類 (つまり、K ≥ 3) をサポートするアルゴリズムの場合、次のようになります。
yj* は、K - 1 個の 0 と、観測された真のクラス yj に対応する位置の 1 から構成されるベクトルです。たとえば、2 番目の観測値の真のクラスが 3 番目のクラスであり K = 4 の場合、y2* = [
0 0 1 0]′ になります。クラスの順序は入力モデルのClassNamesプロパティ内の順序に対応します。f(Xj) は予測子データ X の観測値 j に対するクラス スコアのベクトルで、長さは K です。スコアの順序は入力モデルの
ClassNamesプロパティ内のクラスの順序に対応します。mj = yj*′f(Xj).したがって mj は、観測された真のクラスについてモデルが予測するスカラー分類スコアです。
観測値 j の重みは wj です。観測値の重みは、その合計が
Priorプロパティに格納された対応するクラスの事前確率になるように正規化されます。そのため、次のようになります。
この状況では、名前と値の引数 LossFun を使用して指定できる、サポートされる損失関数は次の表のようになります。
| 損失関数 | LossFun の値 | 式 |
|---|---|---|
| 二項分布からの逸脱度 | "binodeviance" | |
| 観測誤分類コスト | "classifcost" | ここで、 はスコアが最大のクラスに対応するクラス ラベル、 は真のクラスが yj である場合に観測値をクラス に分類するユーザー指定のコストです。 |
| 10 進数の誤分類率 | "classiferror" | ここで、I{·} はインジケーター関数です。 |
| クロスエントロピー損失 | "crossentropy" |
加重クロスエントロピー損失は次となります。 ここで重み は、合計が 1 ではなく n になるように正規化されます。 |
| 指数損失 | "exponential" | |
| ヒンジ損失 | "hinge" | |
| ロジスティック損失 | "logit" | |
| 最小予測誤分類コスト | "mincost" |
重み付きの最小予測分類コストは、次の手順を観測値 j = 1、...、n について使用することにより計算されます。
最小予測誤分類コスト損失の加重平均は次となります。 |
| 二次損失 | "quadratic" |
既定のコスト行列 (正しい分類の場合の要素値は 0、誤った分類の場合の要素値は 1) を使用する場合、"classifcost"、"classiferror"、および "mincost" の損失の値は同じです。既定以外のコスト行列をもつモデルでは、ほとんどの場合は "classifcost" の損失と "mincost" の損失が等価になります。これらの損失が異なる値になる可能性があるのは、最大の事後確率をもつクラスへの予測と最小の予測コストをもつクラスへの予測が異なる場合です。"mincost" は分類スコアが事後確率の場合にしか適さないことに注意してください。
次の図では、1 つの観測値のスコア m に対する損失関数 ("classifcost"、"crossentropy"、および "mincost" を除く) を比較しています。いくつかの関数は、点 (0,1) を通過するように正規化されています。

真の誤分類コストは、観測値を誤ったクラスに分類するコストです。
分類器の作成時に、名前と値の引数 Cost を使用してクラスごとの真の誤分類コストを設定できます。Cost(i,j) は、真のクラスが i の場合に観測値をクラス j に分類するコストです。既定では、Cost(i,j)=1 (i~=j の場合) および Cost(i,j)=0 (i=j の場合) です。つまり、正しい分類のコストは 0、誤った分類のコストは 1 です。
観測値ごとの予測誤分類コストは、観測をそれぞれのクラスに分類する平均コストです。
学習済みの分類器を使用して Nobs 個の観測値を分類するとします。また、K 個のクラスがあるとします。1 行に 1 観測ずつ、観測値を行列 X に置きます。
予測コスト行列 CE のサイズは、Nobs 行 K列です。CE の各行には、観測をそれぞれのクラス K に分類する予測 (平均) コストが含まれます。CE(n,k) は次のとおりです。
ここで
K は、クラスの数です。
は、観測値 X(n) のクラス i の事後確率です。
は、真のクラスが i である観測値を k に分類する真の誤分類コストです。
拡張機能
この関数は、GPU 配列を完全にサポートします。詳細は、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2011a で導入
参考
loss | resubEdge | resubMargin | resubPredict | fitctree | ClassificationTree
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)