Main Content

kfoldPredict

学習で使用しない観測値のラベルの予測

説明

Label = kfoldPredict(CVMdl) は、線形分類モデルから構成されている交差検証済みの ECOC モデル CVMdl によって予測したクラス ラベルを返します。つまり、他のすべての観測値を使用して学習を行うときにホールドアウトする観測値のクラス ラベルを、kfoldPredict はすべての分割について予測します。kfoldPredict は、CVMdl を作成するために使用したものと同じデータを適用します (fitcecoc を参照)。

また、CVMdl を構成する線形分類モデルの各正則化強度に対するクラス ラベルが Label に格納されます。

Label = kfoldPredict(CVMdl,Name,Value) は、1 つ以上の Name,Value のペア引数により指定された追加オプションを使用して、予測クラス ラベルを返します。たとえば、事後確率推定法、復号化スキームまたは詳細レベルを指定します。

[Label,NegLoss,PBScore] = kfoldPredict(___) は、ホールドアウト観測値と各正則化強度について、以下をさらに返します。

  • クラスごとの平均バイナリ損失の符号を反転した値 (NegLoss)

  • 各バイナリ学習器の陽性クラスのスコア (PBScore)

[Label,NegLoss,PBScore,Posterior] = kfoldPredict(___) は、ホールドアウトされた観測値および各正則化強度について、事後クラス確率の推定値をさらに返します。事後確率を返すには、線形分類モデル学習器がロジスティック回帰モデルでなければなりません。

入力引数

すべて展開する

線形分類モデルから構成される交差検証済みの ECOC モデル。ClassificationPartitionedLinearECOC モデル オブジェクトとして指定します。ClassificationPartitionedLinearECOC モデルを作成するには、fitcecoc を使用し、以下を行います。

  1. 交差検証用の名前と値のペアの引数のいずれか 1 つ (CrossVal など) を指定

  2. 名前と値のペアの引数 Learners を、'linear' に、または templateLinear によって返される線形分類モデル テンプレートに設定

推定値を取得するため、kfoldPredict は ECOC モデルの交差検証に使用したものと同じデータ (X および Y) を適用します。

名前と値の引数

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

R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。

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

  • 次の表には、組み込み関数の名前と説明が含まれています。ここで、yj は特定のバイナリ学習器のクラス ラベル (集合 {-1,1,0} 内)、sj は観測値 j のスコア、g(yj,sj) はバイナリ損失の式です。

    説明スコア領域g(yj,sj)
    "binodeviance"二項分布からの逸脱度(–∞,∞)log[1 + exp(–2yjsj)]/[2log(2)]
    "exponential"指数(–∞,∞)exp(–yjsj)/2
    "hamming"ハミング[0,1] または (–∞,∞)[1 – sign(yjsj)]/2
    "hinge"ヒンジ(–∞,∞)max(0,1 – yjsj)/2
    "linear"線形(–∞,∞)(1 – yjsj)/2
    "logit"ロジスティック(–∞,∞)log[1 + exp(–yjsj)]/[2log(2)]
    "quadratic"2 次[0,1][1 – yj(2sj – 1)]2/2

    バイナリ損失は、yj = 0 の場合に損失が 0.5 になるように正規化されます。また、各クラスについて平均のバイナリ損失が計算されます。

  • カスタム バイナリ損失関数、たとえば customFunction は関数ハンドル 'BinaryLoss',@customFunction を指定します。

    customFunction は以下のような形式になります。

    bLoss = customFunction(M,s)
    ここで、

    • MMdl.CodingMatrix に格納された K 行 B 列の符号化行列です。

    • s は 1 行 B 列の分類スコアの行ベクトルです。

    • bLoss は分類損失です。このスカラーは、特定のクラスのすべての学習器についてバイナリ損失を集計します。たとえば、平均バイナリ損失を使用して、各クラスの学習器の損失を集計できます。

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

    • B はバイナリ学習器の数です。

    カスタムなバイナリ損失関数を渡す例については、カスタム バイナリ損失関数の使用による ECOC モデルのテスト標本ラベルの予測を参照してください。

