fit
説明
例
人の行動のデータセットを読み込みます。データをランダムにシャッフルします。
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 モデルを作成します。推定期間を 5000 個の観測値に指定し、SGD ソルバーを指定します。
インクリメンタル線形 SVM モデルをベース学習器として使用して、既定のインクリメンタル ドリフト認識モデルを開始します。学習期間を観測値 5000 個に指定します。
baseMdl = incrementalClassificationLinear(EstimationPeriod=5000,Solver="sgd");
idaMdl = incrementalDriftAwareLearner(baseMdl,TrainingPeriod=5000);idaMdl は incrementalDriftAwareLearner モデルです。そのプロパティはすべて読み取り専用です。既定では、incrementalDriftAwareLearner は移動平均に基づく Hoeffding 境界のドリフト検出法 ("hddma") を使用します。
idaMdl は、他の演算の実行に使用する前に、データに当てはめなければなりません。
関数 fit を使用してインクリメンタル ドリフト認識モデルを学習データに当てはめます。50 個の観測値で構成されるチャンクを一度に当てはめます。各反復で次を行います。
50 個の観測値を処理して、データ ストリームをシミュレート。
前のインクリメンタル モデルを、入力観測値に当てはめた新しいモデルで上書きします。
学習観測値の数、および被験者が移動した (Y = true) かどうかの事前確率を保存して、インクリメンタル学習中にそれらがどのように進化するかを確認。
% Preallocation numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); beta1 = zeros(nchunk,1); numtrainobs = zeros(nchunk,1); dstatus = zeros(nchunk,1); statusname = strings(nchunk,1); driftTimes = []; ce = array2table(zeros(nchunk,2),VariableNames=["Cumulative" "Window"]); % Incremental fitting for j = 1:nchunk ibegin = min(n,numObsPerChunk*(j-1) + 1); iend = min(n,numObsPerChunk*j); idx = ibegin:iend; idaMdl = fit(idaMdl,X(idx,:),Y(idx)); idaMdl = updateMetrics(idaMdl,X(idx,:),Y(idx)); beta1(j) = idaMdl.BaseLearner.Beta(1); % Record drift status and classification error statusname(j) = string(idaMdl.DriftStatus); ce{j,:} = idaMdl.Metrics{"ClassificationError",:}; numtrainobs(j) = idaMdl.NumTrainingObservations; if idaMdl.DriftDetected dstatus(j) = 2; driftTimes(end+1) = j; elseif idaMdl.WarningDetected dstatus(j) = 1; else dstatus(j) = 0; end end
idaMdl は、ストリーム内のすべてのデータで学習させた incrementalDriftAwareLearner モデル オブジェクトです。
パラメーターがインクリメンタル学習中にどのように進化するかを確認するには、それらを別々のタイルにプロットします。
tiledlayout(2,1) set(groot,DefaultConstantLineLineWidth=1.5); nexttile plot(beta1) ylabel("\beta_1") xline(idaMdl.BaseLearner.EstimationPeriod/numObsPerChunk,"r-.","EstimationPeriod") xline(idaMdl.BaseLearner.EstimationPeriod/numObsPerChunk + driftTimes,"r-.") xlabel('Iteration') xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.TrainingPeriod)/numObsPerChunk, ... "b-.",{"Estimation +","Training Period"},LabelVerticalAlignment="middle") xline(floor(numel(Y)/2)/numObsPerChunk,"m--","Drift", ... LabelVerticalAlignment="middle") nexttile plot(numtrainobs) ylabel("Number of Training Observations") xline(idaMdl.BaseLearner.EstimationPeriod/numObsPerChunk,"r-.","EstimationPeriod") xline(idaMdl.BaseLearner.EstimationPeriod/numObsPerChunk + driftTimes,"r-.") xlabel("Iteration") xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.TrainingPeriod)/numObsPerChunk, ... "b-.",{"Estimation +","Training Period"},LabelVerticalAlignment="middle") xline(floor(numel(Y)/2)/numObsPerChunk,"m--","Drift", ... LabelVerticalAlignment="middle")

