このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
loss
分類誤差
構文
説明
から返されるスカラーは、L
= loss(tree
,TBL
,ResponseVarName
)TBL.ResponseVarName
が真の分類を含む場合に、tree
で TBL
データをどの程度の精度で分類するかを表します。
損失を計算する場合、loss
は Y
のクラス確率を、tree
の Prior
プロパティに格納されている学習に使用されるクラス確率に正規化します。
は、前の構文のいずれかを使用し、1 つ以上の L
= loss(___,Name,Value
)Name,Value
ペア引数で指定されたオプションを追加して、損失を返します。たとえば、損失関数や観測値の重みを指定できます。
入力引数
tree
— 学習済みの分類木
ClassificationTree
モデル オブジェクト | CompactClassificationTree
モデル オブジェクト
学習済みの分類木。ClassificationTree
または CompactClassificationTree
モデル オブジェクトとして指定します。つまり、tree
は fitctree
または compact
が返す学習済み分類モデルです。
TBL
— 標本データ
テーブル
標本データ。テーブルとして指定します。TBL
の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。オプションとして、応答変数用および観測値の重み用の追加列を TBL
に含めることができます。TBL
には、tree
を学習させるために使用したすべての予測子が含まれていなければなりません。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。
tree
を学習させるために使用した応答変数が TBL
に含まれている場合、ResponseVarName
または Y
を指定する必要はありません。
table
に含まれている標本データを使用して tree
を学習させた場合、このメソッドの入力データも table に格納されていなければなりません。
データ型: table
ResponseVarName
— 応答変数名
TBL
内の変数の名前
応答変数の名前。TBL
に含まれている変数の名前として指定します。tree
を学習させるために使用した応答変数が TBL
に含まれている場合、ResponseVarName
を指定する必要はありません。
ResponseVarName
を指定する場合は、文字ベクトルまたは string スカラーとして指定しなければなりません。たとえば、応答変数が TBL.Response
として格納されている場合、'Response'
として指定します。それ以外の場合、TBL
の列は TBL.ResponseVarName
を含めてすべて予測子として扱われます。
応答変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列でなければなりません。応答変数が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。
データ型: char
| string
Y
— クラス ラベル
categorical 配列 | 文字配列 | string 配列 | logical ベクトル | 数値ベクトル | 文字ベクトルの cell 配列
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
LossFun
— 損失関数
'mincost'
(既定値) | 'binodeviance'
| 'classifcost'
| 'classiferror'
| 'exponential'
| 'hinge'
| 'logit'
| 'quadratic'
| 関数ハンドル
損失関数。'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
) を選択します。C
はn
行K
列の logical 行列で、行は対応する観測値が属するクラスを示しています。列の順序はtree.ClassNames
のクラスの順序に対応します。C
を作成するには、各行について観測値p
がクラスq
に含まれている場合にC(p,q) = 1
を設定します。行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',@
を使用して独自の関数を指定します。lossfun
損失関数の詳細については、分類損失を参照してください。
データ型: char
| string
| function_handle
Weights
— 観測値の重み
ones(size(X,1),1)
(既定値) | TBL
内の変数の名前 | 正の値の数値ベクトル
観測値の重み。'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
— 枝刈りレベル
0 (既定値) | 非負の整数のベクトル | 'all'
枝刈りレベル。'Subtrees'
と昇順の非負の整数のベクトルまたは 'all'
から構成されるコンマ区切りのペアとして指定します。
ベクトルを指定する場合、すべての要素が 0
から max(tree.PruneList)
の範囲になければなりません。0
は枝刈りしない完全な木を、max(tree.PruneList)
は完全に枝刈りした木 (つまり、ルート ノードのみ) を表します。
'all'
を指定した場合、loss
はすべての部分木 (枝刈り順序全体) に作用します。これは、0:max(tree.PruneList)
を指定することと同じです。
loss
では、Subtrees
で指定された各レベルまで tree
の枝刈りを行ってから、対応する出力引数を推定します。Subtrees
のサイズにより、一部の出力引数のサイズが決まります。
Subtrees
を呼び出すために、tree
の PruneList
プロパティまたは PruneAlpha
プロパティを空にすることはできません。言い換えると、'Prune','on'
を設定して tree
を成長させるか、prune
を使用して tree
の枝刈りを行います。
例: 'Subtrees','all'
データ型: single
| double
| char
| string
TreeSize
— 木のサイズ
'se'
(既定値) | 'min'
木のサイズ。'TreeSize'
と次のいずれかの値から構成されるコンマ区切りのペアとして指定します。
'se'
—loss
は、最小の 1 標準偏差内の損失 (L
+se
、このときL
およびse
は、Subtrees
での最小値に相関します) をもつ、最も高い枝刈りレベルを返します。'min'
—loss
は、最も損失が少ないSubtrees
の要素を戻します。通常、これはSubtrees
の最小要素です。
出力引数
L
— 分類損失
スカラー値のベクトル
分類損失。長さが Subtrees
のベクトルとして返されます。誤差の意味は、Weights
および LossFun
の値によって異なります。
se
— 損失の標準誤差
スカラー値のベクトル
損失の標準誤差。長さが Subtrees
のベクトルとして返されます。
NLeaf
— 葉ノードの数
整数値のベクトル
枝刈りされた部分木における葉 (終端ノード) の数。長さが Subtrees
のベクトルとして返されます。
bestlevel
— 最適な枝刈りレベル
スカラー値
名前と値のペア 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');
この分類木には 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')
詳細
分類損失
"分類損失" 関数は分類モデルの予測誤差を評価します。複数のモデルで同じタイプの損失を比較した場合、損失が低い方が予測モデルとして優れていることになります。
以下のシナリオを考えます。
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 に分類する真の誤分類コストです。
スコア (ツリー)
ツリーの場合、葉ノードの分類の "スコア" は、そのノードでの分類の事後確率です。あるノードにおける分類の事後確率とは、分類によって実際にそのノードに達するのに要した学習シーケンスの数を、そのノードまでの学習シーケンスの数で除算した値です。
例については、分類木の事後確率の定義を参照してください。
拡張機能
tall 配列
メモリの許容量を超えるような多数の行を含む配列を計算します。
使用上の注意事項および制限事項:
1 つの出力のみがサポートされます。
この関数でインメモリ データまたは tall データに対して学習を行ったモデルを使用できます。
詳細は、tall 配列を参照してください。
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
使用上の注意事項および制限事項:
関数
loss
では代理分岐で学習させた決定木モデルはサポートしていません。
詳細は、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)