既定の設定では、すべてのバイナリ学習器が以下を使用する線形分類モデルである場合、次のようになります。

  • SVM の場合、BinaryLoss'hinge' になります。

  • ロジスティック回帰の場合、BinaryLoss'quadratic' になります。

例: 'BinaryLoss','binodeviance'

データ型: char | string | function_handle

バイナリ損失を集計する復号化方式。'Decoding''lossweighted' または 'lossbased' から構成されるコンマ区切りのペアとして指定します。詳細については、バイナリ損失を参照してください。

例: 'Decoding','lossbased'

カルバック・ライブラー ダイバージェンスの最小化により事後確率を当てはめるランダムな初期値の数。'NumKLInitializations' と非負の整数から構成されるコンマ区切りのペアとして指定します。

このオプションを使用するには、以下が必要です。

  • 4 番目の出力引数 (Posterior) を返します。

  • ECOC モデルを構成する線形分類モデルでロジスティック回帰学習器を使用しなければなりません (つまり、CVMdl.Trained{1}.BinaryLearners{1}.Learner'logistic' でなければなりません)。

  • PosteriorMethod'kl' でなければなりません。

詳細は、カルバック・ライブラー ダイバージェンスを使用する事後推定を参照してください。

例: 'NumKLInitializations',5

データ型: single | double

推定オプション。statset により返される 'Options' と構造体配列から構成されるコンマ区切りのペアとして指定します。

並列計算を起動するには、以下を行います。

  • Parallel Computing Toolbox™ ライセンスが必要です。

  • 'Options',statset('UseParallel',true) を指定します。

事後確率推定法。'PosteriorMethod''kl' または 'qp' で構成されるコンマ区切りのペアとして指定します。

  • このオプションを使用するには、4 番目の出力引数 (Posterior) を返さなければならず、ECOC モデルを構成する線形分類モデルでロジスティック回帰学習器を使用しなければなりません (つまり、 CVMdl.Trained{1}.BinaryLearners{1}.Learner'logistic' でなければなりません)。

  • PosteriorMethod'kl' の場合、バイナリ学習器によって返される予測された事後確率と期待された事後確率間のカルバック・ライブラー ダイバージェンスを最小化することにより、マルチクラス事後確率が推定されます。詳細については、カルバック・ライブラー ダイバージェンスを使用する事後推定を参照してください。

  • PosteriorMethod'qp' の場合、二次計画法を使用して最小二乗問題を解決することでマルチクラス事後確率が推定されます。このオプションを使用するには Optimization Toolbox™ ライセンスが必要です。詳細については、二次計画法を使用する事後推定を参照してください。

例: 'PosteriorMethod','qp'

詳細レベル。'Verbose'0 または 1 から構成されるコンマ区切りのペアとして指定します。Verbose は、コマンド ウィンドウに表示される診断メッセージの量を制御します。

Verbose0 の場合、診断メッセージは表示されません。それ以外の場合は、診断メッセージが表示されます。

例: 'Verbose',1

データ型: single | double

出力引数

すべて展開する

交差検証予測クラス ラベル。categorical 配列、文字配列、logical 行列、数値行列、または文字ベクトルの cell 配列として返されます。

ほとんどの場合 Label は、CVMdl の作成に使用した、観測されたクラス ラベル (Y) と同じデータ型の n 行 L 列の配列になります。(string 配列は文字ベクトルの cell 配列として扱われます)。n は予測子データ (X) 内の観測値の個数、L は交差検証済み ECOC モデルを構成する線形分類モデル内の正則化強度の個数です。つまり Label(i,j) は、正則化強度が CVMdl.Trained{1}.BinaryLearners{1}.Lambda(j) である線形分類モデルの ECOC モデルを使用した、観測値 i の予測クラス ラベルです。

Y が文字配列で L > 1 の場合、Label はクラス ラベルの cell 配列になります。

符号を反転した平均バイナリ損失 (NegLoss) が最大であるクラス、つまり平均バイナリ損失が最小であるクラスに対応する予測ラベルが割り当てられます。

