updateMetricsAndFit
説明
ストリーミング データが与えられると、updateMetricsAndFit
は、最初に、入力データの updateMetrics
を呼び出して、インクリメンタル学習用の構成済みのマルチクラス誤り訂正出力符号 (ECOC) 分類モデル (incrementalClassificationECOC
オブジェクト) のパフォーマンスを評価します。次に、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
は、変更されたモデルを入力データに当てはめ、更新されたバイナリ学習器と構成を出力モデルMdl
に格納します。
例
データ ストリームにおけるパフォーマンス メトリクスの更新とモデルの学習
クラスの最大数を指定してインクリメンタル ECOC 学習器を準備します。関数 updateMetricsAndFit
を使用して、モデルの性能をストリーミング データで追跡してモデルをデータに当てはめる操作を 1 回の呼び出しで行います。
incrementalClassificationECOC
を呼び出してインクリメンタル学習用の ECOC 分類モデルを作成し、データ内の予測される最大クラス数を 5 と指定します。
Mdl = incrementalClassificationECOC(MaxNumClasses=5)
Mdl = incrementalClassificationECOC IsWarm: 0 Metrics: [1x2 table] ClassNames: [1x0 double] ScoreTransform: 'none' BinaryLearners: {10x1 cell} CodingName: 'onevsone' Decoding: 'lossweighted'
Mdl
は incrementalClassificationECOC
モデル オブジェクトです。そのプロパティはすべて読み取り専用です。
Mdl
は、他の演算の実行に使用する前に、データに当てはめなければなりません。
人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。
load humanactivity n = numel(actid); rng(1) % For reproducibility idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
データ セットの詳細については、コマンド ラインで Description
を入力してください。
各反復で次のアクションを実行してインクリメンタル学習を実装します。
50 個の観測値のチャンクを処理して、データ ストリームをシミュレート。
前のインクリメンタル モデルを、入力観測値に当てはめた新しいモデルで上書き。
1 番目のバイナリ学習器の 1 番目のモデル係数 、累積メトリクス、およびウィンドウ メトリクスを保存し、インクリメンタル学習中にそれらがどのように進化するかを確認。
% Preallocation numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); mc = array2table(zeros(nchunk,2),VariableNames=["Cumulative","Window"]); beta11 = 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)); mc{j,:} = Mdl.Metrics{"ClassificationError",:}; beta11(j) = Mdl.BinaryLearners{1}.Beta(1); end
Mdl
は、ストリーム内のすべてのデータで学習させた incrementalClassificationECOC
モデル オブジェクトです。インクリメンタル学習中およびモデルがウォームアップされた後、updateMetricsAndFit
は入力観測値でモデルの性能をチェックし、モデルをその観測値に当てはめます。
パフォーマンス メトリクスと が学習中にどのように進化するかを確認するには、それらを別々のタイルにプロットします。
t = tiledlayout(2,1); nexttile plot(beta11) ylabel("\beta_{11}") xlim([0 nchunk]) nexttile plot(mc.Variables) xlim([0 nchunk]) ylabel("Classification Error") xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,"--") legend(mc.Properties.VariableNames) xlabel(t,"Iteration")
このプロットは、updateMetricsAndFit
が次のアクションを実行することを示しています。
をインクリメンタル学習のすべての反復で当てはめる。
パフォーマンス メトリクスをメトリクスのウォームアップ期間後にのみ計算。
累積メトリクスを各反復中に計算。
ウィンドウ メトリクスを 200 個の観測値 (4 回の反復) の処理後に計算。
観測値の方向および観測値の重みの指定
fitcecoc
を使用して ECOC 分類モデルに学習させ、incrementalLearner
を使用してインクリメンタル学習器に変換します。updateMetricsAndFit
を使用して、モデルの性能をストリーミング データで追跡してモデルをストリーミング データに当てはめる操作を 1 回の呼び出しで行います。updateMetricsAndFit
を呼び出すときに、観測値の方向と観測値の重みを指定します。
データの読み込みと前処理
人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。
load humanactivity rng(1) % For reproducibility n = numel(actid); idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
データ セットの詳細については、コマンド ラインで Description
を入力してください。
静止している被験者 (Y
<= 2) のデータが、移動している被験者のデータの倍の品質であると仮定します。静止している被験者の観測値に重み 2 を割り当て、移動している被験者の観測値に重み 1 を割り当てる重み変数を作成します。
W = ones(n,1) + (Y <= 2);
ECOC 分類モデルの学習
ECOC 分類モデルをデータの半分の無作為標本に当てはめます。
idxtt = randsample([true false],n,true); TTMdl = fitcecoc(X(idxtt,:),Y(idxtt),Weights=W(idxtt))
TTMdl = ClassificationECOC ResponseName: 'Y' CategoricalPredictors: [] ClassNames: [1 2 3 4 5] ScoreTransform: 'none' BinaryLearners: {10x1 cell} CodingName: 'onevsone'
TTMdl
は従来式の学習済み ECOC 分類モデルを表す ClassificationECOC
モデル オブジェクトです。
学習済みモデルの変換
従来式の学習済みモデルをインクリメンタル学習用のモデルに変換します。
IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = incrementalClassificationECOC IsWarm: 1 Metrics: [1x2 table] ClassNames: [1 2 3 4 5] ScoreTransform: 'none' BinaryLearners: {10x1 cell} CodingName: 'onevsone' Decoding: 'lossweighted'
IncrementalMdl
は incrementalClassificationECOC
モデル オブジェクトです。クラス名が IncrementalMdl.ClassNames
で指定されているため、インクリメンタル学習で見つかるラベルは IncrementalMdl.ClassNames
のいずれかでなければなりません。
パフォーマンス メトリクスの追跡とモデルの当てはめ
関数 updateMetricsAndFit
を使用して、残りのデータに対してインクリメンタル学習を実行します。予測子行列を転置し、updateMetricsAndFit
を呼び出すときにデータの方向を指定します。各反復で次を行います。
50 個の観測値を一度に処理して、データ ストリームをシミュレートします。
updateMetricsAndFit
を呼び出し、観測値の入力チャンクを所与として、モデルのパフォーマンス メトリクスの累積とウィンドウを更新し、モデルをデータに当てはめます。前のインクリメンタル モデルを新しいモデルで上書きします。観測値の向きを列方向に指定し、観測値の重みを指定します。誤分類誤差率を保存します。
% Preallocation idxil = ~idxtt; nil = sum(idxil); numObsPerChunk = 50; nchunk = floor(nil/numObsPerChunk); mc = array2table(zeros(nchunk,2),VariableNames=["Cumulative","Window"]); Xil = X(idxil,:)'; Yil = Y(idxil); Wil = 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), ... Weights=Wil(idx),ObservationsIn="columns"); mc{j,:} = IncrementalMdl.Metrics{"ClassificationError",:}; end
IncrementalMdl
は、ストリーム内のすべてのデータで学習させた incrementalClassificationECOC
モデル オブジェクトです。
誤分類誤差率のトレース プロットを作成します。
plot(mc.Variables) xlim([0 nchunk]) ylabel("Classification Error") legend(mc.Properties.VariableNames) xlabel("Iteration")
累積の損失は最初に変動した後に 0.03 近辺で安定しますが、ウィンドウの損失には学習全体を通じて急な変動があります。
入力引数
Mdl
— インクリメンタル学習モデル
incrementalClassificationECOC
モデル オブジェクト
パフォーマンスの測定とデータへの当てはめが行われるインクリメンタル学習モデル。incrementalClassificationECOC
モデル オブジェクトとして指定します。Mdl
は、incrementalClassificationECOC
を直接呼び出して作成することも、サポートされている従来式の学習済み機械学習モデルを関数 incrementalLearner
で変換して作成することもできます。
Mdl.IsWarm
が false
の場合、updateMetricsAndFit
はモデルのパフォーマンスを追跡しません。詳細については、パフォーマンス メトリクスを参照してください。
X
— 予測子データのチャンク
浮動小数点行列
予測子データのチャンク。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
Y
— ラベルのチャンク
categorical 配列 | 文字配列 | string 配列 | logical ベクトル | 浮動小数点ベクトル | 文字ベクトルの cell 配列
ラベルのチャンク。categorical 配列、文字配列、string 配列、logical ベクトル、浮動小数点ベクトル、または文字ベクトルの cell 配列として指定します。
観測値のラベル Y
の長さと X
の観測値の数は同じでなければなりません。Y(
は j
)X
内の観測値 j (行または列) のラベルです。
次の状況のいずれかまたは両方に該当する場合、updateMetricsAndFit
からエラーが発行されます。
Y
に新しいラベルが格納された時点で既にクラスの最大数に達していた (incrementalClassificationECOC
の引数MaxNumClasses
およびClassNames
を参照)。入力モデル
Mdl
のClassNames
プロパティが空以外で、Y
とMdl.ClassNames
のデータ型が異なる。
データ型: char
| string
| cell
| categorical
| logical
| single
| double
メモ
観測値 (予測子またはラベル) または重みが少なくとも 1 つの欠損 (NaN
) 値を含む場合、updateMetricsAndFit
はその観測値を無視します。したがって、updateMetricsAndFit
は n 個よりも少ない観測値を使用してモデル パフォーマンスを計算し、更新したモデルを作成します。ここで n は X
内の観測値数です。
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
例: ObservationsIn="columns",Weights=W
は、予測子行列の列が観測値に対応すること、およびインクリメンタル学習中に適用する観測値の重みがベクトル W
に格納されていることを指定します。
ObservationsIn
— 予測子データにおける観測値の次元
"rows"
(既定値) | "columns"
予測子データにおける観測値の次元。"rows"
または "columns"
として指定します。
例: ObservationsIn="columns"
データ型: char
| string
出力引数
Mdl
— 更新されたインクリメンタル学習用の ECOC 分類モデル
incrementalClassificationECOC
モデル オブジェクト
更新されたインクリメンタル学習用の ECOC 分類モデル。入力モデル Mdl
と同じデータ型のインクリメンタル学習モデル オブジェクト incrementalClassificationECOC
として返されます。
モデルがウォームでない場合、updateMetricsAndFit
はパフォーマンス メトリクスを計算しません。その結果、Mdl
の Metrics
プロパティは、NaN
値で構成された状態を完全に維持します。モデルがウォームの場合、updateMetricsAndFit
は、新しいデータ X
と Y
における累積およびウィンドウのパフォーマンス メトリクスを計算し、Mdl.Metrics
の対応する要素を上書きします。詳細については、パフォーマンス メトリクスを参照してください。
incrementalClassificationECOC
を使用して入力モデル Mdl
を作成する際、想定されるすべてのクラスが名前と値の引数 ClassNames
を使用して指定されていない場合、想定されるクラスで未処理のクラスが Y
に含まれていると、updateMetricsAndFit
は次のアクションを実行します。
Y
内の新しいラベルをMdl.ClassNames
の末尾に追加します。Mdl.Prior
を更新された経験的クラス分布の長さ c のベクトルに拡張します。ここで、c はMdl.ClassNames
内のクラスの数です。
アルゴリズム
パフォーマンス メトリクス
updateMetrics
およびupdateMetricsAndFit
は、インクリメンタル モデルが "ウォーム" (IsWarm
プロパティがtrue
) のときにのみ、新しいデータからMdl.Metrics
の table の行ラベルで指定されたモデルのパフォーマンス メトリクスを追跡します。incrementalLearner
を使用してインクリメンタル モデルを作成するときに、MetricsWarmupPeriod
が 0 (incrementalLearner
の既定値) である場合、モデルは作成時にウォームになります。それ以外の場合、インクリメンタル モデルは、関数
fit
またはupdateMetricsAndFit
で次の両方のアクションを実行するとウォームになります。インクリメンタル モデルを
Mdl.MetricsWarmupPeriod
の観測値 ("メトリクスのウォームアップ期間") に当てはめる。インクリメンタル モデルを予測されるすべてのクラスに当てはめる (
incrementalClassificationECOC
の引数MaxNumClasses
とClassNames
を参照)。
Mdl.Metrics
プロパティは、各パフォーマンス メトリクスの 2 つの形式を table の変数 (列)Cumulative
およびWindow
とし、個々のメトリクスを行に格納します。インクリメンタル モデルがウォームになると、updateMetrics
および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.
バージョン履歴
R2022a で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)