メインコンテンツ

loss

R2026b

線形分類モデルの分類損失

説明

L = loss(Mdl,X,Y) は、X 内の予測子データと Y 内の対応するクラス ラベルを使用して、バイナリ線形分類モデル Mdl の分類損失を返します。L には、Mdl の各正則化強度に対する分類誤差率が格納されます。

例

L = loss(Mdl,Tbl,ResponseVarName) は、Tbl 内の予測子データと Tbl.ResponseVarName 内の真のクラス ラベルに対する分類損失を返します。

L = loss(Mdl,Tbl,Y) は、テーブル Tbl 内の予測子データと Y 内の真のクラス ラベルに対する分類損失を返します。

L = loss(___,Name=Value) では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、予測子データの列が観測値に対応することや分類損失関数を指定します。

例

例

すべて折りたたむ

NLP のデータ セットを読み込みます。

load nlpdata

X は予測子データのスパース行列、Y はクラス ラベルの categorical ベクトルです。データには 2 つを超えるクラスがあります。

モデルでは、ある Web ページの単語数が Statistics and Machine Learning Toolbox™ ドキュメンテーションによるものであるかどうかを識別できなければなりません。したがって、Statistics and Machine Learning Toolbox™ のドキュメンテーション Web ページに対応するラベルを識別します。

Ystats = Y == "stats";

あるドキュメンテーション Web ページの単語数が Statistics and Machine Learning Toolbox™ ドキュメンテーションによるものであるかどうかを識別できるバイナリ線形分類モデルに学習をさせます。観測値の 30% をホールドアウトするように指定します。SpaRSA を使用して目的関数を最適化します。

rng(1) % For reproducibility 
CVMdl = fitclinear(X,Ystats,Solver="sparsa",Holdout=0.30);
CMdl = CVMdl.Trained{1};

CVMdl は ClassificationPartitionedLinear モデルです。これには Trained プロパティが含まれています。これは 1 行 1 列の cell 配列で、学習セットにより学習させた ClassificationLinear モデルが格納されています。

学習データとテスト データを分割の定義から抽出します。

trainIdx = training(CVMdl.Partition);
testIdx = test(CVMdl.Partition);

学習標本およびテスト標本の分類誤差を推定します。

ceTrain = loss(CMdl,X(trainIdx,:),Ystats(trainIdx))
ceTrain = 
1.3572e-04
ceTest = loss(CMdl,X(testIdx,:),Ystats(testIdx))
ceTest = 
5.2804e-04

CMdl 内の正則化強度は 1 つなので、ceTrain と ceTest は数値スカラーになります。

NLP のデータ セットを読み込みます。テスト標本の分類損失の推定で説明されているようにデータを前処理し、予測子データを転置します。

load nlpdata
Ystats = Y == "stats";
X = X';

バイナリ線形分類モデルに学習をさせます。観測値の 30% をホールドアウトするように指定します。SpaRSA を使用して目的関数を最適化します。予測子の観測値が列に対応することを指定します。

rng(1) % For reproducibility 
CVMdl = fitclinear(X,Ystats,Solver="sparsa",Holdout=0.30, ...
    ObservationsIn="columns");
CMdl = CVMdl.Trained{1};

CVMdl は ClassificationPartitionedLinear モデルです。これには Trained プロパティが含まれています。これは 1 行 1 列の cell 配列で、学習セットにより学習させた ClassificationLinear モデルが格納されています。

学習データとテスト データを分割の定義から抽出します。

trainIdx = training(CVMdl.Partition);
testIdx = test(CVMdl.Partition);

次の線形損失を評価する無名関数を作成します。

L=∑j-wjyjfj∑jwj.

wj は観測値 j の重み、yj は応答 j (陰性クラスの場合は -1、それ以外の場合は 1)、fj は観測値 j の生の分類スコアです。カスタム損失関数は特定の形式で記述しなければなりません。カスタム損失関数の記述に関するルールについては、名前と値の引数 LossFun を参照してください。

linearloss = @(C,S,W,Cost)sum(-W.*sum(S.*C,2))/sum(W);

線形損失関数を使用して、学習標本およびテスト標本の分類損失を推定します。

ceTrain = loss(CMdl,X(:,trainIdx),Ystats(trainIdx),LossFun=linearloss, ...
    ObservationsIn="columns")
ceTrain = 
-7.8330
ceTest = loss(CMdl,X(:,testIdx),Ystats(testIdx),LossFun=linearloss, ...
    ObservationsIn="columns")
ceTest = 
-7.7383

ロジスティック回帰学習器を使用する線形分類モデルに適した LASSO ペナルティの強度を決定するため、テスト標本の分類誤差率を比較します。

NLP のデータ セットを読み込みます。カスタムな分類損失の指定で説明されているようにデータを前処理します。

load nlpdata
Ystats = Y == "stats";
X = X'; 

