Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

kfoldLoss

交差検証済み分類モデルの分類損失

    説明

    L = kfoldLoss(CVMdl) は、交差検証済みの分類モデル CVMdl で取得した分類損失を返します。kfoldLoss は、すべての分割について、学習分割観測値で学習させた分類器を使用して検証分割観測値の分類損失を計算します。CVMdl.X および CVMdl.Y には、両方の観測値のセットが含まれます。

    L = kfoldLoss(CVMdl,Name,Value) は、1 つ以上の名前と値の引数で指定された追加オプションを使用して分類損失を返します。たとえば、カスタムの損失関数を指定できます。

    すべて折りたたむ

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

    load ionosphere

    分類木を成長させます。

    tree = fitctree(X,Y);

    10 分割交差検証を使用して分類木を交差検証します。

    cvtree = crossval(tree);

    交差検証分類誤差を推定します。

    L = kfoldLoss(cvtree)
    L = 0.1083
    

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

    load ionosphere

    AdaBoostM1 を使用して、100 本の決定木によるアンサンブル分類に学習をさせます。弱学習器として木の切り株を指定します。

    t = templateTree('MaxNumSplits',1);
    ens = fitcensemble(X,Y,'Method','AdaBoostM1','Learners',t);

    10 分割交差検証を使用してアンサンブルを交差検証します。

    cvens = crossval(ens);

    交差検証分類誤差を推定します。

    L = kfoldLoss(cvens)
    L = 0.0655
    

    交差検証済みの 10 分割の一般化加法モデル (GAM) に学習させます。その後、kfoldLoss を使用して交差検証の累積分類誤差 (10 進数の誤分類率) を計算します。誤差を使用して、予測子 (予測子の線形項) あたりの最適な木の数と交互作用項あたりの最適な木の数を特定します。

    代わりに、関数 bayesopt を使用して fitcgam の名前と値の引数の最適な値を特定することもできます。例については、bayesopt を使用した交差検証済みの GAM の最適化を参照してください。

    ionosphere データセットを読み込みます。このデータセットには、レーダー反射についての 34 個の予測子と、不良 ('b') または良好 ('g') という 351 個の二項反応が含まれています。

    load ionosphere

    既定の交差検証オプションを使用して交差検証済み GAM を作成します。名前と値の引数 'CrossVal''on' として指定します。p 値が 0.05 以下である利用可能な交互作用項をすべて含めるように指定します。

    rng('default') % For reproducibility
    CVMdl = fitcgam(X,Y,'CrossVal','on','Interactions','all','MaxPValue',0.05);

    'Mode''cumulative' として指定すると、関数 kfoldLoss は累積誤差を返します。これは、各分割に同じ数の木を使用して取得したすべての分割の平均誤差です。各分割の木の数を表示します。

    CVMdl.NumTrainedPerFold 
    ans = struct with fields:
          PredictorTrees: [65 64 59 61 60 66 65 62 64 61]
        InteractionTrees: [1 2 2 2 2 1 2 2 2 2]
    
    

    kfoldLoss では、最大で 59 個の予測子木と 1 個の交互作用木を使用して累積誤差を計算できます。

    10 分割交差検証を行った累積分類誤差 (10 進数の誤分類率) をプロットします。'IncludeInteractions'false として指定して、計算から交互作用項を除外します。

    L_noInteractions = kfoldLoss(CVMdl,'Mode','cumulative','IncludeInteractions',false);
    figure
    plot(0:min(CVMdl.NumTrainedPerFold.PredictorTrees),L_noInteractions)

    Figure contains an axes. The axes contains an object of type line.

    L_noInteractions の最初の要素は、切片 (定数) 項のみを使用して取得したすべての分割の平均誤差です。L_noInteractions の (J+1) 番目の要素は、切片項と各線形項の最初の J 個の予測子木を使用して取得した平均誤差です。累積損失をプロットすると、GAM の予測子木の数が増えるにつれて誤差がどのように変化するかを観察できます。

    最小誤差とその最小誤差の達成時に使用された予測子木の数を調べます。

    [M,I] = min(L_noInteractions)
    M = 0.0655
    
    I = 23
    

    GAM に 22 個の予測子木が含まれるときに誤差が最小になっています。

    線形項と交互作用項の両方を使用して累積分類誤差を計算します。

    L = kfoldLoss(CVMdl,'Mode','cumulative')
    L = 2×1
    
        0.0712
        0.0712
    
    

    L の最初の要素は、切片 (定数) 項と各線形項のすべての予測子木を使用して取得したすべての分割の平均誤差です。L の 2 番目の要素は、切片項、各線形項のすべての予測子木、および各交互作用項の 1 つの交互作用木を使用して取得した平均誤差です。交互作用項を追加しても誤差は小さくなっていません。

    予測子木の数が 22 個のときの誤差で問題がなければ、一変量の GAM にもう一度学習させ、交差検証を使用せずに 'NumTreesPerPredictor',22 と指定して予測モデルを作成できます。

    入力引数

    すべて折りたたむ

    交差検証された分割済みの分類器。ClassificationPartitionedModel オブジェクト、ClassificationPartitionedEnsemble オブジェクトまたは ClassificationPartitionedGAM オブジェクトを指定します。オブジェクトは 2 つの方法で作成できます。

    • 次の表に記載されている学習済み分類モデルをそのオブジェクト関数 crossval に渡す。

    • 次の表に記載されている関数を使用して分類モデルに学習をさせ、その関数の交差検証に関する名前と値の引数のいずれかを指定する。

    名前と値のペアの引数

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

    例: kfoldLoss(CVMdl,'Folds',[1 2 3 5]) は、分類損失の計算に 1 番目、2 番目、3 番目、および 5 番目の分割を使用し、4 番目の分割は除外するように指定します。

    使用する分割のインデックス。正の整数ベクトルとして指定します。Folds の要素は 1 から CVMdl.KFold の範囲でなければなりません。

    Folds で指定された分割のみが使用されます。

    例: 'Folds',[1 4 10]

    データ型: single | double

    モデルの交互作用項を含めるフラグ。true または false として指定します。この引数は、一般化加法モデル (GAM) の場合のみ有効です。つまり、この引数を指定できるのは、CVMdlClassificationPartitionedGAM である場合だけです。

    CVMdl のモデル (CVMdl.Trained) に交互作用項が含まれる場合、既定値は true です。モデルに交互作用項が含まれない場合、値は false でなければなりません。

    データ型: logical

    損失関数。組み込みの損失関数名または関数ハンドルを指定します。既定の損失関数は、モデル CVMdl のタイプによって異なります。

    • モデルのタイプがアンサンブル、一般化加法モデル、ニューラル ネットワーク、またはサポート ベクター マシン分類器の場合、既定値は 'classiferror' です。

    • モデルのタイプが判別分析、k 最近傍、単純ベイズ、または木分類器の場合、既定値は 'mincost' です。

    'classiferror''mincost' は、既定のコスト行列を使用する場合は同じです。詳細については、アルゴリズムを参照してください。

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

      説明
      'binodeviance'二項分布からの逸脱度
      'classiferror'10 進数の誤分類率
      'crossentropy'クロスエントロピー損失 (ニューラル ネットワークの場合のみ)
      'exponential'指数損失
      'hinge'ヒンジ損失
      'logit'ロジスティック損失
      'mincost'最小予測誤分類コスト (事後確率である分類スコアの場合)
      'quadratic'二次損失

      'mincost' は、事後確率である分類スコアに適しています。判別分析、一般化加法モデル、k 最近傍、単純ベイズ、ニューラル ネットワーク、および木分類器の関数 predictkfoldPredict は、そのようなスコアを既定で返します。

      • 'Bag' または 'Subspace' のメソッドを使用するアンサンブル モデルの場合、分類スコアは既定で事後確率になります。'AdaBoostM1''AdaBoostM2'GentleBoost、または 'LogitBoost' のメソッドを使用するアンサンブル モデルの場合は、ダブルロジットのスコア変換を指定することで事後確率を分類スコアとして使用できます。たとえば、次のように入力します。

        CVMdl.ScoreTransform = 'doublelogit';
        他のすべてのアンサンブル法の場合、事後確率は分類スコアとしてサポートされていません。

      • SVM モデルの場合、fitcsvm を使用してモデルを交差検証するときに 'FitPosterior',true を設定することで、事後確率を分類スコアとして使用するように指定できます。

    • 関数ハンドル表記を使用して独自の関数を指定します。

      n は学習データの観測値数 (CVMdl.NumObservations)、K はクラス数 (numel(CVMdl.ClassNames)) とします。使用する関数ではシグネチャが lossvalue = lossfun(C,S,W,Cost) になっていなければなりません。ここで

      • 出力引数 lossvalue はスカラーです。

      • 関数名 (lossfun) を指定します。

      • CnK 列の logical 行列であり、対応する観測値が属するクラスを各行が示します。列の順序は CVMdl.ClassNames のクラスの順序に対応します。

        C を作成するには、各行について観測値 p がクラス q に含まれている場合に C(p,q) = 1 を設定します。行 p の他のすべての要素を 0 に設定します。

      • S は、分類スコアの nK 列の行列です。列の順序は CVMdl.ClassNames のクラスの順序に対応します。入力 S は、kfoldPredict の出力引数 score に似ています。

      • W は、観測値の重みの n 行 1 列の数値ベクトルです。W を渡す場合、その要素は正規化され、合計が 1 になります。

      • Cost は、誤分類コストの、KK 列の数値行列です。たとえば、Cost = ones(K) – eye(K) は、正しい分類のコストとして 0 を、誤分類のコストとして 1 を指定します。

      'LossFun',@lossfun を使用して独自の関数を指定します。

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

    例: 'LossFun','hinge'

    データ型: char | string | function_handle

    出力の集約レベル。'average''individual'、または 'cumulative' として指定します。

    説明
    'average'出力は、すべての分割の平均を表すスカラー値です。
    'individual'出力は、分割ごとに 1 つずつの値が含まれている長さ k のベクトルです。k は分割数です。
    'cumulative'

    メモ

    この値を指定する場合、CVMdlClassificationPartitionedEnsemble オブジェクトまたは ClassificationPartitionedGAM オブジェクトでなければなりません。

    • CVMdlClassificationPartitionedEnsemble の場合、出力は長さ min(CVMdl.NumTrainedPerFold) のベクトルです。各要素 j は、弱学習器 1:j で学習させたアンサンブルを使用して取得したすべての分割の平均です。

    • CVMdlClassificationPartitionedGAM の場合、出力の値は IncludeInteractions の値によって異なります。

      • IncludeInteractionsfalse の場合、L(1 + min(NumTrainedPerFold.PredictorTrees)) 行 1 列の数値列ベクトルです。L の最初の要素は、切片 (定数) 項のみを使用して取得したすべての分割の平均です。L(j + 1) 番目の要素は、切片項と各線形項の最初の j 個の予測子木を使用して取得した平均です。

      • IncludeInteractionstrue の場合、L(1 + min(NumTrainedPerFold.InteractionTrees)) 行 1 列の数値列ベクトルです。L の最初の要素は、切片 (定数) 項と各線形項のすべての予測子木を使用して取得したすべての分割の平均です。L(j + 1) 番目の要素は、切片項、各線形項のすべての予測子木、および各交互作用項の最初の j 個の交互作用木を使用して取得した平均です。

    例: 'Mode','individual'

    出力引数

    すべて折りたたむ

    分類損失。数値スカラーまたは数値列ベクトルとして返されます。

    • Mode'average' である場合、L はすべての分割の平均分類損失です。

    • Mode'individual' である場合、L は各分割の分類損失が含まれている k 行 1 列の数値列ベクトルです。k は分割数です。

    • Mode'cumulative'CVMdlClassificationPartitionedEnsemble である場合、Lmin(CVMdl.NumTrainedPerFold) 行 1 列の数値列ベクトルです。各要素 j は、弱学習器 1:j で学習させたアンサンブルを使用して取得したすべての分割の平均分類損失です。

    • Mode'cumulative'CVMdlClassificationPartitionedGAM の場合、出力の値は IncludeInteractions の値によって異なります。

      • IncludeInteractionsfalse の場合、L(1 + min(NumTrainedPerFold.PredictorTrees)) 行 1 列の数値列ベクトルです。L の最初の要素は、切片 (定数) 項のみを使用して取得したすべての分割の平均分類損失です。L(j + 1) 番目の要素は、切片項と各線形項の最初の j 個の予測子木を使用して取得した平均損失です。

      • IncludeInteractionstrue の場合、L(1 + min(NumTrainedPerFold.InteractionTrees)) 行 1 列の数値列ベクトルです。L の最初の要素は、切片 (定数) 項と各線形項のすべての予測子木を使用して取得したすべての分割の平均分類損失です。L(j + 1) 番目の要素は、切片項、各線形項のすべての予測子木、および各交互作用項の最初の j 個の交互作用木を使用して取得した平均損失です。

    詳細

    すべて折りたたむ

    分類損失

    "分類損失" 関数は分類モデルの予測誤差を評価します。複数のモデルで同じタイプの損失を比較した場合、損失が低い方が予測モデルとして優れていることになります。

    以下のシナリオを考えます。

    • 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 です。観測値の重みは正規化され、合計は対応するクラスの事前確率になります。また、事前確率は合計が 1 になるように正規化されます。そのため、次のようになります。

      j=1nwj=1.

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

    損失関数LossFun の値
    二項分布からの逸脱度'binodeviance'L=j=1nwjlog{1+exp[2mj]}.
    10 進数の誤分類率'classiferror'

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

    y^j は、スコアが最大であるクラスに対応するクラス ラベルです。I{·} はインジケーター関数です。

    クロスエントロピー損失'crossentropy'

    'crossentropy' はニューラル ネットワーク モデルのみに適しています。

    加重クロスエントロピー損失は次となります。

    L=j=1nw˜jlog(mj)Kn,

    ここで重み w˜j は、合計が 1 ではなく n になるように正規化されます。

    指数損失'exponential'L=j=1nwjexp(mj).
    ヒンジ損失'hinge'L=j=1nwjmax{0,1mj}.
    ロジット損失'logit'L=j=1nwjlog(1+exp(mj)).
    最小予測誤分類コスト'mincost'

    'mincost' は、分類スコアが事後確率の場合にのみ適しています。

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

    1. 観測値 Xj をクラス k に分類するための予測誤分類コストを推定します。

      γjk=(f(Xj)C)k.

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

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

      y^j=argmink=1,...,Kγjk.

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

    最小予測誤分類コスト損失の加重平均は次となります。

    L=j=1nwjcj.

    既定のコスト行列 (正しい分類の場合の要素値は 0、誤った分類の場合の要素値は 1) を使用する場合、'mincost' 損失は 'classiferror' 損失と等価になります。

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

    次の図では、1 つの観測値のスコア m に対する損失関数 ('crossentropy' および 'mincost' を除く) を比較しています。いくつかの関数は、点 (0,1) を通過するように正規化されています。

    Comparison of classification losses for different loss functions

    アルゴリズム

    kfoldLoss は、対応するオブジェクト関数 loss で説明されているように、分類損失を計算します。モデル固有の説明については、次の表に示す該当する関数 loss のリファレンス ページを参照してください。

    モデル タイプ関数 loss
    判別分析分類器loss
    アンサンブル分類器loss
    一般化加法モデル分類器loss
    k 最近傍分類器loss
    単純ベイズ分類器loss
    ニューラル ネットワーク分類器loss
    サポート ベクター マシン分類器loss
    マルチクラス分類用の二分決定木loss

    拡張機能

    R2011a で導入