ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

loss

k 最近傍分類器の損失

説明

L = loss(mdl,tbl,ResponseVarName) は、真の分類が tbl.ResponseVarName に含まれている場合に mdltbl 内のデータをどの程度適切に分類するかを表すスカラーを返します。mdl を学習させるために使用した応答変数が tbl に含まれている場合、ResponseVarName を指定する必要はありません。

関数 loss は、損失を計算するときに、mdlPrior プロパティに格納されている、学習に使用されたクラス確率に対して、tbl.ResponseVarName のクラス確率を正規化します。

分類損失 (L) の意味は損失関数と重み付けの方式によって異なりますが、一般に優れた分類器の方が分類損失の値が小さくなります。詳細は、分類損失を参照してください。

L = loss(mdl,tbl,Y) は、真の分類が Y に含まれている場合に mdltbl 内のデータをどの程度適切に分類するかを表すスカラーを返します。

関数 loss は、損失を計算するときに、mdlPrior プロパティに格納されている、学習に使用されたクラス確率に対して、Y のクラス確率を正規化します。

L = loss(mdl,X,Y) は、真の分類が Y に含まれている場合に mdlX 内のデータをどの程度適切に分類するかを表すスカラーを返します。

関数 loss は、損失を計算するときに、mdlPrior プロパティに格納されている、学習に使用されたクラス確率に対して、Y のクラス確率を正規化します。

L = loss(___,Name,Value) では、前の構文の入力引数に加えて、1 つ以上の名前と値のペアの引数を使用してオプションを指定します。たとえば、損失関数や分類の重みを指定できます。

すべて折りたたむ

フィッシャーのアヤメのデータに対して 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 オブジェクトを指定します。

モデルを学習させるために使用する標本データ。テーブルとして指定します。tbl の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。オプションとして、tbl に応答変数用の列を 1 つ追加できます。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。

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

table に格納されている標本データを使用して mdl に学習をさせた場合、loss の入力データも 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 の対応する行の分類を表します。

データ型: カテゴリカル | char | string | logical | single | double | cell

名前と値のペアの引数

オプションの Name,Value 引数のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

例: loss(mdl,tbl,'response','LossFun','exponential','Weights','w') は、mdltbl 内のデータを分類する場合の重み付き指数損失を返します。ここで、tbl.response は応答変数、tbl.w は重みの変数です。

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

  • 次の表は、使用可能な損失関数の一覧です。

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

    '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 を使用して符号化されます。

    • f(Xj) は予測子データ X の観測値 (行) j に対する生の分類スコアです。

    • mj = yjf(Xj) は、yj に対応するクラスに観測値 j を分類する分類スコアです。正の値の mj は正しい分類を示しており、平均損失に対する寄与は大きくありません。負の値の mj は正しくない分類を示しており、平均損失に大きく寄与します。

  • マルチクラス分類 (つまり、K ≧ 3) をサポートするアルゴリズムの場合、次のようになります。

    • yj* は、K - 1 個の 0 と、観測された真のクラス yj に対応する位置の 1 から構成されるベクトルです。たとえば、2 番目の観測値の真のクラスが 3 番目のクラスであり K = 4 の場合、y*2 = [0 0 1 0]′になります。クラスの順序は入力モデルの ClassNames プロパティ内の順序に対応します。

    • f(Xj) は予測子データ X の観測値 j に対するクラス スコアのベクトルで、長さは K です。スコアの順序は入力モデルの ClassNames プロパティ内のクラスの順序に対応します。

    • mj = yj*′f(Xj).したがって mj は、観測された真のクラスについてモデルが予測するスカラー分類スコアです。

  • 観測値 j の重みは wj です。観測値の重みは正規化され、合計は対応するクラスの事前確率になります。また、事前確率は合計が 1 になるように正規化されます。したがって、次のようになります。

    j=1nwj=1.

この状況では、名前と値のペアの引数 'LossFun' を使用して指定できる、サポートされる損失関数は次の表のようになります。

損失関数LossFun の値
二項分布からの逸脱度'binodeviance'L=j=1nwjlog{1+exp[2mj]}.
指数損失'exponential'L=j=1nwjexp(mj).
分類誤差'classiferror'

L=j=1nwjI{y^jyj}.

これは重み付きの誤分類観測値の比率です。y^j は、事後確率が最大であるクラスに対応するクラス ラベルです。I{x} はインジケーター関数です。

ヒンジ損失'hinge'L=j=1nwjmax{0,1mj}.
ロジット損失'logit'L=j=1nwjlog(1+exp(mj)).
最小コスト'mincost'

最小コスト。重み付きの最小コストは、次の手順を観測値 j = 1、...、n について使用することにより計算されます。

  1. 観測値 j の予測分類コストから構成される 1 行 K 列のベクトルを推定します。

    γj=f(Xj)C.

    f(Xj) はバイナリおよびマルチクラス分類におけるクラスの事後確率の列ベクトルです。C は入力モデルの Cost プロパティに格納されるコスト行列です。

  2. 最小の予測分類コストに対応するクラス ラベルを観測値 j について予測します。

    y^j=minj=1,...,K(γj).

  3. C を使用して、予測を行うために必要なコスト (cj) を求めます。

重み付きの平均最小コスト損失は次のようになります。

L=j=1nwjcj.

二次損失'quadratic'L=j=1nwj(1mj)2.

次の図では、mに対する 1 つの観測値の ('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)

これは、他の出力に加えて、NobsK 列の行列 cost を返します。cost 行列の各行には、観測をそれぞれのクラス K に分類する予測 (平均) コストが含まれます。cost(n,j) は次のとおりです。

i=1KP^(i|Xnew(n))C(j|i),

ここで、

  • K は、クラスの数です。

  • P^(i|Xnew(n)) は、観測値 Xnew(n) のクラス i の事後確率です。

  • C(j|i) は、真のクラスが i である観測値を j に分類する真の誤分類コストです。

拡張機能

R2012a で導入