Main Content

predict

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

R2021a 以降

説明

label = predict(Mdl,X) は、インクリメンタル学習用の単純ベイズ分類モデル Mdl から、予測子データ X の観測値の予測応答 (またはラベル) label を返します。

label = predict(Mdl,X,Name,Value) では、1 つ以上の名前と値の引数を使用して追加オプションを指定します。たとえば、Cost 引数を指定することで、予測の計算にカスタムの誤分類コスト行列 (つまり、値 Mdl.Cost をオーバーライドする) を指定できます。

[label,Posterior,Cost] = predict(___) は、前の構文におけるいずれかの入力引数の組み合わせを使用して、X の観測値 (行) に対応する事後確率 (Posterior) と予測 (推定) 誤分類コスト (Cost) も返します。X 内の各観測値について、予測クラス ラベルは、すべてのクラスの中で最小の予測分類コストに対応します。

すべて折りたたむ

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

load humanactivity

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

単純ベイズ分類モデルをデータ セット全体に当てはめます。

TTMdl = fitcnb(feat,actid)
TTMdl = 
  ClassificationNaiveBayes
              ResponseName: 'Y'
     CategoricalPredictors: []
                ClassNames: [1 2 3 4 5]
            ScoreTransform: 'none'
           NumObservations: 24075
         DistributionNames: {1x60 cell}
    DistributionParameters: {5x60 cell}


TTMdl は、従来式の学習済みモデルを表す ClassificationNaiveBayes モデル オブジェクトです。

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

IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = 
  incrementalClassificationNaiveBayes

                    IsWarm: 1
                   Metrics: [1x2 table]
                ClassNames: [1 2 3 4 5]
            ScoreTransform: 'none'
         DistributionNames: {1x60 cell}
    DistributionParameters: {5x60 cell}


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

関数 incrementalLearner は、学習した条件付き予測子分布パラメーターを、TTMdl が学習データから学習した他の情報と共に渡して、インクリメンタル学習器を初期化します。IncrementalMdl はウォーム (IsWarm1) です。これは、インクリメンタル学習関数がパフォーマンス メトリクスの追跡を開始できることを意味します。

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

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

ttlabels = predict(TTMdl,feat);
illables = predict(IncrementalMdl,feat);
sameLabels = sum(ttlabels ~= illables) == 0
sameLabels = logical
   1

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

この例では、学習の誤分類コストを平衡に維持しながら、データの入力チャンクのラベル予測に誤分類コストを適用する方法を示します。

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

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

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

Mdl = incrementalClassificationNaiveBayes(ClassNames=unique(Y));
initobs = 10;
Mdl = fit(Mdl,X(1:initobs,:),Y(1:initobs));
canPredict = size(Mdl.DistributionParameters,1) == numel(Mdl.ClassNames)
canPredict = logical
   1

"実行中" (クラス 4) を誤分類するモデルに重いペナルティを課すことを考えます。他のクラスの誤分類と比較して、実行中を誤分類することには 100 倍のペナルティを適用するコスト行列を作成します。行は真のクラスに、列は予測クラスに対応します。

k = numel(Mdl.ClassNames);
Cost = ones(k) - eye(k);
Cost(4,:) = Cost(4,:)*100; % Penalty for misclassifying "running"
Cost
Cost = 5×5

     0     1     1     1     1
     1     0     1     1     1
     1     1     0     1     1
   100   100   100     0   100
     1     1     1     1     0

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

  1. predict を呼び出して、データの入力チャンクに含まれる各観測値のラベルを予測します。

  2. predict を再び呼び出しますが、引数 Cost を使用して誤分類コストを指定します。

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

numObsPerChunk = 100;
nchunk = ceil((n - initobs)/numObsPerChunk);
labels = zeros(n,1);
cslabels = zeros(n,1);
cst = zeros(n,5);
cscst = zeros(n,5);

