updateMetricsAndFit
説明
は、インクリメンタル ドリフト認識学習モデル Mdl = updateMetricsAndFit(Mdl,X,Y)Mdl を返します。これは、入力インクリメンタル ドリフト認識学習モデル Mdl に次の変更を加えたものです。
updateMetricsAndFitは、入力予測子と応答データ (それぞれXとY) のモデル パフォーマンスを測定します。入力モデルが "ウォーム" (Mdl.IsWarmがtrue) の場合、updateMetricsAndFitは以前に計算されたメトリクスを上書きし、Metricsプロパティに新しい値を保存します。それ以外の場合、updateMetricsAndFitは代わりにMetricsにNaN値を保存します。updateMetricsAndFitは、インクリメンタル ドリフト認識学習を実行して、変更されたモデルを入力データに当てはめます。
入力モデルと出力モデルのデータ型は同じです。
は、1 つ以上の名前と値の引数によって指定された追加オプションを使用します。たとえば、予測子データ行列の列が観測値に対応するように指定したり、観測値の重みを設定したりできます。Mdl = updateMetricsAndFit(Mdl,X,Y,Name=Value)
例
補助関数の HelperSineGenerator と HelperConceptDriftGenerator をそれぞれ使用して、ランダムな概念データと概念ドリフト発生器を作成します。
concept1 = HelperSineGenerator(ClassificationFunction=1,IrrelevantFeatures=true,TableOutput=false); concept2 = HelperSineGenerator(ClassificationFunction=3,IrrelevantFeatures=true,TableOutput=false); driftGenerator = HelperConceptDriftGenerator(concept1,concept2,15000,1000);
ClassificationFunction が 1 の場合、HelperSineGenerator は "x1" < "sin(x2)" を満たすすべての点に 1 のラベルを付け、それ以外に 0 のラベルを付けます。ClassificationFunction が 3 の場合はその逆になります。つまり、HelperSineGenerator は、"x1" >= "sin(x2)" を満たすすべての点に 1 のラベルを付け、それ以外に 0 のラベルを付けます [2]。そのデータがインクリメンタル学習器で使用するために行列として返されます。
HelperConceptDriftGenerator は、概念ドリフトを確立します。このオブジェクトでは、シグモイド関数 1./(1+exp(-4*(numobservations-position)./width)) を使用して、データ生成時に 1 つ目のストリームが選択される確率を判定します [3]。この例では、位置の引数が 15000 で、幅の引数が 1000 です。観測値の数が位置の値から幅の半分を引いた値を超えると、データ生成時に 1 つ目のストリームから抽出される確率が低下します。このシグモイド関数により、一方のストリームからもう一方への滑らかな遷移が実現します。幅の値が大きいほど、両方のストリームがほぼ等しい確率で選択される遷移期間が大きいことを示します。
分類用のインクリメンタル ドリフト認識モデルを次のように開始します。
バイナリ分類用のインクリメンタル単純ベイズ分類モデルを作成します。
移動平均による Hoeffding 境界のドリフト検出法 (HDDMA) を使用するインクリメンタルな概念ドリフト検出器を開始します。
インクリメンタル線形モデルと概念ドリフト検出器を使用して、インクリメンタル ドリフト認識モデルを開始します。学習期間を 5000 個の観測値として指定します。
BaseLearner = incrementalClassificationNaiveBayes(MaxNumClasses=2,Metrics="classiferror"); dd = incrementalConceptDriftDetector("hddma"); idal = incrementalDriftAwareLearner(BaseLearner,DriftDetector=dd,TrainingPeriod=5000);
データ ストリームの作成用に各チャンクの変数の数と反復回数を事前に割り当てます。
numObsPerChunk = 10; numIterations = 4000;
ドリフト ステータスとドリフト時間を追跡する変数、および分類誤差を格納する変数を事前に割り当てます。
dstatus = zeros(numIterations,1); statusname = strings(numIterations,1); driftTimes = []; ce = array2table(zeros(numIterations,2),VariableNames=["Cumulative" "Window"]);
それぞれ 10 個の観測値の入力チャンクを使用してデータ ストリームをシミュレートし、インクリメンタル ドリフト認識学習を実行します。各反復で次を行います。
予測子データとラベルをシミュレートし、補助関数
hgenerateを使用してdriftGeneratorを更新します。updateMetricsAndFitを呼び出して、パフォーマンス メトリクスを更新し、インクリメンタル ドリフト認識モデルを入力データに当てはめます。可視化のためにドリフト ステータスと分類誤差を追跡して記録します。
rng(12); % For reproducibility for j = 1:numIterations % Generate data [driftGenerator,X,Y] = hgenerate(driftGenerator,numObsPerChunk); % Update performance metrics and fit idal = updateMetricsAndFit(idal,X,Y); % Record drift status and classification error statusname(j) = string(idal.DriftStatus); ce{j,:} = idal.Metrics{"ClassificationError",:}; if idal.DriftDetected dstatus(j) = 2; elseif idal.WarningDetected dstatus(j) = 1; else dstatus(j) = 0; end if idal.DriftDetected driftTimes(end+1) = j; end end
累積とウィンドウごとの分類誤差をプロットします。ウォームアップ期間と学習期間、およびドリフトが発生した時点をマークします。
h = plot(ce.Variables); xlim([0 numIterations]) ylim([0 0.22]) ylabel("Classification Error") xlabel("Iteration") xline(idal.MetricsWarmupPeriod/numObsPerChunk,"g-.","Warmup Period",LineWidth=1.5) xline(idal.MetricsWarmupPeriod/numObsPerChunk+driftTimes,"g-.","Warmup Period",LineWidth=1.5) xline(idal.TrainingPeriod/numObsPerChunk,"b-.","Training Period",LabelVerticalAlignment="middle",LineWidth=1.5) xline(driftTimes,"m--","Drift",LabelVerticalAlignment="middle",LineWidth=1.5) legend(h,ce.Properties.VariableNames) legend(h,Location="best")

