テキスト分類のインクリメント実行
この例では、モデルに対してインクリメンタル学習を行い、文書中の単語の頻度に基づいて文書を分類する方法である "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 のメトリクス ウィンドウ サイズを指定します。予測子 はディクショナリ内の単語 の単語頻度なので、クラスが与えられる場合、予測子が条件付きで結合して多項となるように指定します。
Mdl = incrementalClassificationNaiveBayes(MaxNumClasses=maxNumClasses,... MetricsWarmupPeriod=0,MetricsWindowSize=1000,DistributionNames='mn');
Mdl
は incrementalClassificationNaiveBayes
オブジェクトです。Mdl
は観測を処理していないため、"コールド" モデルです。学習用のテンプレートを表します。
モデルの性能を測定し、関数 updateMetricsAndFit
を使用して、インクリメンタル モデルを学習データに当てはめます。1000 個の観測値のチャンクを一度に処理して、データ ストリームをシミュレートします。各反復で次を行います。
1000 個の観測値を処理します。
前のインクリメンタル モデルを、入力観測値に当てはめた新しいモデルで上書きします。
現在の最小コストを保存します。
この段階の実行には数分かかることがあります。
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 の間でジャンプしています。
参考
オブジェクト
関数
predict
|fit
|updateMetrics