プロットは、推定期間が経過するまでは、fit がモデルをデータに当てはめることも、パラメーターを更新することもないということを示します。ドリフトが検出された後、関数は別の Mdl.BaseLearner.EstimationPeriod 個の観測値を待ってから新しいモデルをデータに当てはめます。
累積とウィンドウごとの分類誤差をプロットします。ウォームアップ期間と学習期間、およびドリフトが発生した時点をマークします。
figure() h = plot(ce.Variables); xlim([0 nchunk]) ylabel("Classification Error") xlabel("Iteration") xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.MetricsWarmupPeriod)/numObsPerChunk, ... "g-.","Estimation + Warmup Period") xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.MetricsWarmupPeriod)/numObsPerChunk+ ... driftTimes,"g-.","Estimation + Warmup Period") xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.TrainingPeriod)/numObsPerChunk, ... "b-.","Estimation + Training Period",LabelVerticalAlignment="middle") xline(driftTimes,"m--","Drift",LabelVerticalAlignment="middle") legend(h,ce.Properties.VariableNames) legend(h,Location="north")

ドリフト ステータスと反復回数の関係をプロットします。
gscatter(1:nchunk,dstatus,statusname,"gbr","o",5,"on","Iteration","Drift Status","filled")

データの後半部分のラベルを予測し、ドリフト後の更新されたモデルの精度をチェックします。
n = floor(numel(Y)/2); yhat = predict(idaMdl,X(n:end,:)); accuracy = sum(Y(n:end)==yhat)/n
accuracy = 0.9960
robotarm データ セットを読み込みます。標本サイズ n と予測子変数の数 p を取得します。
load robotarm
n = numel(ytrain);
p = size(Xtrain,2);データ セットの詳細については、コマンド ラインで Description を入力してください。
観測値 2500 と 5000 の間の応答変数に人為的なドリフトを導入します。
Y=ytrain; j=1.25; for i=2500:1250:5000 idx=min(i+1250,5000); Y(i:idx)=ytrain(i:idx)*j; j=j+0.25; end
回帰用のインクリメンタル ドリフト認識モデルを次のように開始します。
回帰用のインクリメンタル線形 SVM モデルを作成します。推定期間を 500 個の観測値に指定し、SGD ソルバーを指定します。
連続データ用のインクリメンタルなドリフト検出器を作成します。
インクリメンタル線形 SVM モデルをベース学習器として使用し、作成したドリフト検出器を使用して、インクリメンタル ドリフト認識モデルを開始します。学習期間は 2000 と指定します。
baseMdl = incrementalRegressionLinear(EstimationPeriod=500,Solver="sgd",MetricsWarmUpPeriod=750); ddetector = incrementalConceptDriftDetector("hddma",InputType="continuous",Alternative="greater"); idaMdl = incrementalDriftAwareLearner(baseMdl,DriftDetector=ddetector,TrainingPeriod=2000);
idaMdl は incrementalDriftAwareLearner モデルです。そのプロパティはすべて読み取り専用です。
データ ストリームの作成用に各チャンクの変数の数と反復回数を事前に割り当てます。
numObsPerChunk = 10; nchunk = floor(n/numObsPerChunk);
ドリフト ステータスとドリフト時間を追跡する変数、および回帰誤差と学習観測値の数を格納する変数を事前に割り当てます。
dstatus = zeros(nchunk,1); statusname = strings(nchunk,1); driftTimes = []; ei = array2table(nan(nchunk,2),VariableNames=["Cumulative","Window"]); numtrainobs = zeros(nchunk,1);
関数 updateMetrics および fit を使用して、残りのデータに対してインクリメンタル学習を実行します。各反復で次を行います。
10 個の観測値を一度に処理して、データ ストリームをシミュレート。
updateMetricsを呼び出し、観測値の入力チャンクを所与として、モデルの分類誤差の累積とウィンドウを更新します。前のインクリメンタル モデルを上書きして、Metricsプロパティ内の損失を更新します。新しいデータのチャンクには関数でモデルが当てはめられないことに注意してください。観測値の方向を指定します。fitを呼び出して、観測値の入力チャンクにモデルを当てはめます。前のインクリメンタル モデルを上書きして、モデル パラメーターを更新します。観測値の方向を指定します。回帰誤差と学習観測値の数を保存します。
rng(123) % For reproducibility for j = 1:nchunk ibegin = min(n,numObsPerChunk*(j-1) + 1); iend = min(n,numObsPerChunk*j); idx = ibegin:iend; idaMdl = updateMetrics(idaMdl,Xtrain(idx,:),Y(idx),ObservationsIn="rows"); ei{j,:} = idaMdl.Metrics{"EpsilonInsensitiveLoss",:}; idaMdl = fit(idaMdl,Xtrain(idx,:),Y(idx),ObservationsIn="rows"); numtrainobs(j) = idaMdl.NumTrainingObservations; statusname(j) = string(idaMdl.DriftStatus); if idaMdl.DriftDetected dstatus(j) = 2; driftTimes(end+1) = j; elseif idaMdl.WarningDetected dstatus(j) = 1; else dstatus(j) = 0; end end
idaMdl は、ストリーム内のすべてのデータで学習させた incrementalDriftAwareModel オブジェクトです。
学習観測値の数とパフォーマンス メトリクスのトレース プロットをプロットします。推定期間、ウォームアップ メトリクス期間、および学習期間の時点をマークします。
t = tiledlayout(2,1); nexttile plot(numtrainobs) xline(idaMdl.BaseLearner.EstimationPeriod/numObsPerChunk,"g-.","Estimation Period") xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.MetricsWarmupPeriod)/numObsPerChunk,"m-.","Warmup Period") xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.TrainingPeriod)/numObsPerChunk,"b--","Training Period") xline(idaMdl.BaseLearner.EstimationPeriod/numObsPerChunk+driftTimes,"g-.") xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.MetricsWarmupPeriod)/numObsPerChunk+driftTimes,"m-.") xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.TrainingPeriod)/numObsPerChunk+driftTimes,"b--") xline(driftTimes,"r","Drift",LabelVerticalAlignment="middle",LineWidth=1.5) xlim([0 nchunk]) ylabel("Number of Training Observations") nexttile plot(ei.Variables) xline(idaMdl.BaseLearner.EstimationPeriod/numObsPerChunk,"g-.","Estimation Period") xline((idaMdl.MetricsWarmupPeriod+idaMdl.BaseLearner.EstimationPeriod)/numObsPerChunk,"m-.","Warmup Period") xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.TrainingPeriod)/numObsPerChunk,"b--","Training Period") xline(idaMdl.BaseLearner.EstimationPeriod/numObsPerChunk+driftTimes,"g-.") xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.MetricsWarmupPeriod)/numObsPerChunk+driftTimes,"m-.") xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.TrainingPeriod)/numObsPerChunk+driftTimes,"b--") xline(driftTimes,"r","Drift",LabelVerticalAlignment="middle",LineWidth=1.5) xlim([0 nchunk]) legend(ei.Properties.VariableNames,Location="northeast") ylabel("Regression Error") xlabel(t,"Iteration")