関数 updateMetricsAndFit は、まず updateMetrics を呼び出して入力データでモデルの性能を評価し、次に fit を呼び出してモデルをデータに当てはめます。
関数 updateMetrics は、入力観測値を処理しながらモデルの性能を評価します。指定したメトリクスについて、関数で処理された観測値の累積の測定値と指定したウィンドウにおける測定値が Metrics モデル プロパティに書き込まれます。
関数 fit は、データの入力バッチに基づいてベース学習器を更新してドリフトを監視することでモデルを当てはめます。fit を呼び出すと、次の手順が実行されます。
最大
NumTrainingObservations個の観測値について、モデルの学習が行われます。学習が完了すると、モデル損失の追跡が開始されます。概念ドリフトが発生していないかどうかがチェックされ、ドリフト ステータスが適宜更新されます。
ドリフト ステータスが
Warningの場合、差し迫ったドリフトに備えて、BaseLearnerに置き換わる一時的なモデルの学習が行われます。ドリフト ステータスが
Driftの場合、BaseLearnerが一時的なモデルに置き換えられます。ドリフト ステータスが
Stableの場合、一時的なモデルが破棄されます。
詳細については、"アルゴリズム" のセクションを参照してください。
ドリフト ステータスと反復回数の関係をプロットします。
gscatter(1:numIterations,dstatus,statusname,"gmr","o",5,"on","Iteration","Drift Status","filled")

