updateMetricsAndFit
線形インクリメンタル学習モデルの新しいデータに基づくパフォーマンス メトリクスの更新とモデルの学習
説明
ストリーミング データが与えられると、updateMetricsAndFit は、最初に、入力データの updateMetrics を呼び出して、線形回帰用 (incrementalRegressionLinear オブジェクト) または線形バイナリ分類用 (incrementalClassificationLinear オブジェクト) に構成されたインクリメンタル学習モデルのパフォーマンスを評価します。次に、updateMetricsAndFit は、fit を呼び出して、モデルをそのデータに当てはめます。言い換えると、updateMetricsAndFit は "逐次予測評価" を実行します。データの各入力チャンクをテスト セットとして扱い、累積的に測定されたパフォーマンス メトリクスと指定したウィンドウにおけるパフォーマンス メトリクスを追跡します[1]。
updateMetricsAndFit は、モデルのパフォーマンス メトリクスを更新し、データの各チャンクでモデルに学習させる簡単な方法を提供します。また、updateMetrics を呼び出してから fit を呼び出して、個別に操作を実行することもできます。これにより柔軟性を高めることができます (たとえば、データのチャンクでのパフォーマンスに基づいて、モデルに学習させる必要があるかどうかを決定できます)。
は、インクリメンタル学習モデル Mdl = updateMetricsAndFit(Mdl,X,Y)Mdl を返します。これは、入力インクリメンタル学習モデル Mdl であり、次の変更が行われます。
updateMetricsAndFitは、入力予測子と応答データ (それぞれXとY) のモデル パフォーマンスを測定します。入力モデルが "ウォーム" (Mdl.IsWarmがtrue) の場合、updateMetricsAndFitは以前に計算されたメトリクスを上書きし、Metricsプロパティに新しい値を保存します。それ以外の場合、updateMetricsAndFitは代わりにMetricsにNaN値を保存します。updateMetricsAndFitは、次の手順に従って、変更されたモデルを入力データに当てはめます。
入力モデルと出力モデルのデータ型は同じです。
例
バイナリ分類用の既定のインクリメンタル線形 SVM モデルを作成します。
Mdl = incrementalClassificationLinear()
Mdl =
incrementalClassificationLinear
IsWarm: 0
Metrics: [1×2 table]
ClassNames: [1×0 double]
ScoreTransform: 'none'
Beta: [0×1 double]
Bias: 0
Learner: 'svm'
Properties, Methods
Mdl は incrementalClassificationLinear モデル オブジェクトです。そのプロパティはすべて読み取り専用です。
Mdl は、他の演算の実行に使用する前に、データに当てはめなければなりません。
人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。
load humanactivity n = numel(actid); rng(1) % For reproducibility idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
データ セットの詳細については、コマンド ラインで Description を入力してください。
応答は、次の 5 つのクラスのいずれかになります。座る、立つ、歩く、走る、または踊る。被験者が移動しているかどうか (actid > 2) を基準に、応答を二分します。
Y = Y > 2;
関数 updateMetricsAndFit を使用して、インクリメンタル モデルを学習データに当てはめます。各反復で次を行います。
50 個の観測値のチャンクを処理して、データ ストリームをシミュレートします。
前のインクリメンタル モデルを、入力観測値に当てはめた新しいモデルで上書きします。
、累積メトリクス、およびウィンドウ メトリクスを保存し、インクリメンタル学習中にそれらがどのように進化するかを確認。
% Preallocation numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); ce = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]); beta1 = zeros(nchunk,1); % Incremental fitting for j = 1:nchunk ibegin = min(n,numObsPerChunk*(j-1) + 1); iend = min(n,numObsPerChunk*j); idx = ibegin:iend; Mdl = updateMetricsAndFit(Mdl,X(idx,:),Y(idx)); ce{j,:} = Mdl.Metrics{"ClassificationError",:}; beta1(j + 1) = Mdl.Beta(1); end
Mdl は、ストリーム内のすべてのデータで学習させた incrementalClassificationLinear モデル オブジェクトです。インクリメンタル学習中およびモデルがウォームアップされた後、updateMetricsAndFit は入力観測値でモデルの性能をチェックし、モデルをその観測値に当てはめます。
パフォーマンス メトリクスと が学習中にどのように進化するかを確認するには、それらを別々のタイルにプロットします。
t = tiledlayout(2,1); nexttile plot(beta1) ylabel('\beta_1') xlim([0 nchunk]) nexttile h = plot(ce.Variables); xlim([0 nchunk]) ylabel('Classification Error') xline((Mdl.EstimationPeriod + Mdl.MetricsWarmupPeriod)/numObsPerChunk,'g-.') legend(h,ce.Properties.VariableNames) xlabel(t,'Iteration')

