Main Content

predict

ECOC インクリメンタル学習分類モデルからの新しい観測値の応答予測

R2022a 以降

    説明

    label = predict(Mdl,X) は、インクリメンタル学習用のマルチクラス誤り訂正出力符号 (ECOC) 分類モデル Mdl から、予測子データ X の観測値の予測応答 (またはラベル) label を返します。

    label = predict(Mdl,X,Name=Value) では、1 つ以上の名前と値の引数を使用して追加オプションを指定します。たとえば、予測子データの観測値が X の列に沿うように指定するには ObservationsIn=columns と指定します。

    [label,NegLoss,PBScore] = predict(___) は、前の構文におけるいずれかの入力引数の組み合わせを使用して、さらに以下を返します。

    • 符号を反転した平均バイナリ損失の配列 (NegLoss)。predict は、符号を反転した平均バイナリ損失が最大 (結果的に、平均バイナリ損失が最小) になるクラスのラベルを X 内の各観測値に割り当てます。

    • 各バイナリ学習器によって分類された観測値に対する陽性クラスのスコアの配列 (PBScore)。

    すべて折りたたむ

    従来式の学習済み ECOC モデルを変換してインクリメンタル学習モデルを作成し、両方のモデルを使用してクラス ラベルを予測します。

    人の行動のデータ セットを読み込みます。

    load humanactivity

    データ セットの詳細については、コマンド ラインで Description を入力してください。

    マルチクラス ECOC 分類モデルをデータ セット全体に当てはめます。

    Mdl = fitcecoc(feat,actid);

    Mdl は従来式の学習済み ECOC 分類モデルを表す ClassificationECOC モデル オブジェクトです。

    従来式の学習済み ECOC 分類モデルをインクリメンタル学習用のモデルに変換します。

    IncrementalMdl = incrementalLearner(Mdl) 
    IncrementalMdl = 
      incrementalClassificationECOC
    
                IsWarm: 1
               Metrics: [1x2 table]
            ClassNames: [1 2 3 4 5]
        ScoreTransform: 'none'
        BinaryLearners: {10x1 cell}
            CodingName: 'onevsone'
              Decoding: 'lossweighted'
    
    
    

    IncrementalMdl は、インクリメンタル学習用に準備された incrementalClassificationECOC モデル オブジェクトです。

    関数 incrementalLearner は、バイナリ学習器の符号化設計とモデル パラメーターを、Mdl が学習データから抽出する他の情報と共に渡して、インクリメンタル学習器を初期化します。IncrementalMdl はウォーム (IsWarm1) です。これは、インクリメンタル学習関数がパフォーマンス メトリクスの追跡と予測を実行できることを意味します。

    従来式の学習済みモデルから変換して作成したインクリメンタル学習器は、追加の処理なしで予測を生成できます。

    両方のモデルを使用して、すべての観測値のクラス ラベルを予測します。

    ttlabels = predict(Mdl,feat);
    illables = predict(IncrementalMdl,feat);
    isequal(ttlabels,illables)
    ans = logical
       1
    
    

    各観測値についての予測ラベルが両方のモデルで同じになります。

    モデルを観測値のチャンクに当てはめて predict 用にインクリメンタル ECOC モデルを準備します。関数 predict を使用して、ストリーミング データの符号を反転した平均バイナリ損失を計算し、受信者動作特性 (ROC) 曲線の下の領域 (AUC) を使用してモデルの性能を評価します。

    人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。

    load humanactivity
    n = numel(actid);
    rng(10) % For reproducibility
    idx = randsample(n,n);
    X = feat(idx,:);
    Y = actid(idx);

    データ セットの詳細については、コマンド ラインで Description を入力してください。

    インクリメンタル学習用の ECOC モデルを作成します。クラス名を指定します。モデルを最初の 10 個の観測値に当てはめて predict 用にモデルを準備します。

    Mdl = incrementalClassificationECOC(ClassNames=unique(Y));
    initobs = 10;
    Mdl = fit(Mdl,X(1:initobs,:),Y(1:initobs));

    MdlincrementalClassificationECOC モデルです。そのプロパティはすべて読み取り専用です。モデルは予測を生成するように構成されています。

    データ ストリームをシミュレートし、100 個の観測値の入力チャンクごとに次のアクションを実行します。

    1. predict を呼び出して、データの入力チャンクに含まれる各観測値の符号を反転した平均バイナリ損失を計算します。"lossbased" 復号化方式を使用するように指定します。

    2. rocmetricsを呼び出して、符号を反転した平均バイナリ損失を使って AUC を計算し、すべてのクラスの平均の AUC 値を格納します。この AUC は、インクリメンタル モデルが平均でどの程度正しく行動を予測するかの尺度になります。

    3. fit を呼び出して、モデルを入力チャンクに当てはめます。前のインクリメンタル モデルを、入力観測値に当てはめた新しいモデルで上書きします。

    numObsPerChunk = 100;
    nchunk = floor((n - initobs)/numObsPerChunk);
    auc = zeros(nchunk,1);
    
    % Incremental learning
    for j = 1:nchunk
        ibegin = min(n,numObsPerChunk*(j-1) + 1 + initobs);
        iend   = min(n,numObsPerChunk*j + initobs);
        idx = ibegin:iend;    
        [~,NegLoss] = predict(Mdl,X(idx,:),Decoding="lossbased");  
        mdlROC = rocmetrics(Y(idx),NegLoss,Mdl.ClassNames);
        [~,~,~,auc(j)] = average(mdlROC,"micro");
        Mdl = fit(Mdl,X(idx,:),Y(idx));
    end

    Mdl は、ストリーム内のすべてのデータで学習させた incrementalClassificationECOC モデル オブジェクトです。

    入力データの各チャンクの AUC 値をプロットします。

    plot(auc)
    xlim([0 nchunk])
    ylabel("AUC")
    xlabel("Iteration")

    Figure contains an axes object. The axes object with xlabel Iteration, ylabel AUC contains an object of type line.

    プロットは、分類器がインクリメンタル学習において行動を正しく予測していることを示しています。

    入力引数

    すべて折りたたむ

    インクリメンタル学習用の ECOC 分類モデル。incrementalClassificationECOC モデル オブジェクトとして指定します。Mdl は、incrementalClassificationECOC を直接呼び出して作成することも、サポートされている従来式の学習済み機械学習モデルを関数 incrementalLearner で変換して作成することもできます。

    観測値のバッチでラベルを予測するように Mdl を構成しなければなりません。

    • Mdl が従来式の学習済みモデルから変換されたモデルの場合、いかなる修正も行うことなくラベルを予測できます。

    • それ以外の場合、fit または updateMetricsAndFit を使用して Mdl をデータに当てはめる必要があります。

    予測子データのバッチ。n 個の観測値と Mdl.NumPredictors 個の予測子変数で構成される浮動小数点行列として指定します。名前と値の引数 ObservationsIn の値は、変数と観測値の方向を決定します。ObservationsIn の既定値は "rows" であり、予測子データの観測値が X の行に沿うことを示しています。

    メモ

    predict は、浮動小数点の入力予測子データのみをサポートしています。入力データに categorical データが含まれている場合は、エンコード バージョンの categorical データを準備する必要があります。dummyvar を使用して、各カテゴリカル変数をダミー変数で構成される数値行列に変換します。その後、すべてのダミー変数行列とその他の数値予測子を連結します。詳細については、ダミー変数を参照してください。

    データ型: single | double

    名前と値の引数

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

    例: BinaryLoss="quadratic",Decoding="lossbased" は、バイナリ学習器の損失関数として 2 次関数を使用し、損失に基づく復号化方式をバイナリ損失の集計に使用するよう指定します。

    バイナリ学習器損失関数。組み込みの損失関数の名前または関数ハンドルとして指定します。

    • 次の表で、組み込み関数について説明します。ここで、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 になるように正規化されます。また、各クラスについて平均のバイナリ損失が計算されます[1]

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

      customFunction の形式は次のとおりです。

      bLoss = customFunction(M,s)

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

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

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

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

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

      カスタム バイナリ損失関数の例については、カスタム バイナリ損失関数の使用による ECOC モデルのテスト標本ラベルの予測を参照してください。この例は従来式の学習済みモデルの例です。この例で示しているように、インクリメンタル学習用のカスタム損失関数を定義できます。

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

    データ型: char | string | function_handle

    復号化方式。"lossweighted" または "lossbased" として指定します。

    ソフトウェアでバイナリ損失をどのように集計して各観測値の予測クラスを判定するかは、ECOC モデルの復号化方式で指定します。ソフトウェアでは 2 つの復号化方式をサポートしています。

    • "lossweighted" — 観測値の予測クラスは、バイナリ学習器におけるバイナリ損失の合計が最小になるクラスに対応します。

    • "lossbased" — 観測値の予測クラスは、バイナリ学習器におけるバイナリ損失の平均が最小になるクラスに対応します。

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

    例: Decoding="lossbased"

    データ型: char | string

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

    例: ObservationsIn="columns"

    データ型: char | string

    出力引数

    すべて折りたたむ

    予測応答 (ラベル)。n 行の categorical 配列または文字配列、浮動小数点ベクトル、logical ベクトルまたは string ベクトル、文字ベクトルの cell 配列として返されます。n は X の観測値の数、label(j) は観測値 j の予測応答です。

    labelMdl.ClassNames に格納されているクラス名と同じデータ型になります。(string 配列は文字ベクトルの cell 配列として扱われます)。

    関数 predict は、符号を反転した平均バイナリ損失が最大になるクラス (つまり、平均バイナリ損失が最小になるクラス) に観測値を割り当てることで観測値の分類を予測します。観測値の損失値が NaN の場合、関数はこの観測値を、学習ラベルの最大比率を占める多数クラスに分類します。

    符号を反転した平均バイナリ損失。n 行 K 列の数値行列として返されます。n は X 内の観測値の数、K は学習データ内の 異なるクラスの数 (numel(Mdl.ClassNames)) です。

    NegLoss(i,k) は、観測値 i を k 番目のクラスに分類する平均バイナリ損失の符号を反転した値です。

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

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

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

    各バイナリ学習器の陽性クラスのスコア。n 行 B 列の数値行列として返されます。n は X 内の観測値の数、B はバイナリ学習器の数 (numel(Mdl.BinaryLearners)) です。

    詳細

    すべて折りたたむ

    バイナリ損失

    "バイナリ損失" は、バイナリ学習器がどの程度の精度で観測値をクラスに分類するかを決定する、クラスと分類スコアの関数です。ソフトウェアでバイナリ損失をどのように集計して各観測値の予測クラスを判定するかは、ECOC モデルの "復号化方式" で指定します。

    以下のように仮定します。

    • mkj は符号化設計行列 M の要素 (k,j)、つまりバイナリ学習器 j のクラス k に対応する符号。M は K 行 B 列の行列であり、K はクラスの数、B はバイナリ学習器の数です。

    • sj は観測値に対するバイナリ学習器 j のスコア。

    • g はバイナリ損失関数。

    • k^ は観測値の予測クラス。

    ソフトウェアでは 2 つの復号化方式をサポートしています。

    • "損失に基づく復号化" [2] (Decoding'lossbased') — 観測値の予測クラスは、すべてのバイナリ学習器におけるバイナリ損失の平均が最小になるクラスに対応します。

      k^=argmink1Bj=1B|mkj|g(mkj,sj).

    • "損失に重みを付けた復号化" [3] (Decoding'lossweighted') — 観測値の予測クラスは、対応するクラスのバイナリ学習器におけるバイナリ損失の平均が最小になるクラスに対応します。

      k^=argminkj=1B|mkj|g(mkj,sj)j=1B|mkj|.

      分母はクラス k のバイナリ学習器の数に対応します。[1]によると、すべてのクラスの損失値が同じダイナミック レンジに収まるので、損失に重みを付けた復号化では分類精度が向上します。

    関数 predictresubPredict、および kfoldPredict は、それぞれの観測値とクラスについて、argmin の目的関数の符号反転値を 2 番目の出力引数 (NegLoss) として返します。

    次の表は、サポートされる損失関数をまとめたものです。ここで、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 になるようにバイナリ損失が正規化され、バイナリ学習器の平均が集計に使用されます[1]

    ECOC 分類器の全体的な性能の尺度である全体の分類損失 (オブジェクト関数 loss および predict の名前と値の引数 LossFun により指定) とバイナリ損失を混同しないでください。

    アルゴリズム

    すべて折りたたむ

    観測値の重み

    事前クラス確率分布が既知の場合 (つまり、事前分布が経験的分布でない場合)、predict は、観測値の重みを正規化して、それぞれのクラスの事前クラス確率の合計になるようにします。このアクションは、既定の観測値の重みがそれぞれの事前クラス確率であることを前提としています。

    クラスの事前確率分布が経験的分布の場合、ソフトウェアは、predict が呼び出されるたびに、指定された観測値の重みを正規化して、合計が 1 になるようにします。

    参照

    [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] 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.

    [3] 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.

    バージョン履歴

    R2022a で導入