Main Content

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

predict

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

説明

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

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

[label,Posterior,Cost] = predict(___) はさらに、前の構文におけるいずれかの入力引数の組み合わせを使用して、事後確率 (Posterior) と、X の観測値 (行) に対応する予測 (推定) 誤分類コスト (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: {1×60 cell}
    DistributionParameters: {5×60 cell}


  Properties, Methods

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

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

IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = 
  incrementalClassificationNaiveBayes

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


  Properties, Methods

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. 被験者が踊っている (Y が 5) かどうかに関するモデルによる予測の精度をインクリメンタルに測定することを検討します。これを行うには、チャンクの各観測値についてのクラス 5 の事後確率とそれ以外のクラスのうちの最大の事後確率の差を perfcurve に渡して作成された ROC 曲線の AUC を計算します。

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

numObsPerChunk = 100;
nchunk = floor((n - initobs)/numObsPerChunk) - 1;
Posterior = zeros(nchunk,numel(Mdl.ClassNames));
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(idx,:)] = predict(Mdl,X(idx,:));  
    diffscore = Posterior(idx,classauc) - max(Posterior(idx,setdiff(Mdl.ClassNames,classauc)),[],2);
    [~,~,~,auc(j)] = perfcurve(Y(idx),diffscore,Mdl.ClassNames(classauc));
    Mdl = fit(Mdl,X(idx,:),Y(idx));
end

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

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

plot(auc)
ylabel('AUC')
xlabel('Iteration')

AUC は、分類器がインクリメンタル学習において踊っている被験者を正しく予測していることを示しています。

入力引数

すべて折りたたむ

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

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

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

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

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

観測値のラベル Y の長さと X の観測値の数は同じでなければなりません。Y(j)X 内の観測値 j (行または列) のラベルです。

データ型: single | double

名前と値の引数

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

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

観測値を誤分類するコスト。次の表の値として指定します。ここで、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 行 2 列の浮動小数点行列として返されます。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 の場合、要素 (i,j) は観測値をクラス 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 で導入