入力引数
ストリーミング データに当てはめるインクリメンタル ドリフト認識学習モデル。incrementalDriftAwareLearner モデル オブジェクトとして指定します。Mdl は関数 incrementalDriftAwareLearner を使用して作成できます。詳細については、オブジェクトのリファレンス ページを参照してください。
モデルが当てはめられる予測子データ チャンク。n 個の観測値と Mdl.BaseLearner.NumPredictors 個の予測子変数で構成される浮動小数点行列として指定します。
Mdl.BaseLearner が名前と値の引数 ObservationsIn を受け入れる場合、ObservationsIn の値で変数と観測値の方向が決まります。ObservationsIn の既定値は "rows" であり、予測子データの観測値が X の行に沿うことを示しています。
観測値の応答 (またはラベル) Y の長さと X の観測値の数は同じでなければなりません。Y( は j)X 内の観測値 j (行または列) の応答 (またはラベル) です。
メモ
Mdl.BaseLearner.NumPredictors= 0 の場合、updateMetricsAndFitはXから予測子の数を推測し、出力モデルの対応するプロパティを設定します。それ以外の場合、ストリーミング データ内の予測子変数の数がMdl.BaseLearner.NumPredictorsから変化すると、updateMetricsAndFitがエラーを生成します。updateMetricsAndFitは、浮動小数点の入力予測子データのみをサポートしています。入力データに categorical データが含まれている場合は、エンコード バージョンの categorical データを準備する必要があります。dummyvarを使用して、各カテゴリカル変数をダミー変数で構成される数値行列に変換します。その後、すべてのダミー変数行列とその他の数値予測子を連結します。詳細については、ダミー変数を参照してください。
データ型: single | double
モデルを当てはめる応答 (またはラベル) のチャンク。次のいずれかとして指定します。
回帰モデルの場合、n 要素の浮動小数点ベクトル。ここで、n は
Xの行数です。分類モデルの場合、categorical 配列、文字配列、string 配列、logical ベクトル、または文字ベクトルの cell 配列。
Yが文字配列の場合、各行に 1 つのクラス ラベルを含めなければなりません。それ以外の場合、Yは n 要素のベクトルでなければなりません。
Y の長さと X の観測値の数は同じでなければなりません。Y( は j)X 内の観測値 j (行または列) の応答 (またはラベル) です。
分類問題では次のようになります。
Mdl.BaseLearner.ClassNamesが空以外の場合は、次の条件が適用されます。YがMdl.BaseLearner.ClassNamesのメンバーではないラベルを含む場合、updateMetricsAndFitはエラーを生成します。YとMdl.BaseLearner.ClassNamesのデータ型は同じでなければなりません。
Mdl.BaseLearner.ClassNamesが空の場合は、updateMetricsAndFitがデータからMdl.BaseLearner.ClassNamesを推定します。
データ型: single | double | categorical | char | string | logical | cell
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
例: ObservationsIn="columns",Weights=W は、予測子行列の列が観測値に対応すること、およびインクリメンタル学習中に適用する観測値の重みがベクトル W に格納されていることを指定します。
予測子データにおける観測値の次元。"columns" または "rows" として指定します。
updateMetricsAndFit は、Mdl.BaseLearner が名前と値の引数 ObservationsIn をサポートする場合にのみ ObservationsIn をサポートします。
例: ObservationsIn="columns"
データ型: char | string
観測値の重みのチャンク。正の値の浮動小数点ベクトルとして指定します。updateMetricsAndFit は、Weights 内の対応する値を使用して X 内の観測値に重みを付けます。Weights のサイズは X 内の観測値の数 n と同じでなければなりません。
既定では Weights は ones( です。n,1)
例: Weights=w
データ型: double | single
出力引数
更新されたインクリメンタル ドリフト認識学習モデル。入力モデル Mdl と同じデータ型のインクリメンタル学習モデル オブジェクト incrementalDriftAwareLearner として返されます。
アルゴリズム
"インクリメンタル学習" ("オンライン学習") は、予測子変数の分布、予測関数や目的関数の素性 (調整パラメーターの値を含む)、観測値にラベル付けがされているか等についてほぼ知識が無い時に、データ ストリームから入ってくるデータを処理することに関係している機械学習の一分野です。従来の機械学習は、モデルへの当てはめに十分にラベル付けされたデータを使用でき、交差検証を実施してハイパーパラメーターを調整し、予測子の分布を推論するもので、インクリメンタル学習と異なります。詳細については、インクリメンタル学習の概要を参照してください。
Statistics and Machine Learning Toolbox™ で提供される他のインクリメンタル学習機能と異なり、updateMetricsAndFit モデル オブジェクトはインクリメンタル学習と概念ドリフト検出の組み合わせで構成されます。
incrementalDriftAwareLearner オブジェクトを作成した後、updateMetrics を使用してモデルのパフォーマンス メトリクスを更新し、fit を使用して入力データ チャンクにベース モデルを当てはめ、モデルの性能に潜在的なドリフト (概念ドリフト) がないかどうかをチェックし、インクリメンタル ドリフト認識学習器を必要に応じて更新またはリセットします。updateMetricsAndFit も使用できます。関数 fit は反応性ドリフト検出法 (RDDM) [1]を次のように実装します。
Mdl.BaseLearner.EstimationPeriod(必要な場合) とMetricsWarmupPeriodの経過後、関数はインクリメンタル ドリフト認識モデルに最大NumTrainingObservations個の観測値をTrainingPeriodに達するまで学習させます。(TrainingPeriodの値がMdl.BaseLearner.MetricsWarmupPeriodの値より小さい場合、incrementalDriftAwareLearnerはTrainingPeriodの値をMdl.BaseLearner.MetricsWarmupPeriodとして設定します。)NumTrainingObservations > TrainingPeriodになった時点で、モデル損失の追跡が開始されます。関数perObservationLossを使用して観測値ごとの損失が計算されます。観測値ごとの損失の計算では、損失のメトリクスとして、分類モデルには"classiferror"、回帰モデルには"squarederror"が使用されます。その後、関数は最後のデータ チャンクを使用して計算された損失値を既存のバッファーの損失値に追加します。次に、関数
detectdriftを使用して概念ドリフトが発生していないかどうかがチェックされ、DriftStatusが適宜更新されます。
ドリフト ステータスに基づいて、fit は次の手順を実行します。
DriftStatusが'Warning'– 最初に、連続する'Warning'ステータスのカウントに 1 が加算されます。連続する
'Warning'ステータスのカウントがWarningCountLimitの値より小さく、PreviousDriftStatusの値がStableである場合、一時的なインクリメンタル学習器に学習させ (存在しない場合)、その学習器 (または既存の学習器) をBaseLearnerに設定します。その後、学習器の関数
resetを使用して一時的なインクリメンタル学習器をリセットします。連続する
'Warning'ステータスのカウントがWarningCountLimitの値より小さく、PreviousDriftStatusの値が'Warning'である場合、既存の一時的なインクリメンタル モデルに最新のデータ チャンクを使用して学習させます。連続する
'Warning'ステータスのカウントがWarningCountLimitの値より大きい場合、DriftStatusの値を'Drift'に設定します。
DriftStatusが'Drift'– 次の手順が実行されます。連続する
'Warning'ステータスのカウントを 0 に設定します。関数
resetを使用してDriftDetectorをリセットします。バッファーの損失値を空にし、最新のデータ チャンクの損失値をバッファーの損失値に追加します。
一時的なインクリメンタル モデルが空でない場合、現在の
BaseLearnerの値を一時的なインクリメンタル モデルに設定し、一時的なインクリメンタル モデルを空にします。一時的なインクリメンタル モデルが空の場合、学習器の関数
resetを使用してBaseLearnerの値をリセットします。
DriftStatusが'Stable'– 最初に、連続する'Stable'ステータスのカウントに 1 が加算されます。連続する
'Stable'ステータスのカウントがStableCountLimitより小さく、PreviousDriftStatusの値が'Warning'である場合、警告数をゼロに設定し、一時的なモデルを空にします。連続する
'Stable'ステータスのカウントがStableCountLimitの値より大きい場合、関数resetを使用してDriftDetectorをリセットします。その後、バッファーに保存されているすべての損失値について、概念ドリフトがないかどうかを関数detectdriftを使用してテストします。
DriftStatus が 'Drift' に設定され、BaseLearner と DriftDetector がリセットされると、Mdl.BaseLearner.EstimationPeriod + Mdl.BaseLearner.MetricsWarmupPeriod が経過するまで待機してからパフォーマンス メトリクスの計算を開始します。
関数
updateMetricsおよびupdateMetricsAndFitは、インクリメンタル モデルが "ウォーム" (Mdl.BaseLearner.IsWarmプロパティ) のときに、新しいデータからモデルのパフォーマンス メトリクス (Metrics) を追跡します。インクリメンタル モデルは、fitまたはupdateMetricsAndFitがインクリメンタル モデルをMetricsWarmupPeriod個の観測値 ("メトリクスのウォームアップ期間") に当てはめた後、ウォームになります。Mdl.BaseLearner.EstimationPeriod> 0 の場合、関数はモデルをデータに当てはめる前にハイパーパラメーターを推定します。そのため、関数は、モデルがメトリクスのウォームアップ期間を開始する前にEstimationPeriod個の観測値を追加で処理しなければなりません。インクリメンタル モデルの
Metricsプロパティは、各パフォーマンス メトリクスの 2 つの形式を table の変数 (列)CumulativeおよびWindowとし、個々のメトリクスを行に格納します。インクリメンタル モデルがウォームになると、updateMetricsおよびupdateMetricsAndFitは次の頻度でメトリクスを更新します。Cumulative— 関数は、モデルの性能追跡の開始以降の累積メトリクスを計算します。関数は、モデルがリセットされるまで、関数が呼び出されるたびにメトリクスを更新し、提供されたデータ セット全体に基づいて計算を行います。Window— 関数は、名前と値の引数MetricsWindowSizeによって決定されたウィンドウ内のすべての観測値に基づいてメトリクスを計算します。MetricsWindowSizeによってソフトウェアがWindowメトリクスを更新する頻度も決まります。たとえば、MetricsWindowSizeが 20 の場合、関数は提供されたデータの最後の 20 個の観測値に基づいてメトリクスを計算します (X((end – 20 + 1):end,:)およびY((end – 20 + 1):end))。ウィンドウ内のパフォーマンス メトリクスを追跡するインクリメンタル関数は、次のプロセスを使用します。
指定された各メトリクスについて
MetricsWindowSizeの量の値を格納し、同じ量の観測値の重みを格納します。入力観測値のバッチに基づくモデル性能をメトリクス値の要素に入力し、対応する観測値の重みを格納します。
観測値のウィンドウがいっぱいになると、
Mdl.Metrics.Windowをメトリクス ウィンドウの性能の加重平均で上書きします。関数が観測値のバッチを処理するときにウィンドウがあふれる場合、最新の入力観測値MetricsWindowSizeが格納され、最も古い観測値がウィンドウから削除されます。たとえば、MetricsWindowSizeが 20 で、前に処理されたバッチからの 10 個の値が格納されていて、15 個の値が入力されるとします。長さ 20 のウィンドウを構成するため、関数は 15 個の入力観測値からの測定値と前のバッチからの最新の 5 個の測定値を使用します。
CumulativeとWindowのパフォーマンス メトリクスの値を計算する際、スコアがNaNの観測値は省略されます。
参照
[1] Barros, Roberto S.M. , et al. "RDDM: Reactive drift detection method." Expert Systems with Applications. vol. 90, Dec. 2017, pp. 344-55. https://doi.org/10.1016/j.eswa.2017.08.023.
[2] Bifet, Albert, et al. "New Ensemble Methods for Evolving Data Streams." Proceedings of the 15th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. ACM Press, 2009, p. 139. https://doi.org/10.1145/1557019.1557041.
[3] Gama, João, et al. "Learning with drift detection". Advances in Artificial Intelligence – SBIA 2004, edited by Ana L. C. Bazzan and Sofiane Labidi, vol. 3171, Springer Berlin Heidelberg, 2004, pp. 286–95. https://doi.org/10.1007/978-3-540-28645-5_29.
バージョン履歴
R2022b で導入
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)