プロットは、updateMetricsAndFit が次を行うことを示しています。
をインクリメンタル学習のすべての反復で当てはめます。
パフォーマンス メトリクスをメトリクスのウォームアップ期間後にのみ計算します。
累積メトリクスを各反復中に計算します。
ウィンドウ メトリクスを 200 個の観測値 (4 回の反復) の処理後に計算します。
fitrlinear を使用して線形回帰モデルに学習させ、それをインクリメンタル学習器に変換し、その性能を追跡し、ストリーミング データに当てはめます。学習オプションを従来式からインクリメンタル学習に引き継ぎます。
データの読み込みと前処理
2015 年のニューヨーク市住宅データ セットを読み込み、データをシャッフルします。このデータの詳細については、NYC Open Data を参照してください。
load NYCHousing2015 rng(1) % For reproducibility n = size(NYCHousing2015,1); idxshuff = randsample(n,n); NYCHousing2015 = NYCHousing2015(idxshuff,:);
マンハッタンから収集されたデータ (BOROUGH = 1) が、品質を 2 倍にする新しい方法を使用して収集されたとします。マンハッタンから収集した観測値に 2 を割り当て、その他すべての観測値に 1 を割り当てる重み変数を作成します。
n = size(NYCHousing2015,1); NYCHousing2015.W = ones(n,1) + (NYCHousing2015.BOROUGH == 1);
table から応答変数 SALEPRICE を抽出します。数値安定性を得るために、SALEPRICE を 1e6 の尺度でスケールします。
Y = NYCHousing2015.SALEPRICE/1e6; NYCHousing2015.SALEPRICE = [];
カテゴリカル予測子からダミー変数メトリクスを作成します。
catvars = ["BOROUGH" "BUILDINGCLASSCATEGORY" "NEIGHBORHOOD"]; dumvarstbl = varfun(@(x)dummyvar(categorical(x)),NYCHousing2015, ... 'InputVariables',catvars); dumvarmat = table2array(dumvarstbl); NYCHousing2015(:,catvars) = [];
table 内の他のすべての数値変数を売価の線形予測子として扱います。ダミー変数の行列を予測子データの残りに連結します。結果の予測子行列を転置します。
idxnum = varfun(@isnumeric,NYCHousing2015,'OutputFormat','uniform'); X = [dumvarmat NYCHousing2015{:,idxnum}]';
線形回帰モデルの学習
線形回帰モデルを、データの半分から取った無作為標本に当てはめます。
idxtt = randsample([true false],n,true); TTMdl = fitrlinear(X(:,idxtt),Y(idxtt),'ObservationsIn','columns', ... 'Weights',NYCHousing2015.W(idxtt))
TTMdl =
RegressionLinear
ResponseName: 'Y'
ResponseTransform: 'none'
Beta: [313×1 double]
Bias: 0.1116
Lambda: 2.1977e-05
Learner: 'svm'
Properties, Methods
TTMdl は従来式の学習済み線形回帰モデルを表す RegressionLinear モデル オブジェクトです。
学習済みモデルの変換
従来式の学習済み線形回帰モデルを、インクリメンタル学習用の線形回帰モデルに変換します。
IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl =
incrementalRegressionLinear
IsWarm: 1
Metrics: [1×2 table]
ResponseTransform: 'none'
Beta: [313×1 double]
Bias: 0.1116
Learner: 'svm'
Properties, Methods
パフォーマンス メトリクスの追跡とモデルの当てはめ
関数 updateMetricsAndFit を使用して、残りのデータに対してインクリメンタル学習を実行します。各反復で次を行います。
500 個の観測値のチャンクを処理して、データ ストリームをシミュレートします。
updateMetricsAndFitを呼び出し、観測値の入力チャンクを所与として、モデルのイプシロン不感応損失の累積とウィンドウを更新し、モデルをデータに当てはめます。前のインクリメンタル モデルを新しいモデルで上書きします。観測値の向きを列方向に指定し、観測値の重みを指定します。損失および最後に推定された係数 を保存します。
% Preallocation idxil = ~idxtt; nil = sum(idxil); numObsPerChunk = 500; nchunk = floor(nil/numObsPerChunk); ei = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]); beta313 = [IncrementalMdl.Beta(end); zeros(nchunk,1)]; Xil = X(:,idxil); Yil = Y(idxil); Wil = NYCHousing2015.W(idxil); % Incremental fitting for j = 1:nchunk ibegin = min(nil,numObsPerChunk*(j-1) + 1); iend = min(nil,numObsPerChunk*j); idx = ibegin:iend; IncrementalMdl = updateMetricsAndFit(IncrementalMdl,Xil(:,idx),Yil(idx), ... 'ObservationsIn','columns','Weights',Wil(idx)); ei{j,:} = IncrementalMdl.Metrics{"EpsilonInsensitiveLoss",:}; beta313(j+1) = IncrementalMdl.Beta(end); end
IncrementalMdl は、ストリーム内のすべてのデータで学習させた incrementalRegressionLinear モデル オブジェクトです。
パフォーマンス メトリクスと推定された係数 のトレース プロットをプロットします。
t = tiledlayout(2,1); nexttile h = plot(ei.Variables); xlim([0 nchunk]) ylabel('Epsilon Insensitive Loss') legend(h,ei.Properties.VariableNames) nexttile plot(beta313) ylabel('\beta_{313}') xlim([0 nchunk]) xlabel(t,'Iteration')