符号を反転した交差検証平均バイナリ損失。n x K x L の数値行列または配列として返されます。K は学習データ内の異なるクラスの数で、列は CVMdl.ClassNames 内のクラスに対応します。n と L については、Label を参照してください。NegLoss(i,k,j) は、正則化強度が CVMdl.Trained{1}.BinaryLoss{1}.Lambda(j) である線形分類モデルを使用して観測値 i をクラス k に分類する平均バイナリ損失の符号を反転した値です。

  • Decoding'lossbased' の場合、NegLoss(i,k,j) はバイナリ損失の合計をバイナリ学習器の総数で割った値になります。

  • Decoding'lossweighted' の場合、NegLoss(i,k,j) はバイナリ損失の合計を k 番目のクラスに対するバイナリ学習器の数で割った値になります。

詳細については、バイナリ損失を参照してください。

交差検証陽性クラスのスコア。n x B x L の数値配列として返されます。B は交差検証済みの ECOC モデル内のバイナリ学習器の数で、列は CVMdl.Trained{1}.BinaryLearners 内のバイナリ学習器に対応します。n と L については、Label を参照してください。PBScore(i,b,j) は、正則化強度が CVMdl.Trained{1}.BinaryLearners{1}.Lambda(j) である線形分類モデルを使用して観測値 i を陽性クラスに分類するためのバイナリ学習器 b の陽性クラスのスコアです。

符号化行列が分割全体で変化する (つまり、コーディング スキームが sparserandom または denserandom である) 場合、PBScore は空 ([]) になります。

交差検証事後クラス確率。n x K x L の数値配列として返されます。次元の定義については、NegLoss を参照してください。Posterior(i,k,j) は、正則化強度が CVMdl.Trained{1}.BinaryLearners{1}.Lambda(j) である線形分類モデルを使用して観測値 i をクラス k に分類する事後確率です。

事後確率を返すには、CVMdl.Trained{1}.BinaryLearner{1}.Learner'logistic' でなければなりません。

すべて展開する

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

load nlpdata

X は予測子データのスパース行列、Y はクラス ラベルの categorical ベクトルです。

線形分類モデルから構成されている ECOC モデルを交差検証します。

rng(1); % For reproducibility 
CVMdl = fitcecoc(X,Y,'Learner','linear','CrossVal','on');

CVMdlClassificationPartitionedLinearECOC モデルです。既定では、10 分割交差検証が実行されます。

fitcecoc で分割の学習に使用されなかった観測値のラベルを予測します。

label = kfoldPredict(CVMdl);

CVMdl 内の正則化強度は 1 つなので、label は予測の列ベクトルになり、行数は X 内の観測値数と同じになります。

混同行列を作成します。

cm = confusionchart(Y,label);

Figure contains an object of type ConfusionMatrixChart.

NLP のデータ セットを読み込みます。予測子データを転置します。

load nlpdata
X = X';

簡単にするため、'simulink''dsp''comm' のいずれでもない Y の観測値すべてに対して 'others' というラベルを使用します。

Y(~(ismember(Y,{'simulink','dsp','comm'}))) = 'others';

SpaRSA を使用して目的関数を最適化するように指定する線形分類モデル テンプレートを作成します。

t = templateLinear('Solver','sparsa');

5 分割の交差検証を使用して、線形分類モデルから構成されている ECOC モデルを交差検証します。予測子の観測値が列に対応することを指定します。

rng(1); % For reproducibility 
CVMdl = fitcecoc(X,Y,'Learners',t,'KFold',5,'ObservationsIn','columns');
CMdl1 = CVMdl.Trained{1}
CMdl1 = 
  CompactClassificationECOC
      ResponseName: 'Y'
        ClassNames: [comm    dsp    simulink    others]
    ScoreTransform: 'none'
    BinaryLearners: {6x1 cell}
      CodingMatrix: [4x6 double]


CVMdlClassificationPartitionedLinearECOC モデルです。このモデルに含まれている Trained プロパティは、各分割の学習セットを使用して学習を行った CompactClassificationECOC モデルが格納されている 5 行 1 列の cell 配列です。

