このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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)