累積の損失は各反復 (500 個の観測値のチャンク) ごとに徐々に変化しますが、ウィンドウの損失には急な変動があります。メトリクス ウィンドウの既定値は 200 なので、updateMetricsAndFit は 500 個の観測値のチャンクごとに最新の 200 個の観測値に基づいて性能を測定します。
は変動した後、fit が観測値のチャンクを処理するたびに即座に平坦になります。
入力引数
パフォーマンスの測定とデータへの当てはめが行われるインクリメンタル学習モデル。incrementalClassificationLinear または incrementalRegressionLinear というモデル オブジェクトとして指定します。Mdl は、直接作成することも、サポートされている従来式の学習済み機械学習モデルを関数 incrementalLearner によって変換して作成することもできます。詳細については、対応するリファレンス ページを参照してください。
Mdl.IsWarm が false の場合、updateMetricsAndFit はモデルのパフォーマンスを追跡しません。詳細は、パフォーマンス メトリクスを参照してください。
モデルのパフォーマンスを測定して、モデルを当てはめる予測子データのチャンク。n 個の観測値および Mdl.NumPredictors 予測子変数の浮動小数点行列として指定します。名前と値の引数 ObservationsIn の値は、変数と観測値の方向を決定します。ObservationsIn の既定値は "rows" であり、予測子データの観測値が X の行に沿うことを示しています。
観測値のラベル Y の長さと X の観測値の数は同じでなければなりません。Y( は j)X 内の観測値 j (行または列) のラベルです。
メモ
Mdl.NumPredictors= 0 の場合、updateMetricsAndFitはXから予測子の数を推測し、出力モデルの対応するプロパティを設定します。それ以外の場合、ストリーミング データ内の予測子変数の数がMdl.NumPredictorsから変化すると、updateMetricsAndFitがエラーを生成します。updateMetricsAndFitは、浮動小数点の入力予測子データのみをサポートしています。入力データに categorical データが含まれている場合は、エンコード バージョンの categorical データを準備する必要があります。dummyvarを使用して、各カテゴリカル変数をダミー変数で構成される数値行列に変換します。その後、すべてのダミー変数行列とその他の数値予測子を連結します。詳細については、ダミー変数を参照してください。
データ型: single | double
モデルのパフォーマンスを測定して、モデルを当てはめる応答 (またはラベル) のチャンク。分類問題では、categorical 配列、文字配列、string 配列、logical ベクトル、浮動小数点ベクトル、または文字ベクトルの cell 配列として指定します。回帰問題では、浮動小数点ベクトルとして指定します。
観測値のラベル Y の長さと X の観測値の数は同じでなければなりません。Y( は j)X 内の観測値 j (行または列) のラベルです。
分類問題では次のようになります。
updateMetricsAndFitはバイナリ分類のみをサポートします。入力モデル
MdlのClassNamesプロパティが空以外の場合は、次の条件が適用されます。YがMdl.ClassNamesのメンバーではないラベルを含む場合、updateMetricsAndFitはエラーを生成します。YとMdl.ClassNamesのデータ型は同じでなければなりません。
データ型: char | string | cell | categorical | logical | single | double
メモ
観測値 (予測子またはラベル) または重みが少なくとも 1 つの欠損 (
NaN) 値を含む場合、updateMetricsAndFitはその観測値を無視します。したがって、updateMetricsAndFitは n 個よりも少ない観測値を使用してモデル パフォーマンスを計算し、更新したモデルを作成します。ここで n はX内の観測値数です。チャンク サイズ n と確率的勾配降下 (SGD) ハイパーパラメーター ミニバッチ サイズ (
Mdl.BatchSize) は異なる値とすることができ、n はミニバッチ サイズの倍数でなくてもかまいません。n <Mdl.BatchSizeの場合、updateMetricsAndFitは SGD の適用時に n 個の利用可能な観測値を使用します。n >Mdl.BatchSizeの場合、この関数は指定されたサイズのミニバッチでモデルを複数回更新し、残りの観測値を最後のミニバッチに使用します。最後のミニバッチに使用する観測値の数は、Mdl.BatchSizeより小さくてもかまいません。
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。
例: 'ObservationsIn','columns','Weights',W は、予測子行列の列が観測値に対応すること、およびインクリメンタル学習中に適用する観測値の重みがベクトル W に格納されていることを指定します。
予測子データにおける観測値の次元。'ObservationsIn' と 'columns' または 'rows' から構成されるコンマ区切りのペアとして指定します。
データ型: char | string
出力引数
更新されたインクリメンタル学習モデル。incrementalClassificationLinear または incrementalRegressionLinear の入力モデル Mdl と同じデータ型のインクリメンタル学習モデル オブジェクトとして返されます。
updateMetricsAndFit を呼び出すと、次の条件が適用されます。
モデルがウォームでない場合、
updateMetricsAndFitはパフォーマンス メトリクスを計算しません。その結果、MdlのMetricsプロパティは、NaN値で構成された状態を完全に維持します。詳細は、パフォーマンス メトリクスを参照してください。Mdl.EstimationPeriod> 0 の場合、updateMetricsAndFitは、渡された最初のMdl.EstimationPeriod個の観測値を使用してハイパーパラメーターを推定します。そのデータを使用して入力モデルの学習を行うことはありません。ただし、n 個の観測値の入力チャンクが推定期間 m で残された観測値の数以上である場合、updateMetricsAndFitは最初の n – m 個の観測値を使用してハイパーパラメーターを推定し、残りの m 個の観測値に入力モデルを当てはめます。したがって、ソフトウェアは、Betaプロパティ、Biasプロパティ、ハイパーパラメーター プロパティ、およびNumTrainingObservationsなどの記録保存プロパティを更新します。
分類問題の場合、入力モデル Mdl の ClassNames プロパティが空の配列であれば、updateMetricsAndFit は出力モデル Mdl の ClassNames プロパティを unique(Y) に設定します。
アルゴリズム
updateMetricsAndFitは、インクリメンタル モデルが "ウォーム" (IsWarmプロパティがtrue) のときに、新しいデータからMdl.Metricsの table の行ラベルで指定されたモデルのパフォーマンス メトリクスを追跡します。インクリメンタル モデルは、updateMetricsAndFitなどのインクリメンタル近似でインクリメンタル モデルをMdl.MetricsWarmupPeriodの観測値 ("メトリクスのウォームアップ期間") に当てはめた後、ウォームになります。Mdl.EstimationPeriod> 0 の場合、updateMetricsAndFitはモデルをデータに当てはめる前にハイパーパラメーターを推定します。そのため、関数は、モデルがメトリクスのウォームアップ期間を開始する前にEstimationPeriod個の観測値を追加で処理しなければなりません。インクリメンタル モデルの
Metricsプロパティは、各パフォーマンス メトリクスの 2 つの形式を table の変数 (列)CumulativeおよびWindowとし、個々のメトリクスを行に格納します。インクリメンタル モデルがウォームになると、updateMetricsAndFitは次の頻度でメトリクスを更新します。Cumulative— 関数は、モデルの性能追跡の開始以降の累積メトリクスを計算します。関数は、関数が呼び出されるたびにメトリクスを更新し、提供されたデータ セット全体に基づいて計算を行います。Window— 関数は、Mdl.MetricsWindowSizeプロパティによって決定されたウィンドウ内のすべての観測値に基づいてメトリクスを計算します。Mdl.MetricsWindowSizeによってソフトウェアがWindowメトリクスを更新する頻度も決まります。たとえば、Mdl.MetricsWindowSizeが 20 の場合、関数は提供されたデータの最後の 20 個の観測値に基づいてメトリクスを計算します (X((end – 20 + 1):end,:)およびY((end – 20 + 1):end))。ウィンドウ内のパフォーマンス メトリクスを追跡するインクリメンタル関数は、次のプロセスを使用します。
指定された各メトリクスについて長さ
Mdl.MetricsWindowSizeのバッファーを保存し、観測値の重みのバッファーを保存します。入力観測値のバッチに基づくモデル性能をメトリクス バッファーの要素に入力し、対応する観測値の重みを重みバッファーに格納します。
バッファーがいっぱいになると、
Mdl.Metrics.Windowをメトリクス ウィンドウの性能の加重平均で上書きします。関数が観測値のバッチを処理するときにバッファーがあふれる場合、最新の入力観測値Mdl.MetricsWindowSizeがバッファーに入り、最も古い観測値がバッファーから削除されます。たとえば、Mdl.MetricsWindowSizeが 20 で、メトリクス バッファーには前に処理されたバッチからの 10 個の値が存在し、15 個の値が入力されるとします。長さ 20 のウィンドウを構成するため、関数は 15 個の入力観測値からの測定値と前のバッチからの最新の 5 個の測定値を使用します。
CumulativeとWindowのパフォーマンス メトリクスの値を計算する際、予測 (分類の場合はスコア、回帰の場合は応答) がNaNの観測値は省略されます。
分類問題では、クラスの事前確率分布が既知の場合 (つまり、事前分布が経験分布でない場合)、updateMetricsAndFit は、観測値の重みを正規化して、それぞれのクラスの事前クラス確率の合計になるようにします。このアクションは、観測値の重みが既定でそれぞれのクラスの事前確率であることを前提としています。
回帰問題の場合、またはクラスの事前確率分布が経験分布の場合、ソフトウェアは、updateMetricsAndFit が呼び出されるたびに、指定された観測値の重みを正規化して、合計が 1 になるようにします。
参照
[1] Bifet, Albert, Ricard Gavaldá, Geoffrey Holmes, and Bernhard Pfahringer. Machine Learning for Data Streams with Practical Example in MOA. Cambridge, MA: The MIT Press, 2007.
拡張機能
使用上の注意および制限:
saveLearnerForCoder、loadLearnerForCoderおよびcodegen(MATLAB Coder) を使用して、関数updateMetricsAndFitのコードを生成します。saveLearnerForCoderを使用して、学習済みモデルを保存します。loadLearnerForCoderを使用して保存済みモデルを読み込んで関数updateMetricsAndFitを呼び出す、エントリポイント関数を定義します。次に、codegenを使用して、エントリポイント関数のコードを生成します。updateMetricsAndFitの単精度の C/C++ コードを生成するには、loadLearnerForCoder関数を呼び出すときにDataType="single"を指定します。次の表は、
updateMetricsAndFitの引数に関する注意です。この表に含まれていない引数は、完全にサポートされています。引数 注意と制限 Mdlモデル オブジェクトの使用上の注意および制限については、
incrementalClassificationLinearまたはincrementalRegressionLinearを参照してください。Xバッチ間の観測値の数は可変サイズにすることができますが、対応する
Yの観測値の数と等しくなければなりません。予測子変数の数は
Mdl.NumPredictorsと等しくなければなりません。Xはsingleまたはdoubleでなければなりません。
Yバッチ間の観測値の数は可変サイズにすることができますが、対応する
Xの観測値の数と等しくなければなりません。分類問題では、
YのすべてのラベルをMdl.ClassNamesで表さなければなりません。YとMdl.ClassNamesは同じデータ型でなければなりません。
次の制限が適用されます。
データをシャッフルするように
Mdlを構成した場合 (Mdl.Shuffleがtrueであるか、Mdl.Solverが'sgd'または'asgd')、関数updateMetricsAndFitは、モデルをバッチに当てはめる前に観測値の各入力バッチを無作為にシャッフルします。シャッフルされた観測値の順序は、MATLAB® で生成される順序と一致しないことがあります。したがって、MATLAB と生成コードで計算される近似係数が等しくならない場合があります。浮動小数点の入力引数およびオブジェクト プロパティには、すべて同質なデータ型を使用します。具体的には、
singleまたはdoubleのいずれかです。
詳細は、コード生成の紹介を参照してください。
バージョン履歴
R2020b で導入
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)