既定の設定では、ECOC モデルを構成する線形分類モデルは SVM を使用します。SVM スコアは観測から判定境界までの符号付き距離です。したがって、定義域は (-,) です。以下のようなカスタム バイナリ損失関数を作成します。

  • 各学習器の符号化設計行列 (M) と陽性クラスの分類スコア (s) を各観測値のバイナリ損失にマッピングする

  • 線形損失を使用する

  • 中央値を使用してバイナリ学習器の損失を集計する

バイナリ損失関数用に独立した関数を作成し、MATLAB® パスに保存できます。あるいは、無名バイナリ損失関数を指定できます。

customBL = @(M,s)median(1 - (M.*s),2,'omitnan')/2;

交差検証ラベルを予測し、クラスごとのバイナリ損失の中央値を推定します。10 分割外の観測値が無作為なセットの場合、クラスごとに符号を反転したバイナリ損失の中央値を出力します。

[label,NegLoss] = kfoldPredict(CVMdl,'BinaryLoss',customBL);

idx = randsample(numel(label),10);
table(Y(idx),label(idx),NegLoss(idx,1),NegLoss(idx,2),NegLoss(idx,3),...
    NegLoss(idx,4),'VariableNames',[{'True'};{'Predicted'};...
    categories(CVMdl.ClassNames)])
ans=10×6 table
      True      Predicted      comm         dsp       simulink    others 
    ________    _________    _________    ________    ________    _______

    others      others         -1.2319     -1.0488    0.048758     1.6175
    simulink    simulink       -16.407     -12.218      21.531     11.218
    dsp         dsp            -0.7387    -0.11534    -0.88466    -0.2613
    others      others         -0.1251     -0.8749    -0.99766    0.14517
    dsp         dsp             2.5867      6.4187     -3.5867    -4.4165
    others      others       -0.025358     -1.2287    -0.97464    0.19747
    others      others         -2.6725    -0.56708    -0.51092     2.7453
    others      others         -1.1605    -0.88321    -0.11679    0.43504
    others      others         -1.9511     -1.3175     0.24735    0.95111
    simulink    others          -7.848     -5.8203      4.8203     6.8457

符号が反転した最大損失に基づき、ラベルが予測されます。

線形分類モデルから構成される ECOC モデルは、ロジスティック回帰学習器の場合のみ事後確率を返します。この例では Parallel Computing Toolbox™ と Optimization Toolbox™ が必要です。

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

load nlpdata
X = X';
Y(~(ismember(Y,{'simulink','dsp','comm'}))) = 'others';

$10^{-5}$$10^{-0.5}$ の範囲で対数間隔で配置された 5 個の正則化強度を作成します。

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

線形分類モデル テンプレートを作成します。このテンプレートでは、SpaRSA を使用して目的関数を最適化し、ロジスティック回帰学習器を使用するように指定します。

t = templateLinear('Solver','sparsa','Learner','logistic','Lambda',Lambda);

5 分割の交差検証を使用して、線形分類モデルから構成されている ECOC モデルを交差検証します。予測子の観測値が列に対応することと並列計算の使用を指定します。

rng(1); % For reproducibility
Options = statset('UseParallel',true);
CVMdl = fitcecoc(X,Y,'Learners',t,'KFold',5,'ObservationsIn','columns',...
    'Options',Options);
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).

交差検証事後クラス確率を予測します。並列計算の使用と、二次計画法を使用して事後確率を推定することを指定します。

[label,~,~,Posterior] = kfoldPredict(CVMdl,'Options',Options,...
    'PosteriorMethod','qp');
size(label)
label(3,4)
size(Posterior)
Posterior(3,:,4)
ans =

       31572           5


ans = 

  categorical

     others 


ans =

       31572           4           5


ans =

    0.0285    0.0373    0.1714    0.7627

