Main Content

updateMetricsAndFit

インクリメンタル ドリフト認識学習モデルの新しいデータに基づくパフォーマンス メトリクスの更新とモデルの学習

R2022b 以降

    説明

    Mdl = updateMetricsAndFit(Mdl,X,Y) は、インクリメンタル ドリフト認識学習モデル Mdl を返します。これは、入力インクリメンタル ドリフト認識学習モデル Mdl に次の変更を加えたものです。

    1. updateMetricsAndFit は、入力予測子と応答データ (それぞれ XY) のモデル パフォーマンスを測定します。入力モデルが "ウォーム" (Mdl.IsWarmtrue) の場合、updateMetricsAndFit は以前に計算されたメトリクスを上書きし、Metrics プロパティに新しい値を保存します。それ以外の場合、updateMetricsAndFit は代わりに MetricsNaN 値を保存します。

    2. updateMetricsAndFit は、インクリメンタル ドリフト認識学習を実行して、変更されたモデルを入力データに当てはめます。

    入力モデルと出力モデルのデータ型は同じです。

    Mdl = updateMetricsAndFit(Mdl,X,Y,Name=Value) は、1 つ以上の名前と値の引数によって指定された追加オプションを使用します。たとえば、予測子データ行列の列が観測値に対応するように指定したり、観測値の重みを設定したりできます。

    すべて折りたたむ

    補助関数の HelperSineGeneratorHelperConceptDriftGenerator をそれぞれ使用して、ランダムな概念データと概念ドリフト発生器を作成します。

    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 つ目のストリームから抽出される確率が低下します。このシグモイド関数により、一方のストリームからもう一方への滑らかな遷移が実現します。幅の値が大きいほど、両方のストリームがほぼ等しい確率で選択される遷移期間が大きいことを示します。

    分類用のインクリメンタル ドリフト認識モデルを次のように開始します。

    1. バイナリ分類用のインクリメンタル単純ベイズ分類モデルを作成します。

    2. 移動平均による Hoeffding 境界のドリフト検出法 (HDDMA) を使用するインクリメンタルな概念ドリフト検出器を開始します。

    3. インクリメンタル線形モデルと概念ドリフト検出器を使用して、インクリメンタル ドリフト認識モデルを開始します。学習期間を 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 個の観測値の入力チャンクを使用してデータ ストリームをシミュレートし、インクリメンタル ドリフト認識学習を実行します。各反復で次を行います。

    1. 予測子データとラベルをシミュレートし、補助関数 hgenerate を使用して driftGenerator を更新します。

    2. updateMetricsAndFit を呼び出して、パフォーマンス メトリクスを更新し、インクリメンタル ドリフト認識モデルを入力データに当てはめます。

    3. 可視化のためにドリフト ステータスと分類誤差を追跡して記録します。

    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")

    Figure contains an axes object. The axes object with xlabel Iteration, ylabel Classification Error contains 6 objects of type line, constantline. These objects represent Cumulative, Window.

    関数 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")

    Figure contains an axes object. The axes object with xlabel Iteration, ylabel Drift Status contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent Stable, Warning, Drift.

    入力引数

    すべて折りたたむ

    ストリーミング データに当てはめるインクリメンタル ドリフト認識学習モデル。incrementalDriftAwareLearner モデル オブジェクトとして指定します。Mdl は関数 incrementalDriftAwareLearner を使用して作成できます。詳細については、オブジェクトのリファレンス ページを参照してください。

    モデルが当てはめられる予測子データ チャンク。n 個の観測値と Mdl.BaseLearner.NumPredictors 個の予測子変数で構成される浮動小数点行列として指定します。

    Mdl.BaseLearner が名前と値の引数 ObservationsIn を受け入れる場合、ObservationsIn の値で変数と観測値の方向が決まります。ObservationsIn の既定値は "rows" であり、予測子データの観測値が X の行に沿うことを示しています。

    観測値の応答 (またはラベル) Y の長さと X の観測値の数は同じでなければなりません。Y(j)X 内の観測値 j (行または列) の応答 (またはラベル) です。

    メモ

    • Mdl.BaseLearner.NumPredictors = 0 の場合、updateMetricsAndFitX から予測子の数を推測し、出力モデルの対応するプロパティを設定します。それ以外の場合、ストリーミング データ内の予測子変数の数が 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 が空以外の場合は、次の条件が適用されます。

      • YMdl.BaseLearner.ClassNames のメンバーではないラベルを含む場合、updateMetricsAndFit はエラーを生成します。

      • YMdl.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 と同じでなければなりません。

    既定では Weightsones(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 の値より小さい場合、incrementalDriftAwareLearnerTrainingPeriod の値を 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' に設定され、BaseLearnerDriftDetector がリセットされると、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))。

        ウィンドウ内のパフォーマンス メトリクスを追跡するインクリメンタル関数は、次のプロセスを使用します。

        1. 指定された各メトリクスについて MetricsWindowSize の量の値を格納し、同じ量の観測値の重みを格納します。

        2. 入力観測値のバッチに基づくモデル性能をメトリクス値の要素に入力し、対応する観測値の重みを格納します。

        3. 観測値のウィンドウがいっぱいになると、Mdl.Metrics.Window をメトリクス ウィンドウの性能の加重平均で上書きします。関数が観測値のバッチを処理するときにウィンドウがあふれる場合、最新の入力観測値 MetricsWindowSize が格納され、最も古い観測値がウィンドウから削除されます。たとえば、MetricsWindowSize が 20 で、前に処理されたバッチからの 10 個の値が格納されていて、15 個の値が入力されるとします。長さ 20 のウィンドウを構成するため、関数は 15 個の入力観測値からの測定値と前のバッチからの最新の 5 個の測定値を使用します。

    • CumulativeWindow のパフォーマンス メトリクスの値を計算する際、スコアが 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 で導入