loss
説明
は、table L
= loss(Mdl
,Tbl
,ResponseVarName
)Tbl
内の予測子データと table 変数 ResponseVarName
のクラス ラベルを使用して、学習済みのニューラル ネットワーク分類器 Mdl
の分類損失を返します。
L
は、既定では分類誤差を表すスカラー値として返されます。
では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、予測子データの列が観測値に対応するように指定したり、損失関数を指定したり、観測値の重みを与えることができます。L
= loss(___,Name,Value
)
メモ
X
または Tbl
の予測子データに欠損値があり、LossFun
が "classifcost"
、"classiferror"
、または "mincost"
に設定されていない場合、関数 loss
で NaN が返されることがあります。詳細については、欠損値がある予測子データに対して loss で NaN が返されることがあるを参照してください。
例
ニューラル ネットワークのテスト セットの分類誤差
ニューラル ネットワーク分類器のテスト セットの分類誤差を計算します。
patients
データセットを読み込みます。データ セットから table を作成します。各行が 1 人の患者に対応し、各列が診断の変数に対応します。変数 Smoker
を応答変数として使用し、残りの変数を予測子として使用します。
load patients
tbl = table(Diastolic,Systolic,Gender,Height,Weight,Age,Smoker);
層化ホールドアウト分割を使用して、データを学習セット tblTrain
とテスト セット tblTest
に分割します。観測値の約 30% がテスト データ セット用に予約され、残りの観測値が学習データ セットに使用されます。
rng("default") % For reproducibility of the partition c = cvpartition(tbl.Smoker,"Holdout",0.30); trainingIndices = training(c); testIndices = test(c); tblTrain = tbl(trainingIndices,:); tblTest = tbl(testIndices,:);
学習セットを使用してニューラル ネットワーク分類器に学習させます。tblTrain
の列 Smoker
を応答変数として指定します。数値予測子を標準化するための指定を行います。
Mdl = fitcnet(tblTrain,"Smoker", ... "Standardize",true);
テスト セットの分類誤差を計算します。分類誤差は、ニューラル ネットワーク分類器の既定の損失タイプです。
testError = loss(Mdl,tblTest,"Smoker")
testError = 0.0671
testAccuracy = 1 - testError
testAccuracy = 0.9329
テスト セットの観測値の約 93% がニューラル ネットワーク モデルで正しく分類されています。
ニューラル ネットワーク分類器に含める特徴量の選択
テスト セットの分類マージン、エッジ、誤差、予測を比較することにより、特徴選択を実行します。すべての予測子を使用して学習させたモデルのテスト セット メトリクスを予測子のサブセットのみを使用して学習させたモデルのテスト セット メトリクスと比較します。
標本ファイル fisheriris.csv
を読み込みます。これには、アヤメについてのがく片の長さ、がく片の幅、花弁の長さ、花弁の幅、種の種類などのデータが格納されています。ファイルを table に読み込みます。
fishertable = readtable('fisheriris.csv');
層化ホールドアウト分割を使用して、データを学習セット trainTbl
とテスト セット testTbl
に分割します。観測値の約 30% がテスト データ セット用に予約され、残りの観測値が学習データ セットに使用されます。
rng("default") c = cvpartition(fishertable.Species,"Holdout",0.3); trainTbl = fishertable(training(c),:); testTbl = fishertable(test(c),:);
学習セット内のすべての予測子を使用して 1 つのニューラル ネットワーク分類器に学習させ、PetalWidth
を除くすべての予測子を使用してもう 1 つの分類器に学習させます。両方のモデルについて、Species
を応答変数として指定し、予測子を標準化します。
allMdl = fitcnet(trainTbl,"Species","Standardize",true); subsetMdl = fitcnet(trainTbl,"Species ~ SepalLength + SepalWidth + PetalLength", ... "Standardize",true);
2 つのモデルのテスト セットの分類マージンを計算します。テスト セットに含まれる観測値は 45 個だけであるため、棒グラフを使用してマージンを表示します。
各観測値の分類マージンは、真のクラスの分類スコアと偽のクラスの最大スコアの差を表します。ニューラル ネットワーク分類器から返される分類スコアは事後確率であるため、マージンの値が 1 に近いほど信頼度が高い分類であることを示し、負のマージンの値は誤分類を示します。
tiledlayout(2,1) % Top axes ax1 = nexttile; allMargins = margin(allMdl,testTbl); bar(ax1,allMargins) xlabel(ax1,"Observation") ylabel(ax1,"Margin") title(ax1,"All Predictors") % Bottom axes ax2 = nexttile; subsetMargins = margin(subsetMdl,testTbl); bar(ax2,subsetMargins) xlabel(ax2,"Observation") ylabel(ax2,"Margin") title(ax2,"Subset of Predictors")
2 つのモデルのテスト セットの分類エッジ (分類マージンの平均) を比較します。
allEdge = edge(allMdl,testTbl)
allEdge = 0.8198
subsetEdge = edge(subsetMdl,testTbl)
subsetEdge = 0.9556
テスト セットの分類マージンと分類エッジからは、予測子のサブセットで学習させたモデルの方がすべての予測子で学習させたモデルよりも性能が優れていると考えられます。
2 つのモデルのテスト セットの分類誤差を比較します。
allError = loss(allMdl,testTbl); allAccuracy = 1-allError
allAccuracy = 0.9111
subsetError = loss(subsetMdl,testTbl); subsetAccuracy = 1-subsetError
subsetAccuracy = 0.9778
この場合も、予測子のサブセットのみを使用して学習させたモデルの方がすべての予測子を使用して学習させたモデルよりも性能が優れていることがわかります。
混同行列を使用してテスト セットの分類結果を可視化します。
allLabels = predict(allMdl,testTbl);
figure
confusionchart(testTbl.Species,allLabels)
title("All Predictors")
subsetLabels = predict(subsetMdl,testTbl);
figure
confusionchart(testTbl.Species,subsetLabels)
title("Subset of Predictors")
すべての予測子を使用して学習させたモデルには、テスト セットの観測値の誤分類が 4 件あります。予測子のサブセットを使用して学習させたモデルでは、テスト セットの観測値の誤分類は 1 件だけです。
2 つのモデルのテスト セットの性能から、PetalWidth
を除くすべての予測子を使用して学習させたモデルを使用することを検討します。
入力引数
Mdl
— 学習させたニューラル ネットワーク分類器
ClassificationNeuralNetwork
モデル オブジェクト | CompactClassificationNeuralNetwork
モデル オブジェクト
学習させたニューラル ネットワーク分類器。fitcnet
によって返される ClassificationNeuralNetwork
モデル オブジェクト、または compact
によって返される CompactClassificationNeuralNetwork
モデル オブジェクトとして指定します。
Tbl
— 標本データ
テーブル
標本データ。テーブルとして指定します。Tbl
の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。オプションとして、応答変数用の追加列を Tbl
に含めることができます。Tbl
には、Mdl
を学習させるために使用したすべての予測子が含まれていなければなりません。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。
Mdl
を学習させるために使用した応答変数がTbl
に含まれている場合、ResponseVarName
またはY
を指定する必要はありません。table に格納されている標本データを使用して
Mdl
に学習をさせた場合、loss
の入力データも table に含まれていなければなりません。Mdl
に学習させるときにfitcnet
で'Standardize',true
を設定した場合、予測子データの数値列が対応する平均および標準偏差を使用して標準化されます。
データ型: table
ResponseVarName
— 応答変数名
Tbl
内の変数の名前
応答変数の名前。Tbl
内の変数の名前で指定します。Mdl
を学習させるために使用した応答変数が Tbl
に含まれている場合、ResponseVarName
を指定する必要はありません。
ResponseVarName
を指定する場合は、文字ベクトルまたは string スカラーとして指定しなければなりません。たとえば、応答変数が Tbl.Y
として格納されている場合、ResponseVarName
として 'Y'
を指定します。それ以外の場合、Tbl
の列は Tbl.Y
を含めてすべて予測子として扱われます。
応答変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列でなければなりません。応答変数が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。
データ型: char
| string
Y
— クラス ラベル
categorical 配列 | 文字配列 | string 配列 | logical ベクトル | 数値ベクトル | 文字ベクトルの cell 配列
クラス ラベル。categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列を指定します。
データ型: categorical
| char
| string
| logical
| single
| double
| cell
X
— 予測子データ
数値行列
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
例: loss(Mdl,Tbl,"Response","LossFun","crossentropy")
は、モデル Mdl
のクロスエントロピー損失を計算するように指定します。
LossFun
— 損失関数
'mincost'
(既定値) | 'binodeviance'
| 'classifcost'
| 'classiferror'
| 'crossentropy'
| 'exponential'
| 'hinge'
| 'logit'
| 'quadratic'
| 関数ハンドル
損失関数。組み込みの損失関数名または関数ハンドルを指定します。
次の表は、使用できる損失関数の一覧です。対応する文字ベクトルまたは string スカラーを使用して、いずれかを指定します。
値 説明 'binodeviance'
二項分布からの逸脱度 'classifcost'
観測誤分類コスト 'classiferror'
10 進数の誤分類率 'crossentropy'
クロスエントロピー損失 (ニューラル ネットワークの場合のみ) 'exponential'
指数損失 'hinge'
ヒンジ損失 'logit'
ロジスティック損失 'mincost'
最小予測誤分類コスト (事後確率である分類スコアの場合) 'quadratic'
二次損失 損失関数の詳細については、分類損失を参照してください。
カスタム損失関数を指定するには、関数ハンドル表記を使用します。関数は次の形式でなければなりません。
lossvalue =
lossfun
(C,S,W,Cost)出力引数
lossvalue
はスカラーです。関数名 (
lossfun
) を指定します。C
はn
行K
列の logical 行列であり、対応する観測値が属するクラスを各行が示します。n
はTbl
またはX
内の観測値の個数、K
は異なるクラスの個数 (numel(Mdl.ClassNames)
) です。列の順序はMdl.ClassNames
のクラスの順序に対応します。各行について観測値p
がクラスq
に属する場合はC(p,q) = 1
を設定することにより、C
を作成します。行p
の他のすべての要素を0
に設定します。S
は、分類スコアのn
行K
列の行列です。列の順序はMdl.ClassNames
のクラスの順序に対応します。S
は分類スコアの行列で、predict
の出力と同様です。W
は、観測値の重みのn
行 1 列の数値ベクトルです。Cost
は、誤分類コストの、K
行K
列の数値行列です。たとえば、Cost = ones(K) – eye(K)
は、正しい分類のコストとして0
を、誤分類のコストとして1
を指定します。
例: 'LossFun','crossentropy'
データ型: char
| string
| function_handle
ObservationsIn
— 予測子データにおける観測値の次元
'rows'
(既定値) | 'columns'
予測子データにおける観測値の次元。'rows'
または 'columns'
として指定します。
メモ
観測値が列に対応するように予測子行列を配置して 'ObservationsIn','columns'
を指定すると、計算時間が大幅に短縮される可能性があります。table の予測子データに対して 'ObservationsIn','columns'
を指定することはできません。
データ型: char
| string
Weights
— 観測値の重み
非負の数値ベクトル | Tbl
内の変数の名前
観測値の重み。非負の数値ベクトルまたは Tbl
内の変数の名前を指定します。ソフトウェアは、X
または Tbl
の各観測値に、Weights
の対応する値で重みを付けます。Weights
の長さは、X
または Tbl
の観測値の数と等しくなければなりません。
入力データをテーブル Tbl
として指定した場合、Weights
は数値ベクトルが含まれている Tbl
内の変数の名前にすることができます。この場合、Weights
には文字ベクトルまたは string スカラーを指定しなければなりません。たとえば、重みベクトル W
が Tbl.W
として格納されている場合、'W'
として指定します。
既定の設定では、Weights
は ones(n,1)
です。n
は X
または Tbl
の観測値数です。
重みを指定した場合、loss
は重み付きの分類損失を計算し、合計がそれぞれのクラスの事前確率の値になるように重みを正規化します。
データ型: single
| double
| char
| string
詳細
分類損失
"分類損失" 関数は分類モデルの予測誤差を評価します。複数のモデルで同じタイプの損失を比較した場合、損失が低い方が予測モデルとして優れていることになります。
以下のシナリオを考えます。
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) を通過するように正規化されています。
バージョン履歴
R2021a で導入R2022a: LossFun
の既定値の変更
R2022a 以降では、関数 loss
で、名前と値の引数 LossFun
の既定値として "mincost"
オプション (最小予測誤分類コスト) が使用されます。"mincost"
オプションは、分類スコアが事後確率の場合に適しています。以前のリリースでは、既定値は "classiferror"
でした。
既定のコスト行列 (正しい分類の場合の要素値は 0、誤った分類の場合の要素値は 1) については、コードに変更を加える必要はありません。
R2022a: 欠損値がある予測子データに対して loss
で NaN が返されることがある
関数 loss
で加重平均分類損失を計算する際に、スコアが NaN の観測値が省略されなくなりました。そのため、予測子データ X
または Tbl
内の予測子変数に欠損値があり、名前と値の引数 LossFun
が "classifcost"
、"classiferror"
、または "mincost"
として指定されていない場合に、loss
で NaN が返されることがあります。ほとんどの場合、テスト セットの観測値に予測子の欠損がなければ、関数 loss
で NaN が返されることはありません。
この変更により、fitcauto
を使用する場合の分類モデルの自動選択が改善されます。この変更の前は、NaN 以外の予測子が少ないモデルが選択される (新しいデータの分類に最適であると予測される) ことがありました。
コードの loss
で NaN が返される場合、このような結果にならないように、次のいずれかを行ってコードを更新できます。
rmmissing
またはfillmissing
を使用して、欠損値を削除するか置き換えます。名前と値の引数
LossFun
を"classifcost"
、"classiferror"
、または"mincost"
として指定します。
次の表に、オブジェクト関数 loss
で NaN が返される可能性がある分類モデルを示します。詳細については、それぞれの関数 loss
の「互換性の考慮事項」を参照してください。
モデル タイプ | 完全またはコンパクトなモデル オブジェクト | オブジェクト関数 loss |
---|---|---|
判別分析分類モデル | ClassificationDiscriminant , CompactClassificationDiscriminant | loss |
分類用のアンサンブル学習器 | ClassificationEnsemble , CompactClassificationEnsemble | loss |
ガウス カーネル分類モデル | ClassificationKernel | loss |
k 最近傍分類モデル | ClassificationKNN | loss |
線形分類モデル | ClassificationLinear | loss |
ニューラル ネットワーク分類モデル | ClassificationNeuralNetwork , CompactClassificationNeuralNetwork | loss |
サポート ベクター マシン (SVM) 分類モデル | loss |
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)