rng(10) % For reproducibility
Partition = cvpartition(Ystats,Holdout=0.30);
testIdx = test(Partition);
XTest = X(:,testIdx);
YTest = Ystats(testIdx);

10-6 ~ 10-0.5 の範囲で対数間隔で配置された 11 個の正則化強度を作成します。

Lambda = logspace(-6,-0.5,11);

各正則化強度を使用するバイナリ線形分類モデルに学習をさせます。SpaRSA を使用して目的関数を最適化します。目的関数の勾配の許容誤差を 1e-8 に下げます。

CVMdl = fitclinear(X,Ystats,ObservationsIn="columns", ...
    CVPartition=Partition,Learner="logistic",Solver="sparsa", ...
    Regularization="lasso",Lambda=Lambda,GradientTolerance=1e-8)
CVMdl = 
  ClassificationPartitionedLinear
    CrossValidatedModel: 'Linear'
           ResponseName: 'Y'
        NumObservations: 31572
                  KFold: 1
              Partition: [1×1 cvpartition]
             ClassNames: [0 1]
         ScoreTransform: 'none'


  Properties, Methods

学習済みの線形分類モデルを抽出します。

Mdl = CVMdl.Trained{1}
Mdl = 
  ClassificationLinear
      ResponseName: 'Y'
        ClassNames: [0 1]
    ScoreTransform: 'logit'
              Beta: [34023×11 double]
              Bias: [-12.1623 -12.1623 -12.1623 -12.1623 -12.1623 -6.2503 -5.0651 -4.2165 -3.3990 -3.2452 -2.9783]
            Lambda: [1.0000e-06 3.5481e-06 1.2589e-05 4.4668e-05 1.5849e-04 5.6234e-04 0.0020 0.0071 0.0251 0.0891 0.3162]
           Learner: 'logistic'


  Properties, Methods

Mdl は ClassificationLinear モデル オブジェクトです。Lambda は正則化強度のシーケンスなので、Mdl はそれぞれが Lambda の各正則化強度に対応する 11 個のモデルであると考えることができます。

テスト標本の分類誤差を推定します。

ce = loss(Mdl,X(:,testIdx),Ystats(testIdx),ObservationsIn="columns");

11 個の正則化強度があるので、ce は 1 行 11 列の分類誤差率のベクトルです。

Lambda の値が大きくなると、予測子変数がスパースになります。これは分類器の品質として優れています。データ セット全体を使用し、モデルの交差検証を行ったときと同じオプションを指定して、各正則化強度について線形分類モデルに学習をさせます。モデルごとに非ゼロの係数を特定します。

Mdl = fitclinear(X,Ystats,ObservationsIn="columns", ...
    Learner="logistic",Solver="sparsa",Regularization="lasso", ...
    Lambda=Lambda,GradientTolerance=1e-8);
numNZCoeff = sum(Mdl.Beta~=0);

同じ図に、各正則化強度についてのテスト標本の誤差率と非ゼロ係数の頻度をプロットします。すべての変数を対数スケールでプロットします。

figure
yyaxis left
plot(log10(Lambda),log10(ce),"-o")
ylabel("log_{10} classification error")

yyaxis right
plot(log10(Lambda),log10(numNZCoeff + 1),"-o")
ylabel("log_{10} nonzero-coefficient frequency")

xlabel("log_{10} Lambda")
title("Test-Sample Statistics")

Figure contains an axes object. The axes object with title Test-Sample Statistics, xlabel log indexOf 10 baseline Lambda, ylabel log indexOf 10 baseline nonzero-coefficient frequency contains 2 objects of type line.

予測子変数のスパース性と分類誤差の低さのバランスがとれている正則化強度のインデックスを選択します。この場合、10-4 ~ 10-1 の値で十分なはずです。

idxFinal = 7;

選択した正則化強度のモデルを Mdl から選択します。

MdlFinal = selectModels(Mdl,idxFinal);

MdlFinal は、1 つの正則化強度が含まれている ClassificationLinear モデルです。新しい観測値のラベルを推定するには、MdlFinal と新しいデータを predict に渡します。

入力引数

すべて折りたたむ

バイナリ線形分類モデル。ClassificationLinear モデル オブジェクトとして指定します。ClassificationLinear モデル オブジェクトは、fitclinear を使用して作成できます。

予測子データ。n 行 p 列の完全な行列またはスパース行列を指定します。この X の配置は、各行が個々の観測値に、各列が個々の予測子変数に対応することを示しています。

メモ

観測値が列に対応するように予測子行列を配置して ObservationsIn="columns" を指定すると、計算時間が大幅に短縮される可能性があります。

Y の長さと X の観測値数は同じでなければなりません。

データ型: single | double

クラス ラベル。categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列を指定します。

  • Y のデータ型は Mdl.ClassNames のデータ型と同じでなければなりません。(string 配列は文字ベクトルの cell 配列として扱われます)。

  • Y の各クラスは Mdl.ClassNames のサブセットでなければなりません。

  • Y が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。

  • Y の長さは X または Tbl の観測値の数と等しくなければなりません。

