incrementalDriftAwareLearner
説明
incrementalDriftAwareLearner
は incrementalDriftAwareLearner
モデル オブジェクトを作成します。これは、インクリメンタルな分類学習器または回帰学習器とインクリメンタルな概念ドリフト検出器が組み込まれたオブジェクトで、自己調整式のインクリメンタルな機械学習モデルを提供します。incrementalDriftAwareLearner
は、インクリメンタル学習用のすべての分類モデルと回帰モデル、および Statistics and Machine Learning Toolbox™ でサポートされるすべての概念ドリフト検出法をサポートしています。
Statistics and Machine Learning Toolbox のほとんどのモデル オブジェクトとは異なり、incrementalDriftAwareLearner
は直接呼び出すことができます。incrementalDriftAwareLearner
オブジェクトを作成すると、インクリメンタル ドリフト認識学習用に準備されます。
incrementalDriftAwareLearner
は、概念ドリフトに適応するインクリメンタル学習に最適です。バッチ ドリフト検出に対する従来のアプローチについては、detectdrift
を参照してください。
作成
incrementalDriftAwareLearner
モデル オブジェクトは次の方法で作成できます。
いずれかのインクリメンタル学習器を使用してインクリメンタルな分類学習器または回帰学習器を開始します。そのインクリメンタル学習モデルを
incrementalDriftAwareLearner
の呼び出しで入力として渡します。たとえば、以下のようにします。BaseLearner = incrementalClassificationLinear(); Mdl = incrementalDriftAwareLearner(BaseLearner);
いずれかのインクリメンタル学習器を使用してインクリメンタルな分類学習器または回帰学習器を開始します。
incrementalConceptDriftDetector
を使用してインクリメンタルな概念ドリフト検出器を開始します。そのインクリメンタル学習モデルと概念ドリフト検出器の両方をincrementalDriftAwareLearner
の呼び出しで入力として渡します。たとえば、以下のようにします。BaseLearner = incrementalRegressionKernel(); DDM = incrementalConceptDriftDetector("ddm"); Mdl = incrementalDriftAwareLearner(BaseLearner,DriftDetector=DDM);
構文
説明
は、既定のモデル パラメーターと既定のドリフト検出器をもつインクリメンタル学習用のドリフト認識モデル Mdl
= incrementalDriftAwareLearner(BaseLearner
)Mdl
を返します。
は、名前と値の引数を使用して追加のオプションを設定します。たとえば、Mdl
= incrementalDriftAwareLearner(BaseLearner
,Name=Value
)incrementalDriftAwareLearner(BaseLearner,DriftDetector=CDDetector,TrainingPeriod=1000)
は、概念ドリフト検出器を事前定義された CDDetector
と指定し、学習期間を 1000 個の観測値に設定します。
入力引数
BaseLearner
— 基になるインクリメンタルな分類モデルまたは回帰モデル
incrementalClassificationKernel
オブジェクト | incrementalClassificationLinear
オブジェクト | incrementalClassificationECOC
オブジェクト | incrementalClassificationNaiveBayes
オブジェクト | incrementalRegressionKernel
オブジェクト | incrementalRegressionLinear
オブジェクト
基になるインクリメンタルな分類モデルまたは回帰モデル。次のいずれかとして指定します。
分類 | 回帰 |
incrementalClassificationKernel | incrementalRegressionKernel |
incrementalClassificationLinear | incrementalRegressionLinear |
incrementalClassificationECOC | |
incrementalClassificationNaiveBayes |
これらの学習器の作成方法については、対応するリファレンス ページを参照してください。
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
例: BufferSize=5000,TrainingPeriod=8000,StableCountLimit=6000
は、バッファー サイズを 5000、学習期間を 8000、リセットするまでの連続する安定状態の観測値の上限を 6000 と指定します。
BufferSize
— 損失値を格納するバッファーのサイズ
7000 (既定値) | 整数スカラー
各学習観測値についての BaseLearner
の損失値を格納するバッファーのサイズ。スカラー整数として指定します。
例: BufferSize=5000
データ型: single
| double
DriftDetector
— インクリメンタルな概念ドリフト検出器
HoeffdingDriftDetectionMethod
オブジェクト | DriftDetectionMethod
オブジェクト
ドリフトの監視と検出に使用するインクリメンタルな概念ドリフト検出器。HoeffdingDriftDetectionMethod
オブジェクトまたは DriftDetectionMethod
オブジェクトとして指定します。
BaseLearner
がインクリメンタルな分類オブジェクトの場合、既定の検出器は移動平均法を使用するHoeffdingDriftDetectionMethod
です。つまり、incrementalDriftAwareLearner
はincrementalConceptDriftDetector("hddma")
を使用してドリフト検出器を作成します。BaseLearner
がインクリメンタルな回帰オブジェクトの場合、既定では連続変数用の移動平均法を使用するHoeffdingDriftDetectionMethod
です。つまり、incrementalDriftAwareLearner
はincrementalConceptDriftDetector("hddma",InputType="continuous")
を使用してドリフト検出器を作成します。
別の方法を使用するインクリメンタルな概念ドリフト検出器を指定するには、incrementalConceptDriftDetector
のリファレンス ページを参照してください。
例: DriftDetector=dd
TrainingPeriod
— 学習に使用された観測値の数
10000 (既定値) | 整数スカラー
学習に使用された観測値の数。スカラー整数として指定します。
TrainingPeriod
の値を Inf
と指定すると、常に入力データで学習が行われます。
TrainingPeriod
の値が BaseLearner.MetricsWarmupPeriod
の値より小さい場合、incrementalDriftAwareLearner
は TrainingPeriod
の値を BaseLearner.MetricsWarmupPeriod
として設定します。
例: TrainingPeriod=7000
データ型: single
| double
StableCountLimit
— ソフト リセットするまでの連続する 'Stable'
の観測値の最大数
40000 (既定値) | 整数スカラー
ソフト リセットするまでの連続する 'Stable'
の観測値の最大数。スカラー整数として指定します。
例: StableCountLimit=35000
データ型: single
| double
WarningCountLimit
— リセットするまでの連続する 'Warning'
の観測値の最大数
1400 (既定値) | 整数スカラー
リセットするまでの連続する 'Warning'
の観測値の最大数。スカラー整数として指定します。
例: WarningCountLimit=1000
データ型: single
| double
プロパティ
BaseLearner
— 基になるインクリメンタルな分類モデルまたは回帰モデル
incrementalClassificationKernel
オブジェクト | incrementalClassificationLinear
オブジェクト | incrementalClassificationECOC
オブジェクト | incrementalClassificationNaiveBayes
オブジェクト | incrementalRegressionKernel
オブジェクト | incrementalRegressionLinear
オブジェクト
この プロパティ は読み取り専用です。
基になるインクリメンタルな分類モデルまたは回帰モデル。次のモデル オブジェクトのいずれかとして指定します。
分類 | 回帰 |
incrementalClassificationKernel | incrementalRegressionKernel |
incrementalClassificationLinear | incrementalRegressionLinear |
incrementalClassificationECOC | |
incrementalClassificationNaiveBayes |
このプロパティは、入力引数 BaseLearner
で設定されます。
BaseLearner
のプロパティにアクセスするには、たとえば Mdl.BaseLearner.Solver
のようにドット表記を使用します。
DriftDetector
— 基になるインクリメンタルな概念ドリフト検出器
HoeffdingDriftDetectionMethod
オブジェクト | DriftDetectionMethod
オブジェクト
この プロパティ は読み取り専用です。
基になるインクリメンタルな概念ドリフト検出器。HoeffdingDriftDetectionMethod
オブジェクトまたは DriftDetectionMethod
オブジェクトのいずれかとして指定します。
このプロパティは、名前と値の引数 DriftDetector
で設定されます。
DriftDetector
のプロパティにアクセスするには、たとえば Mdl.DriftDetector.WarningThreshold
のようにドット表記を使用します。
TrainingPeriod
— 学習に使用された観測値の数
整数スカラー
この プロパティ は読み取り専用です。
潜在的なドリフトの監視を開始するまでの学習に使用された観測値の数。スカラー整数として指定します。
このプロパティは、名前と値の引数 TrainingPeriod
で設定されます。
データ型: double
StableCountLimit
— ソフト リセットするまでの連続する 'Stable'
の観測値の最大数
整数スカラー
この プロパティ は読み取り専用です。
ソフト リセットするまでの連続する 'Stable'
の観測値の最大数。スカラー整数として指定します。
このプロパティは、名前と値の引数 StableCountLimit
で設定されます。
データ型: double
PreviousDriftStatus
— 最新のデータを学習する前の DriftDetector
のステータス
'Stable'
| 'Warning'
| 'Drift'
この プロパティ は読み取り専用です。
最新のデータを学習する前の DriftDetector
のステータス。'Stable'
、'Warning'
、または 'Drift'
として指定します。
データ型: char
DriftStatus
— DriftDetector
の現在のステータス
'Stable'
| 'Warning'
| 'Drift'
この プロパティ は読み取り専用です。
最新のデータを学習した後の DriftDetector
の現在のステータス。'Stable'
、'Warning'
、または 'Drift'
として指定します。
データ型: char
DriftDetected
— DriftStatus
が 'Drift'
であるかどうかを示すフラグ
false
または 0
| true
または 1
この プロパティ は読み取り専用です。
DriftStatus
が 'Drift'
であるかどうかを示すフラグ。logical 0
(false
) または 1
(true
) として指定します。
データ型: logical
WarningCountLimit
— リセットするまでの連続する 'Warning'
の観測値の最大数
整数スカラー
この プロパティ は読み取り専用です。
リセットするまでの連続する 'Warning'
の観測値の最大数。スカラー整数として指定します。
データ型: double
WarningDetected
— DriftStatus
が 'Warning'
であるかどうかを示すフラグ
false
または 0
| true
または 1
この プロパティ は読み取り専用です。
DriftStatus
が 'Warning'
であるかどうかを示すフラグ。logical 0
(false
) または 1
(true
) として指定します。
データ型: logical
IsTraining
— BaseLearner
で入力データでの学習を続行するかどうかを示すフラグ
false
または 0
| true
または 1
この プロパティ は読み取り専用です。
BaseLearner
で入力データでの学習を続行するかどうかを示すフラグ。logical 0
(false
) または 1
(true
) として指定します。
データ型: logical
IsWarm
— モデルがパフォーマンス メトリクスを追跡するかどうかを示すフラグ
false
または 0
| true
または 1
この プロパティ は読み取り専用です。
インクリメンタル モデルがパフォーマンス メトリクスを追跡するかどうかを示すフラグ。logical 0
(false
) または 1
(true
) として指定します。
incrementalDriftAwareLearner
は、このプロパティを Mdl.BaseLearner
から取得します。
インクリメンタル モデル Mdl
は、インクリメンタル近似関数が (Mdl.BaseLearner.EstimationPeriod
+ MetricsWarmupPeriod
) 個の観測値をインクリメンタル モデルに当てはめた後、"ウォーム" (IsWarm
が true
となる) になります。
値 | 説明 |
---|---|
true または 1 | インクリメンタル モデル Mdl がウォームです。この結果、updateMetrics および updateMetricsAndFit が Mdl の Metrics プロパティのパフォーマンス メトリクスを追跡します。 |
false または 0 | インクリメンタル モデル Mdl がウォームでありません。updateMetrics および updateMetricsAndFit はパフォーマンス メトリクスを追跡しません。 |
データ型: logical
NumPredictors
— 予測子変数の数
非負の数値スカラー
この プロパティ は読み取り専用です。
予測子変数の数。非負の数値スカラーとして指定します。
incrementalDriftAwareLearner
は、このプロパティを Mdl.BaseLearner
から取得します。予測子変数の数は BaseLearner
の開始時に指定できます。
データ型: double
NumTrainingObservations
— インクリメンタル モデルに当てはめる観測値の数
0
(既定値) | 非負の数値スカラー
この プロパティ は読み取り専用です。
インクリメンタル モデル Mdl
に当てはめる観測値の数。非負の数値スカラーとして指定します。
incrementalDriftAwareLearner
は、このプロパティを Mdl.BaseLearner
から取得します。
NumTrainingObservations
は、Mdl
および学習データを fit
または updateMetricsAndFit
に渡すときに増加します。
メモ
従来式の学習済みモデルを変換して Mdl.BaseLearner
を作成する場合、incrementalDriftAwareLearner
は、従来式の学習済みモデルに当てはめる観測値の数を NumTrainingObservations
に追加しません。
データ型: double
Metrics
— モデルのパフォーマンス メトリクス
テーブル
この プロパティ は読み取り専用です。
updateMetrics
または updateMetricsAndFit
によってインクリメンタル学習中に更新されたモデルのパフォーマンス メトリクス。m 行 2 列の table として指定します。ここで、m は、BaseLearner
の開始時に名前と値の引数 Metrics
で指定されたメトリクスの数です。
incrementalDriftAwareLearner
は、このプロパティを Mdl.BaseLearner
から取得します。
Metrics
の列には Cumulative
および Window
のラベルが付けられます。
Cumulative
– 要素j
は、メトリクスj
で測定される、モデルがウォーム (IsWarm
が1
) になった時点からの、モデルの性能です。Window
– 要素j
は、メトリクスj
で測定され、MetricsWindowSize
プロパティで指定されたウィンドウ内のすべての観測値に対して評価される、モデルの性能です。ソフトウェアはMetricsWindowSize
個の観測値を処理した後、Window
を更新します。
行には、指定したメトリクスのラベルが付けられます。
データ型: table
MetricsWarmupPeriod
— パフォーマンス メトリクスを追跡する前に当てはめる観測値の数
非負の整数
この プロパティ は読み取り専用です。
インクリメンタル モデルが Metrics
プロパティのパフォーマンス メトリクスを追跡する前に当てはめなければならない観測値の数。非負の整数として指定します。
incrementalDriftAwareLearner
は、このプロパティを Mdl.BaseLearner
から取得します。メトリクスのウォームアップ期間は BaseLearner
の開始時に指定できます。
データ型: double
MetricsWindowSize
— ウィンドウ パフォーマンス メトリクスの計算に使用する観測値の数
正の整数
この プロパティ は読み取り専用です。
ウィンドウ パフォーマンス メトリクスの計算に使用する観測値の数。正の整数として指定します。
incrementalDriftAwareLearner
は、このプロパティを Mdl.BaseLearner
から取得します。メトリクスのウィンドウ サイズは BaseLearner
の開始時に指定できます。
データ型: double
オブジェクト関数
fit | インクリメンタル学習用のドリフト認識学習器の新しいデータでの学習 |
loss | インクリメンタル ドリフト認識学習器の回帰誤差または分類誤差 |
perObservationLoss | インクリメンタル ドリフト認識学習器の観測値ごとの回帰誤差または分類誤差 |
predict | インクリメンタル ドリフト認識学習モデルからの新しい観測の応答予測 |
reset | インクリメンタル ドリフト認識学習器のリセット |
updateMetrics | インクリメンタル ドリフト認識学習モデルの新しいデータに基づくパフォーマンス メトリクスの更新 |
updateMetricsAndFit | インクリメンタル ドリフト認識学習モデルの新しいデータに基づくパフォーマンス メトリクスの更新とモデルの学習 |
例
事前情報なしでのインクリメンタル ドリフト認識学習器の作成
人の行動のデータセットを読み込みます。データをランダムにシャッフルします。
load humanactivity; n = numel(actid); rng(1) % For reproducibility idx = randsample(n,n);
データ セットの詳細については、コマンド ラインで Description
を入力してください。
予測子変数と応答変数を定義します。
X = feat(idx,:); Y = actid(idx);
応答は、次の 5 つのクラスのいずれかになります。座る、立つ、歩く、走る、または踊る。被験者が移動しているかどうか (actid > 2) を基準に、応答を二分します。
Y = Y > 2;
データセットの後半部分のラベルを反転してドリフトをシミュレートします。
Y(floor(numel(Y)/2):end,:) = ~Y(floor(numel(Y)/2):end,:);
分類用の既定のインクリメンタル ドリフト認識モデルを次のように開始します。
バイナリ分類用の既定のインクリメンタル線形 SVM モデルを作成します。
インクリメンタル線形 SVM モデルを使用して、既定のインクリメンタル ドリフト認識モデルを開始します。
incMdl = incrementalClassificationLinear(); idaMdl = incrementalDriftAwareLearner(incMdl);
idaMdl
は incrementalDriftAwareLearner
モデルです。そのプロパティはすべて読み取り専用です。
データ ストリームの作成用に各チャンクの変数の数を事前に割り当てて、分類誤差を格納するための変数も割り当てます。
numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); ce = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
ドリフト ステータスを追跡する変数を事前に割り当てます。
status = zeros(nchunk,1); statusname = strings(nchunk,1);
それぞれ 50 個の観測値の入力チャンクを使用して、データ ストリームをシミュレートします。各反復で次を行います。
updateMetricsAndFit
を呼び出して、パフォーマンス メトリクスを更新し、ドリフト認識モデルを入力データに当てはめます。前のインクリメンタル モデルを新しいモデルで上書きします。累積と反復ごとの分類誤差を
ce
に格納します。idaMdl
のMetrics
プロパティに累積とウィンドウの分類誤差が格納され、各反復で更新されます。
for j = 1:nchunk ibegin = min(n,numObsPerChunk*(j-1)+1); iend = min(n,numObsPerChunk*j); idx = ibegin:iend; idaMdl = updateMetricsAndFit(idaMdl,X(idx,:),Y(idx)); statusname(j) = string(idaMdl.DriftStatus); if idaMdl.DriftDetected status(j) = 2; elseif idaMdl.WarningDetected status(j) = 1; else status(j) = 0; end ce{j,:} = idaMdl.Metrics{"ClassificationError",:}; end
関数 updateMetricsAndFit
は、まず updateMetrics
を呼び出して入力データでモデルの性能を評価し、次に fit
を呼び出してモデルをデータに当てはめます。
関数 updateMetrics
は、入力観測値を処理しながらモデルの性能を評価します。指定したメトリクスについて、関数で処理された観測値の累積の測定値と指定したウィンドウにおける測定値が Metrics
モデル プロパティに書き込まれます。
関数 fit
は、データの入力バッチに基づいてベース学習器を更新してドリフトを監視することでモデルを当てはめます。fit
を呼び出すと、次の手順が実行されます。
最大
NumTrainingObservations
個の観測値について、モデルの学習が行われます。学習が完了すると、モデル損失の追跡が開始されます。概念ドリフトが発生していないかどうかがチェックされ、ドリフト ステータスが適宜更新されます。
ドリフト ステータスが
Warning
の場合、差し迫ったドリフトに備えて、BaseLearner
に置き換わる一時的なモデルの学習が行われます。ドリフト ステータスが
Drift
の場合、BaseLearner
が一時的なモデルに置き換えられます。ドリフト ステータスが
Stable
の場合、一時的なモデルが破棄されます。
詳細については、"アルゴリズム" のセクションを参照してください。
累積とウィンドウごとの分類誤差をプロットします。ウォームアップ期間と学習期間、およびドリフトが発生した時点をマークします。
h = plot(ce.Variables); xlim([0 nchunk]) ylabel("Classification Error") xlabel("Iteration") xline(idaMdl.MetricsWarmupPeriod/numObsPerChunk,"g-.","Warmup Period",LineWidth= 1.5) xline(idaMdl.TrainingPeriod/numObsPerChunk,"b-.","Training Period",LabelVerticalAlignment="middle",LineWidth= 1.5) xline(floor(numel(Y)/2)/numObsPerChunk,"m--","Drift",LabelVerticalAlignment="middle",LineWidth= 1.5) legend(h,ce.Properties.VariableNames) legend(h,Location="best")
ドリフト ステータスと反復回数の関係をプロットします。
figure() gscatter(1:nchunk,status,statusname,'gmr','*ox',[4 5 5],'on',"Iteration","Drift Status","filled")
パフォーマンス メトリクスの計算と概念ドリフトの監視
補助関数の 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")
回帰モデルの概念ドリフトの監視
補助関数の HelperRegrGenerator
と HelperConceptDriftGenerator
をそれぞれ使用して、ランダムな概念データと概念ドリフト発生器を作成します。
concept1 = HelperRegrGenerator(NumFeatures=100,NonZeroFeatures=[1,20,40,50,55], ... FeatureCoefficients=[4,5,10,-2,-6],NoiseStd=1.1,TableOutput=false); concept2 = HelperRegrGenerator(NumFeatures=100,NonZeroFeatures=[10,20,45,56,80], ... FeatureCoefficients=[4,5,10,-2,-6],NoiseStd=1.1,TableOutput=false); driftGenerator = HelperConceptDriftGenerator(concept1,concept2,15000,1000);
HelperRegrGenerator
は、関数の呼び出しで指定された回帰用の特徴量と特徴量係数を使用してストリーミング データを生成します。この関数は、各ステップで正規分布から予測子を抽出します。その後、関数は特徴量係数と予測子の値を使用して、平均がゼロで指定のノイズ標準偏差をもつ正規分布からランダム ノイズを追加することで応答を計算します。そのデータがインクリメンタル学習器で使用するために行列として返されます。
HelperConceptDriftGenerator
は、概念ドリフトを確立します。このオブジェクトでは、シグモイド関数 1./(1+exp(-4*(numobservations-position)./width))
を使用して、データ生成時に 1 つ目のストリームが選択される確率を判定します [3]。この例では、位置の引数が 15000 で、幅の引数が 1000 です。観測値の数が位置の値から幅の半分を引いた値を超えると、データ生成時に 1 つ目のストリームから抽出される確率が低下します。このシグモイド関数により、一方のストリームからもう一方への滑らかな遷移が実現します。幅の値が大きいほど、両方のストリームがほぼ等しい確率で選択される遷移期間が大きいことを示します。
回帰用のインクリメンタル ドリフト認識モデルを次のように開始します。
回帰用のインクリメンタル線形モデルを作成します。線形回帰モデルのタイプとソルバーのタイプを指定します。
移動平均による Hoeffding 境界のドリフト検出法 (HDDMA) を使用するインクリメンタルな概念ドリフト検出器を開始します。
インクリメンタル線形モデルと概念ドリフト検出器を使用して、インクリメンタル ドリフト認識モデルをインスタンス化します。学習期間を 6000 個の観測値として指定します。
baseMdl = incrementalRegressionLinear(Learner="leastsquares",Solver="sgd",EstimationPeriod=1000,Standardize=false); dd = incrementalConceptDriftDetector("hddma",Alternative="greater",InputType="continuous",WarmupPeriod=1000); idal = incrementalDriftAwareLearner(baseMdl,DriftDetector=dd,TrainingPeriod=6000);
データ ストリームの作成用に各チャンクの変数の数と反復回数を事前に割り当てます。
numObsPerChunk = 10; numIterations = 4000;
ドリフト ステータスとドリフト時間を追跡する変数、および回帰誤差を格納する変数を事前に割り当てます。
dstatus = zeros(numIterations,1); statusname = strings(numIterations,1); driftTimes = []; ce = array2table(zeros(numIterations,2),VariableNames=["Cumulative" "Window"]);
それぞれ 10 個の観測値の入力チャンクを使用してデータ ストリームをシミュレートし、インクリメンタル ドリフト認識学習を実行します。各反復で次を行います。
予測子データとラベルをシミュレートし、補助関数
hgenerate
を使用してドリフト発生器を更新します。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 regression error statusname(j) = string(idal.DriftStatus); ce{j,:} = idal.Metrics{"MeanSquaredError",:}; 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]) ylabel("Mean Squared Error") xlabel("Iteration") xline((idal.MetricsWarmupPeriod+idal.BaseLearner.EstimationPeriod)/numObsPerChunk,"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")
ドリフト ステータスと反復回数の関係をプロットします。
gscatter(1:numIterations,dstatus,statusname,'gmr','o',5,'on',"Iteration","Drift Status","filled")
アルゴリズム
インクリメンタル ドリフト認識学習
"インクリメンタル学習" ("オンライン学習") は、予測子変数の分布、予測関数や目的関数の要素 (調整パラメーターの値を含む)、観測値のラベル付けなどがほとんど未知、またはまったく未知の可能性のある、データ ストリームからの入力データの処理に着目した、機械学習の一分野です。インクリメンタル学習が従来の機械学習と異なっているのは、モデルへの当てはめ、ハイパーパラメーター調整のための交差検証の実行、および予測子の分布の推測を行うために、十分にラベル付けされたデータを使用できるということです。詳細については、インクリメンタル学習の概要を参照してください。
Statistics and Machine Learning Toolbox で提供される他のインクリメンタル学習機能と異なり、incrementalDriftAwareLearner
モデル オブジェクトはインクリメンタル学習と概念ドリフト検出の組み合わせで構成されます。
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 コマンド
次の 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)