5 つの正則化強度があるので、次のようになります。

  • label は 31572 行 5 列の categorical 配列になります。label(3,4) は、観測値 3 について予測された交差検証済みラベルであり、正則化強度 Lambda(4) により学習をさせたモデルを使用しています。

  • Posterior は 31572 x 4 x 5 の行列になります。Posterior(3,:,4) は、正則化強度 Lambda(4) により学習をさせたモデルを使用して推定された観測値 3 の事後クラス確率すべてのベクトルです。2 番目の次元の順序は CVMdl.ClassNames に対応します。ランダムな 10 個の事後クラス確率の集合を表示します。

Lambda(4) を使用して学習をさせたモデルについて、交差検証ラベルおよび事後確率の無作為標本を表示します。

idx = randsample(size(label,1),10);
table(Y(idx),label(idx,4),Posterior(idx,1,4),Posterior(idx,2,4),...
    Posterior(idx,3,4),Posterior(idx,4,4),...
    'VariableNames',[{'True'};{'Predicted'};categories(CVMdl.ClassNames)])
ans =

  10×6 table

      True      Predicted       comm          dsp        simulink     others  
    ________    _________    __________    __________    ________    _________

    others      others         0.030275      0.022142     0.10416      0.84342
    simulink    simulink     3.4954e-05    4.2982e-05     0.99832    0.0016016
    dsp         others          0.15787       0.25718     0.18848      0.39647
    others      others         0.094177      0.062712     0.12921      0.71391
    dsp         dsp           0.0057979       0.89703    0.015098     0.082072
    others      others         0.086084      0.054836    0.086165      0.77292
    others      others        0.0062338     0.0060492    0.023816       0.9639
    others      others          0.06543      0.075097     0.17136      0.68812
    others      others         0.051843      0.025566     0.13299       0.7896
    simulink    simulink     0.00044059    0.00049753     0.70958      0.28948

詳細

すべて展開する

アルゴリズム

すべて展開する

カルバック・ライブラー ダイバージェンスを最小化するか、二次計画法を使用することにより、クラス事後確率を推定できます。以下の事後推定アルゴリズムに関する説明では、次のように仮定します。

  • mkj は符号化設計行列 M の要素 (k,j) です。

  • I はインジケーター関数です。

  • p^k は、ある観測値のクラス k (k = 1、...、K) に対するクラス事後確率の推定値です。

  • rj はバイナリ学習器 j の陽性クラス事後確率です。つまり、rj は、学習データが与えられる場合、バイナリ学習器 j が観測値を陽性クラスに分類する確率です。

参照

[1] Allwein, E., R. Schapire, and Y. Singer. “Reducing multiclass to binary: A unifying approach for margin classifiers.” Journal of Machine Learning Research. Vol. 1, 2000, pp. 113–141.

[2] Dietterich, T., and G. Bakiri. “Solving Multiclass Learning Problems Via Error-Correcting Output Codes.” Journal of Artificial Intelligence Research. Vol. 2, 1995, pp. 263–286.

[3] Escalera, S., O. Pujol, and P. Radeva. “Separability of ternary codes for sparse designs of error-correcting output codes.” Pattern Recog. Lett. Vol. 30, Issue 3, 2009, pp. 285–297.

[4] Escalera, S., O. Pujol, and P. Radeva. “On the decoding process in ternary error-correcting output codes.” IEEE Transactions on Pattern Analysis and Machine Intelligence. Vol. 32, Issue 7, 2010, pp. 120–134.

[5] Hastie, T., and R. Tibshirani. “Classification by Pairwise Coupling.” Annals of Statistics. Vol. 26, Issue 2, 1998, pp. 451–471.

[6] Wu, T. F., C. J. Lin, and R. Weng. “Probability Estimates for Multi-Class Classification by Pairwise Coupling.” Journal of Machine Learning Research. Vol. 5, 2004, pp. 975–1005.

[7] Zadrozny, B. “Reducing Multiclass to Binary by Coupling Probability Estimates.” NIPS 2001: Proceedings of Advances in Neural Information Processing Systems 14, 2001, pp. 1041–1048.

拡張機能

バージョン履歴

R2016a で導入

すべて展開する