データ型: categorical | char | string | logical | single | double | cell

モデルを学習させるために使用する標本データ。table として指定します。Tbl の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。必要に応じて、応答変数用および観測値の重み用の追加列を Tbl に含めることができます。Tbl には、Mdl を学習させるために使用したすべての予測子が含まれていなければなりません。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。

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

テーブルに格納されている標本データを使用して Mdl の学習を行った場合、loss の入力データもテーブルに格納されていなければなりません。

応答変数の名前。Tbl 内の変数の名前で指定します。Mdl を学習させるために使用した応答変数が Tbl に含まれている場合、ResponseVarName を指定する必要はありません。

ResponseVarName を指定する場合は、文字ベクトルまたは string スカラーとして指定しなければなりません。たとえば、応答変数が Tbl.Y として格納されている場合、ResponseVarName として "Y" を指定します。それ以外の場合、Tbl の列は Tbl.Y を含めてすべて予測子として扱われます。

応答変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列でなければなりません。応答変数が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。

データ型: char | string

名前と値の引数

すべて折りたたむ

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

例: loss(Mdl,Tbl,"Response",LossFun="hinge") は、モデル Mdl のヒンジ損失を計算するように指定します。

損失関数。組み込みの損失関数名または関数ハンドルとして指定します。

  • 次の表は、使用可能な損失関数の一覧です。対応する文字ベクトルまたは string スカラーを使用して、いずれかを指定します。

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

    "mincost" は、事後確率である分類スコアに適しています。線形分類モデルの場合、既定の設定ではロジスティック回帰学習器は事後確率を分類スコアとして返しますが、SVM 学習器はそうではありません (predict を参照)。

  • カスタム損失関数を指定するには、関数ハンドル表記を使用します。関数は次の形式でなければなりません。

    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=@lossfun

データ型: char | string | function_handle

予測子データにおける観測値の次元。"rows" または "columns" として指定します。

メモ

観測値が列に対応するように予測子行列を配置して ObservationsIn="columns" を指定すると、計算時間が大幅に短縮される可能性があります。table の予測子データに対して ObservationsIn="columns" を指定することはできません。

例: ObservationsIn="columns"

データ型: char | string

R2026b 以降

クラスの重み (事前確率)。"empirical"、"uniform"、または数値ベクトルとして指定します。

値説明
"empirical" loss は、Y または Tbl.ResponseVarName におけるクラスの頻度を使用します。クラスに関して重み付けされていない損失が関数から返されます。
"uniform" loss は、1/K の重みを各クラスに割り当てます。ここで、K はクラスの個数です。
数値ベクトルクラスごとにカスタムの重みを指定します。重みの合計は 1 と等しくなければなりません。

既定では、loss は、分類モデルの Prior プロパティで指定されたクラス事前確率を使用します。

例: Prior="empirical"

データ型: single | double | char | string

観測値の重み。数値ベクトルまたは Tbl 内の変数の名前を指定します。

  • Weights として数値ベクトルを指定する場合、Weights のサイズは X または Tbl 内の観測値の個数と等しくなければなりません。

  • Weights として Tbl 内の変数名を指定する場合、名前は文字ベクトルまたは string スカラーでなければなりません。たとえば、重みが Tbl.W として格納されている場合、Weights として "W" を指定します。それ以外の場合、Tbl の列は Tbl.W を含めてすべて予測子として扱われます。

重みを指定した場合、各正則化強度について、loss は、加重分類損失を計算し、合計がそれぞれのクラスの事前確率の値になるように重みを正規化します。

データ型: double | single

出力引数

すべて折りたたむ

分類損失。数値スカラーまたは行ベクトルとして返されます。L の解釈は、LossFun、Prior、および Weights によって異なります。

L のサイズは Mdl.Lambda と同じです。L(j) は、正則化強度 Mdl.Lambda(j) を使用して学習をさせた線形分類モデルの分類損失です。

詳細については、分類損失を参照してください。

詳細

すべて折りたたむ

ヒント

  • 既定では、loss は、学習時に指定されたクラス確率 (分類モデルの Prior プロパティに格納) を使用して分類損失を計算します。クラスで重み付けされていない損失を返すには、Prior="empirical" を指定します。 (R2026b 以降)

  • X または Tbl の予測子データに欠損値があり、LossFun が "classifcost"、"classiferror"、または "mincost" に設定されていない場合、loss 関数で NaN が返されることがあります。 (R2022a 以降)

    コードの loss で NaN が返される場合、このような結果にならないように、次のいずれかを行ってコードを更新できます。

    • rmmissing または fillmissing を使用して、欠損値を削除するか置き換えます。

    • 名前と値の引数 LossFun を "classifcost"、"classiferror"、または "mincost" として指定します。

拡張機能

すべて展開する

バージョン履歴

R2016a で導入

すべて展開する