loss
k 最近傍分類器の損失
説明
は、真の分類が L
= loss(mdl
,Tbl
,ResponseVarName
)Tbl.ResponseVarName
に含まれている場合に mdl
が Tbl
内のデータをどの程度適切に分類するかを表すスカラーを返します。mdl
を学習させるために使用した応答変数が Tbl
に含まれている場合、ResponseVarName
を指定する必要はありません。
関数 loss
は、損失を計算するときに、mdl
の Prior
プロパティに格納されている、学習に使用されたクラス確率に対して、Tbl.ResponseVarName
のクラス確率を正規化します。
分類損失 (L
) の意味は損失関数と重み付けの方式によって異なりますが、一般に優れた分類器の方が分類損失の値が小さくなります。詳細は、分類損失を参照してください。
では、前の構文の入力引数に加えて、1 つ以上の名前と値のペアの引数を使用してオプションを指定します。たとえば、損失関数や分類の重みを指定できます。L
= loss(___,Name,Value
)
メモ
X
または Tbl
の予測子データに欠損値があり、LossFun
が "classifcost"
、"classiferror"
、または "mincost"
に設定されていない場合、関数 loss
で NaN が返されることがあります。詳細については、欠損値がある予測子データに対して loss で NaN が返されることがあるを参照してください。
例
フィッシャーのアヤメのデータに対して k 最近傍分類器を作成します。ここで k = 5 です。
フィッシャーのアヤメのデータ セットを読み込みます。
load fisheriris
5 つの最近傍について分類器を作成します。
mdl = fitcknn(meas,species,'NumNeighbors',5);
'versicolor'
として分類された平均観測値に対する分類器の損失を調べます。
X = mean(meas);
Y = {'versicolor'};
L = loss(mdl,X,Y)
L = 0
5 つの最近傍はすべて 'versicolor'
として分類されます。
入力引数
k 最近傍分類モデル。ClassificationKNN
オブジェクトを指定します。
モデルを学習させるために使用する標本データ。table として指定します。Tbl
の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。オプションとして、Tbl
に応答変数用の列を 1 つ追加できます。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。
mdl
を学習させるために使用した応答変数が Tbl
に含まれている場合、ResponseVarName
または Y
を指定する必要はありません。
table に格納されている標本データを使用して mdl
の学習を行う場合、loss
の入力データも table に格納されていなければなりません。
データ型: table
応答変数の名前。Tbl
内の変数の名前で指定します。mdl
を学習させるために使用した応答変数が Tbl
に含まれている場合、ResponseVarName
を指定する必要はありません。
ResponseVarName
には文字ベクトルまたは string スカラーを指定しなければなりません。たとえば、応答変数が Tbl.response
として格納されている場合、'response'
として指定します。それ以外の場合、Tbl
の列は Tbl.response
を含めてすべて予測子として扱われます。
応答変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列でなければなりません。応答変数が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。
データ型: char
| string
予測子データ。数値行列として指定します。X
の各行は 1 つの観測値を、各列は 1 つの変数を表します。
データ型: single
| double
クラス ラベル。categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列を指定します。Y
の各行は、X
の対応する行の分類を表します。
データ型: categorical
| char
| string
| logical
| single
| double
| cell
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで、Name
は引数名で、Value
は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
例: loss(mdl,Tbl,'response','LossFun','exponential','Weights','w')
は、mdl
が Tbl
内のデータを分類する場合の重み付き指数損失を返します。ここで、Tbl.response
は応答変数、Tbl.w
は重みの変数です。
損失関数。'LossFun'
と組み込みの損失関数名または関数ハンドルから構成されるコンマ区切りのペアとして指定します。
次の表は、使用可能な損失関数の一覧です。
値 説明 "binodeviance"
二項分布からの逸脱度 "classifcost"
観測誤分類コスト "classiferror"
10 進数の誤分類率 "exponential"
指数損失 "hinge"
ヒンジ損失 "logit"
ロジスティック損失 "mincost"
最小予測誤分類コスト (事後確率である分類スコアの場合) "quadratic"
二次損失 'mincost'
は、事後確率である分類スコアに適しています。既定では、k 最近傍モデルは分類スコアとして事後確率を返します (predict
を参照)。@lossfun
のように@
を使用すると、カスタム損失関数用の関数ハンドルを指定できます。X
内の観測値の個数を n、異なるクラスの個数 (numel(mdl.ClassNames)
) を K とします。カスタム損失関数は、次のような形式にしなければなりません。function lossvalue = lossfun(C,S,W,Cost)
C
は n 行 K 列の logical 行列であり、対応する観測値が属するクラスを各行が示します。列の順序はmdl.ClassNames
のクラスの順序に対応します。各行について観測値p
がクラスq
に属する場合はC(p,q) = 1
を設定することにより、C
を作成します。行p
の他のすべての要素を0
に設定します。S
は、分類スコアの n 行 K 列の行列です。列の順序はmdl.ClassNames
のクラスの順序に対応します。引数S
は、predict
の出力と同様の分類スコアの行列です。W
は、観測値の重みの n 行 1 列の数値ベクトルです。W
を渡す場合、重みは合計が1
になるように正規化されます。Cost
は、誤分類コストの、K 行 K 列の数値行列です。たとえば、Cost = ones(K) – eye(K)
は、正しい分類のコストとして0
を、誤分類のコストとして1
を指定します。出力引数
lossvalue
はスカラーです。
損失関数の詳細については、分類損失を参照してください。
データ型: char
| string
| function_handle
観測値の重み。'Weights'
と数値ベクトル、または Tbl
に含まれる変数の名前から構成されるコンマ区切りのペアとして指定します。
数値ベクトルで Weights
を指定する場合、Weights
のサイズは X
または Tbl
の行数と等しくなければなりません。
Weights
として Tbl
内の変数名を指定する場合、名前は文字ベクトルまたは string スカラーでなければなりません。たとえば、重みが Tbl.w
として格納されている場合、Weights
として 'w'
を指定します。それ以外の場合、Tbl
の列は Tbl.w
を含めてすべて予測子として扱われます。
loss
は、各クラスの観測値について重みの合計がそのクラスの事前確率になるように、重みを正規化します。Weights
を指定した場合、loss
は重み付きの分類損失を計算します。
例: 'Weights','w'
データ型: 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) を通過するように正規化されています。
KNN 分類には、クラスごとの真の誤分類コストおよび観測値ごとの予測誤分類コストという 2 つのコストが関連付けられています。
fitcknn
を実行するときに名前と値のペアの引数 'Cost'
を使用することにより、クラスごとの真の誤分類コストを設定できます。値 Cost(i,j)
は、真のクラスが i
である観測値をクラス j
に分類するコストです。既定では、Cost(i,j) = 1
(i ~= j
の場合) および Cost(i,j) = 0
(i = j
の場合) です。つまり、正しい分類のコストは 0
、誤った分類のコストは 1
です。
KNN 分類には、クラスごとの真の誤分類コストおよび観測値ごとの予測誤分類コストという 2 つのコストが関連付けられています。predict
の 3 番目の出力は、観測ごとの予測誤分類コストです。
学習済みの分類器 mdl
を使用して Nobs
個の観測値を分類するとします。また、K
個のクラスがあるとします。1 行に 1 観測ずつ、観測値を行列 Xnew
に置きます。次のコマンド
[label,score,cost] = predict(mdl,Xnew)
これは、他の出力に加えて、Nobs
行 K
列の行列 cost
を返します。cost
行列の各行には、観測をそれぞれのクラス K
に分類する予測 (平均) コストが含まれます。cost(n,j)
は次のとおりです。
ここで
K は、クラスの数です。
は、観測値 Xnew(n) のクラス i の事後確率です。
は、真のクラスが i である観測値を j に分類する真の誤分類コストです。
拡張機能
loss
関数は、tall 配列を完全にサポートします。詳細は、tall 配列を参照してください。
使用上の注意および制限:
次のように指定された
ClassificationKNN
モデルに対しては、loss
で GPU 配列はサポートされません。NSMethod
プロパティが"kdtree"
として指定されている。Distance
プロパティが"fasteuclidean"
、"fastseuclidean"
、または関数ハンドルとして指定されている。IncludeTies
プロパティがtrue
として指定されている。
詳細は、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2012a で導入関数 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 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)