Main Content

テキスト分類のインクリメント実行

この例では、モデルに対してインクリメンタル学習を行い、文書中の単語の頻度に基づいて文書を分類する方法である "bag-of-words" モデルを示します。

NLP のデータ セットを読み込みます。ここには MathWorks® ドキュメンテーションから計算された単語頻度 X のスパース行列が含まれています。ラベル Y は、ページが属している Toolbox ドキュメンテーションです。

load nlpdata

ディクショナリやコーパスなどのデータ セットの詳細については、「Description」と入力します。

観測値はラベルごとに並べられています。インクリメンタル学習ソフトウェアは、すべてのラベルを少なくとも 1 回処理するまでパフォーマンス メトリクスの計算を開始しないため、データ セットをシャッフルします。

[n,p] = size(X)
n = 31572
p = 34023
rng(1);
shflidx = randperm(n);
X = X(shflidx,:);
Y = Y(shflidx);

データ中のクラス数を特定します。

cats = categories(Y);
maxNumClasses = numel(cats);

単純ベイズ インクリメンタル学習器を作成します。クラス数、0 のメトリクスのウォームアップ期間、および 1000 のメトリクス ウィンドウ サイズを指定します。予測子 j はディクショナリ内の単語 j の単語頻度なので、クラスが与えられる場合、予測子が条件付きで結合して多項となるように指定します。

Mdl = incrementalClassificationNaiveBayes(MaxNumClasses=maxNumClasses,...
    MetricsWarmupPeriod=0,MetricsWindowSize=1000,DistributionNames='mn');

MdlincrementalClassificationNaiveBayes オブジェクトです。Mdl は観測を処理していないため、"コールド" モデルです。学習用のテンプレートを表します。

モデルの性能を測定し、関数 updateMetricsAndFit を使用して、インクリメンタル モデルを学習データに当てはめます。1000 個の観測値のチャンクを一度に処理して、データ ストリームをシミュレートします。各反復で次を行います。

  1. 1000 個の観測値を処理します。

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

  3. 現在の最小コストを保存します。

この段階の実行には数分かかることがあります。

numObsPerChunk = 1000;
nchunks = floor(n/numObsPerChunk);
mc = array2table(zeros(nchunks,2),'VariableNames',["Cumulative" "Window"]);

for j = 1:nchunks
    ibegin = min(n,numObsPerChunk*(j-1) + 1);
    iend   = min(n,numObsPerChunk*j);
    idx = ibegin:iend; 
    XChunk = full(X(idx,:));
    Mdl = updateMetricsAndFit(Mdl,XChunk,Y(idx));
    mc{j,:} = Mdl.Metrics{"MinimalCost",:};
end

Mdl は、ストリーム内のすべてのデータで学習させた incrementalClassificationNaiveBayes モデル オブジェクトです。インクリメンタル学習中およびモデルがウォームアップされた後、updateMetricsAndFit は観測値の入力チャンクでモデルの性能をチェックし、モデルをその観測値に当てはめます。

最小コストをプロットして、学習中の進化の推移を確認します。

figure
plot(mc.Variables)
ylabel('Minimal Cost')
legend(mc.Properties.VariableNames)
xlabel('Iteration')

累積最小コストは滑らかに減少して 0.16 付近に落ち着くのに対し、チャンクに対して計算した最小コストは 0.14 と 0.18 の間でジャンプしています。

参考

オブジェクト

関数

関連するトピック