ドリフト ステータスと反復回数の関係をプロットします。
figure() gscatter(1:nchunk,dstatus,statusname,'gmr','*',5,'on',"Iteration","Drift Status")

入力引数
ストリーミング データに当てはめるインクリメンタル ドリフト認識学習モデル。incrementalDriftAwareLearner モデル オブジェクトとして指定します。Mdl は関数 incrementalDriftAwareLearner を使用して作成できます。詳細については、オブジェクトのリファレンス ページを参照してください。
モデルが当てはめられる予測子データ チャンク。n 個の観測値と Mdl.BaseLearner.NumPredictors 個の予測子変数で構成される浮動小数点行列として指定します。
Mdl.BaseLearner が名前と値の引数 ObservationsIn を受け入れる場合、ObservationsIn の値で変数と観測値の方向が決まります。ObservationsIn の既定値は "rows" であり、予測子データの観測値が X の行に沿うことを示しています。
観測値の応答 (またはラベル) Y の長さと X の観測値の数は同じでなければなりません。Y( は j)X 内の観測値 j (行または列) の応答 (またはラベル) です。
メモ
Mdl.BaseLearner.NumPredictors= 0 の場合、fitはXから予測子の数を推測し、出力モデルの対応するプロパティを設定します。それ以外の場合、ストリーミング データ内の予測子変数の数がMdl.BaseLearner.NumPredictorsから変化すると、fitがエラーを生成します。fitは、浮動小数点の入力予測子データのみをサポートしています。入力データに 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のメンバーではないラベルを含む場合、fitはエラーを生成します。YとMdl.BaseLearner.ClassNamesのデータ型は同じでなければなりません。
Mdl.BaseLearner.ClassNamesが空の場合は、fitがデータからMdl.BaseLearner.ClassNamesを推定します。
データ型: single | double | categorical | char | string | logical | cell
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
例: ObservationsIn="columns",Weights=W は、予測子行列の列が観測値に対応すること、およびインクリメンタル学習中に適用する観測値の重みがベクトル W に格納されていることを指定します。
予測子データにおける観測値の次元。"columns" または "rows" として指定します。
fit は、Mdl.BaseLearner が名前と値の引数 ObservationsIn をサポートする場合にのみ ObservationsIn をサポートします。
例: ObservationsIn="columns"
データ型: char | string
観測値の重みのチャンク。正の値の浮動小数点ベクトルとして指定します。fit は、Weights 内の対応する値を使用して X 内の観測値に重みを付けます。Weights のサイズは X 内の観測値の数 n と同じでなければなりません。
既定では Weights は ones( です。n,1)
例: Weights=w
データ型: double | single
出力引数
更新されたインクリメンタル ドリフト認識学習モデル。入力モデル Mdl と同じデータ型のインクリメンタル ドリフト認識学習モデル オブジェクト incrementalDriftAwareLearner として返されます。
Mdl.BaseLearner.EstimationPeriod > 0 の場合、インクリメンタル近似関数 updateMetricsAndFit および fit は、どちらかの関数に渡された最初の Mdl.BaseLearner.EstimationPeriod 観測値を使用してハイパーパラメーターを推定します。これらの関数がそのデータへの入力モデルの学習を行うことはありません。ただし、n 個の観測値の入力チャンクが推定期間 m で残された観測値の数以上である場合、fit は最初の n – m 個の観測値を使用してハイパーパラメーターを推定し、残りの m 個の観測値に入力モデルを当てはめます。
分類問題の場合、入力モデル Mdl.BaseLearner の ClassNames プロパティが空の配列であれば、fit は出力モデル Mdl.BaseLearner の ClassNames プロパティを unique(Y) に設定します。
アルゴリズム
"インクリメンタル学習" ("オンライン学習") は、予測子変数の分布、予測関数や目的関数の素性 (調整パラメーターの値を含む)、観測値にラベル付けがされているか等についてほぼ知識が無い時に、データ ストリームから入ってくるデータを処理することに関係している機械学習の一分野です。従来の機械学習は、モデルへの当てはめに十分にラベル付けされたデータを使用でき、交差検証を実施してハイパーパラメーターを調整し、予測子の分布を推論するもので、インクリメンタル学習と異なります。詳細については、インクリメンタル学習の概要を参照してください。
Statistics and Machine Learning Toolbox™ で提供される他のインクリメンタル学習機能と異なり、fit モデル オブジェクトはインクリメンタル学習と概念ドリフト検出の組み合わせで構成されます。
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 が経過するまで待機してからパフォーマンス メトリクスの計算を開始します。
分類問題では、クラスの事前確率分布が既知の場合 (つまり、事前分布が経験分布でない場合)、fit は、観測値の重みを正規化して、それぞれのクラスの事前クラス確率の合計になるようにします。このアクションは、観測値の重みが既定でそれぞれのクラスの事前確率であることを前提としています。
回帰問題の場合、またはクラスの事前確率分布が経験分布の場合、ソフトウェアは、fit が呼び出されるたびに、指定された観測値の重みを正規化して、合計が 1 になるようにします。
参照
[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)