% Incremental learning
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1 + initobs);
    iend   = min(n,numObsPerChunk*j + initobs);
    idx = ibegin:iend;    
    [labels(idx),~,cst(idx,:)] = predict(Mdl,X(idx,:));  
    [cslabels(idx),~,cscst(idx,:)] = predict(Mdl,X(idx,:),Cost=Cost);
    Mdl = fit(Mdl,X(idx,:),Y(idx));
end
labels = labels((initobs + 1):end);
cslabels = cslabels((initobs + 1):end);

ヒストグラムをプロットして、予測されるクラス分布を予測方法の間で比較します。

figure;
histogram(labels);
hold on
histogram(cslabels);
legend(["Default-cost prediction" "Cost-sensitive prediction"])

Figure contains an axes object. The axes object contains 2 objects of type histogram. These objects represent Default-cost prediction, Cost-sensitive prediction.

コストを考慮した予測方法は、クラス 4 の誤分類に重いペナルティを与えるため、既定の平衡なコストを使用した予測方法と比較して、クラス 4 への予測が多い結果となります。

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

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

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

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

Mdl = incrementalClassificationNaiveBayes('ClassNames',unique(Y));
initobs = 10;
Mdl = fit(Mdl,X(1:initobs,:),Y(1:initobs));
canPredict = size(Mdl.DistributionParameters,1) == numel(Mdl.ClassNames)
canPredict = logical
   1

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

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

  1. predict を呼び出して、データの入力チャンクに含まれる各観測値のクラス事後確率を計算します。

  2. rocmetricsを呼び出し、クラス事後確率を使用して ROC 曲線の下の領域 (AUC) を計算し、すべてのクラスの平均の AUC 値を格納します。この AUC は、インクリメンタル モデルが平均でどの程度正しく行動を予測するかの尺度になります。

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

numObsPerChunk = 100;
nchunk = floor((n - initobs)/numObsPerChunk);
auc = zeros(nchunk,1);
classauc = 5;

% Incremental learning
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1 + initobs);
    iend   = min(n,numObsPerChunk*j + initobs);
    idx = ibegin:iend;    
    [~,posterior] = predict(Mdl,X(idx,:));  
    mdlROC = rocmetrics(Y(idx),posterior,Mdl.ClassNames);
    [~,~,~,auc(j)] = average(mdlROC,'micro');
    Mdl = fit(Mdl,X(idx,:),Y(idx));
end

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

入力データの各チャンクの 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.

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

入力引数

すべて折りたたむ

インクリメンタル学習用の単純ベイズ分類モデル。incrementalClassificationNaiveBayes モデル オブジェクトとして指定します。Mdl は、直接作成することも、サポートされている従来式の学習済み機械学習モデルを関数 incrementalLearner によって変換して作成することもできます。詳細については、対応するリファレンス ページを参照してください。

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

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

  • それ以外の場合、Mdl.DistributionParameters は、列数が Mdl.NumPredictors > 0 で行数が 1 以上の cell 行列でなければなりません。各行は Mdl.ClassNames の各クラス名に対応します。

ラベルを予測するための予測子データのバッチ。n 行 Mdl.NumPredictors 列の浮動小数点行列として指定します。

データ型: single | double

名前と値の引数

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

例: Cost=[0 2;1 0] は、真のクラス Mdl.ClassNames(2) をもつ観測値を誤分類する場合に比べて、真のクラス Mdl.ClassNames(1) をもつ観測値を誤分類する場合に 2 倍のペナルティを与えます。

観測値を誤分類するコスト。次の表の値として指定します。ここで、c は Mdl.ClassNames 内のクラスの数です。指定された値は Mdl.Cost の値をオーバーライドします。

説明
c 行 c 列の数値行列

Cost(i,j) は、クラス Mdl.ClassNames(i) およびクラス Mdl.ClassNames(j) に対して、真のクラスが i の場合に観測値をクラス j に分類するコストです。つまり、行は真のクラスに、列は予測するクラスに対応します。たとえば、Cost = [0 2;1 0] は、Mdl.ClassNames(1) の誤分類に Mdl.ClassNames(2) の誤分類の 2 倍のペナルティを適用します。

構造体配列

次の 2 つのフィールドをもつ構造体配列です。

  • ClassNames には、Mdl.ClassNames と同じ値のクラス名が格納されます。

  • ClassificationCosts には、前述のコスト行列が格納されます。

例: Cost=struct('ClassNames',Mdl.ClassNames,'ClassificationCosts',[0 2; 1 0])

データ型: single | double | struct

事前クラス確率。この数値ベクトルの値を指定します。PriorMdl.ClassNames のクラス数と同じ長さであり、要素の順序は Mdl.ClassNames 内のクラスの順序に対応します。predict は結果の合計が 1 となるようにベクトルを正規化します。

指定された値は Mdl.Prior の値をオーバーライドします。

データ型: single | double

インクリメンタル学習関数が生の応答値を変換する方法を記述するスコア変換関数。文字ベクトル、string スカラー、または関数ハンドルとして指定します。指定された値は Mdl.ScoreTransform の値をオーバーライドします。

次の表は、スコア変換で使用可能な組み込み関数の一覧です。

説明
"doublelogit"1/(1 + e–2x)
"invlogit"log(x / (1 – x))
"ismax"最大のスコアをもつクラスのスコアを 1 に設定し、他のすべてのクラスのスコアを 0 に設定する
"logit"1/(1 + e–x)
"none" または "identity"x (変換なし)
"sign"x < 0 のとき –1
x = 0 のとき 0
x > 0 のとき 1
"symmetric"2x – 1
"symmetricismax"最大のスコアをもつクラスのスコアを 1 に設定し、他のすべてのクラスのスコアを –1 に設定する
"symmetriclogit"2/(1 + e–x) – 1

データ型: char | string

出力引数

すべて折りたたむ

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

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

クラスの事後確率。n 行 numel(Mdl.ClassNames) 列の浮動小数点行列として返されます。Posterior(j,k) は観測値 j がクラス k になる事後確率です。Mdl.ClassNames はクラスの順序を指定します。

予測誤分類コスト。n 行 numel(Mdl.ClassNames) 列の浮動小数点行列として返されます。

Cost(j,k)X の行 j の観測値がクラス k (Mdl.ClassNames(k)) に分類される予測コストです。

詳細

すべて折りたたむ

誤分類コスト

"誤分類コスト" は、観測を誤ったクラスにラベル付けする分類器の相対的な重大度です。

誤分類コストには、真と予測の 2 種類があります。K をクラスの数と仮定します。

  • "真の誤分類コスト" — K 行 K 列の行列で、要素 (i,j) は、真のクラスが i である場合に観測値をクラス j に分類するコストを示します。誤分類コストはプロパティ Mdl.Cost に格納され、計算に使用されます。既定の設定では、ij の場合に Mdl.Cost(i,j) = 1 で、i = j の場合Mdl.Cost(i,j) = 0 です。つまり、正しい分類のコストは 0 で、誤った分類では 1 です。

  • "予測誤分類コスト" — K 次元のベクトルで、要素 k は、観測値をクラス k に分類するクラス事後確率で重み付けされた加重平均コストです。

    ck=j=1KP^(Y=j|x1,...,xP)Costjk.

    つまり、観測値は予測誤分類コストが最も低いクラスに分類されます。

事後確率

"事後確率" はデータが与えられる場合に、観測値が特定のクラスに属している確率です。

単純ベイズの場合、与えられた観測値 (x1,...,xP) の分類が k になる事後確率は次のようになります。

P^(Y=k|x1,..,xP)=P(X1,...,XP|y=k)π(Y=k)P(X1,...,XP),

ここで

  • P(X1,...,XP|y=k) は、予測子がクラス k に含まれる場合の条件付き同時密度です。予測子の分布名は Mdl.DistributionNames に格納します。

  • π(Y = k) はクラスの事前確率の分布です。Mdl.Prior は事前分布を保存します。

  • P(X1,..,XP) は予測子の同時密度です。各クラスは離散的なので、次のようになります。P(X1,...,XP)=k=1KP(X1,...,XP|y=k)π(Y=k).

バージョン履歴

R2021a で導入