fit
説明
関数 fit
は、カーネル回帰 (incrementalRegressionKernel
オブジェクト) またはバイナリ カーネル分類 (incrementalClassificationKernel
オブジェクト) について、構成されたインクリメンタル学習モデルをストリーミング データに当てはめます。到達したデータを使用して追加的にパフォーマンス メトリクスを追跡するには、代わりに updateMetricsAndFit
を使用します。
カーネル回帰モデルまたはカーネル分類モデルを一度にデータのバッチ全体に当てはめるか交差検証するには、fitrkernel
または fitckernel
をそれぞれ参照してください。
例
モデルのインクリメンタル学習
関数 incrementalClassificationKernel
を呼び出すときに incrementalClassificationKernel
モデル オブジェクトのインクリメンタル学習オプションを構成します。入力観測値にモデルを当てはめます。
バイナリ分類用のインクリメンタル カーネル モデルを作成します。推定期間を 5000 個の観測値に指定し、確率的勾配降下 (SGD) ソルバーを指定します。
Mdl = incrementalClassificationKernel(EstimationPeriod=5000,Solver="sgd")
Mdl = incrementalClassificationKernel IsWarm: 0 Metrics: [1x2 table] ClassNames: [1x0 double] ScoreTransform: 'none' NumExpansionDimensions: 0 KernelScale: 1
Mdl
は incrementalClassificationKernel
モデルです。そのプロパティはすべて読み取り専用です。
Mdl
は、他の演算の実行に使用する前に、データに当てはめなければなりません。
人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。
load humanactivity n = numel(actid); rng(1) % For reproducibility idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
データ セットの詳細については、コマンド ラインで Description
を入力してください。
応答は、次の 5 つのクラスのいずれかになります。座る、立つ、歩く、走る、または踊る。被験者が移動しているかどうか (actid
> 2) を基準に、応答を二分します。
Y = Y > 2;
関数 fit
を使用してインクリメンタル モデルを学習データに当てはめます。50 個の観測値で構成されるチャンクを一度に当てはめます。各反復で次を行います。
50 個の観測値を処理して、データ ストリームをシミュレート。
前のインクリメンタル モデルを、入力観測値に当てはめた新しいモデルで上書き。
学習観測値の数、および被験者が移動した (
Y
=true
) かどうかの事前確率を保存して、インクリメンタル学習中にそれらがどのように進化するかを確認。
% Preallocation numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); numtrainobs = zeros(nchunk,1); priormoved = zeros(nchunk,1); % Incremental fitting for j = 1:nchunk ibegin = min(n,numObsPerChunk*(j-1) + 1); iend = min(n,numObsPerChunk*j); idx = ibegin:iend; Mdl = fit(Mdl,X(idx,:),Y(idx)); numtrainobs(j) = Mdl.NumTrainingObservations; priormoved(j) = Mdl.Prior(Mdl.ClassNames == true); end
Mdl
は、ストリーム内のすべてのデータで学習させた incrementalClassificationKernel
モデル オブジェクトです。
パラメーターがインクリメンタル学習中にどのように進化するかを確認するには、それらを別々のタイルにプロットします。
t = tiledlayout(2,1); nexttile plot(numtrainobs) xlim([0 nchunk]) ylabel("Number of Training Observations") xline(Mdl.EstimationPeriod/numObsPerChunk,"-.") nexttile plot(priormoved) xlim([0 nchunk]) ylabel("\pi(Subject Is Moving)") xline(Mdl.EstimationPeriod/numObsPerChunk,"-.") xlabel(t,"Iteration")
プロットは、推定期間が経過するまでは、fit
がモデルをデータに当てはめることも、パラメーターを更新することもないということを示します。
観測値の重みの指定
fitckernel
を使用してバイナリ分類用のカーネル モデルに学習させ、incrementalLearner
を使用してインクリメンタル学習器に変換します。モデルの性能を追跡し、モデルをストリーミング データに当てはめます。fitckernel
およびインクリメンタル学習関数を呼び出すときに観測値の重みを指定します。
データの読み込みと前処理
人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。
load humanactivity rng(1) % For reproducibility n = numel(actid); idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
データ セットの詳細については、コマンド ラインで Description
を入力してください。
応答は、次の 5 つのクラスのいずれかになります。座る、立つ、歩く、走る、または踊る。被験者が移動しているかどうか (actid
> 2) を基準に、応答を二分します。
Y = Y > 2;
被験者が移動していない (Y
= false
) ときの収集データが、被験者が移動していたときのデータの倍の品質であると仮定します。静止している被験者から収集した観測値に 2 を割り当て、移動している被験者から収集した観測値に 1 を割り当てる重み変数を作成します。
W = ones(n,1) + ~Y;
バイナリ分類用のカーネル モデルの学習
バイナリ分類用のカーネル モデルを、データの半分から取った無作為標本に当てはめます。
idxtt = randsample([true false],n,true); TTMdl = fitckernel(X(idxtt,:),Y(idxtt),Weights=W(idxtt))
TTMdl = ClassificationKernel ResponseName: 'Y' ClassNames: [0 1] Learner: 'svm' NumExpansionDimensions: 2048 KernelScale: 1 Lambda: 8.2967e-05 BoxConstraint: 1
TTMdl
は、バイナリ分類用の従来式の学習済みカーネル モデルを表す ClassificationKernel
モデル オブジェクトです。
学習済みモデルの変換
従来式の学習済み分類モデルをインクリメンタル学習用のモデルに変換します。
IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = incrementalClassificationKernel IsWarm: 1 Metrics: [1x2 table] ClassNames: [0 1] ScoreTransform: 'none' NumExpansionDimensions: 2048 KernelScale: 1
IncrementalMdl
は incrementalClassificationKernel
モデルです。そのプロパティはすべて読み取り専用です。
パフォーマンス メトリクスの追跡とモデルの当てはめの個別の実行
関数 updateMetrics
および fit
を使用して、残りのデータに対してインクリメンタル学習を実行します。各反復で次を行います。
50 個の観測値を一度に処理して、データ ストリームをシミュレートします。
updateMetrics
を呼び出し、観測値の入力チャンクを所与として、モデルの分類誤差の累積とウィンドウを更新します。前のインクリメンタル モデルを上書きして、Metrics
プロパティ内の損失を更新します。関数がモデルをデータ チャンクに当てはめないことに注意してください。チャンクはモデルに対して "新しい" データです。観測値の重みを指定します。fit
を呼び出して、観測値の入力チャンクにモデルを当てはめます。前のインクリメンタル モデルを上書きして、モデル パラメーターを更新します。観測値の重みを指定します。分類誤差と学習観測値の数を保存します。
% Preallocation idxil = ~idxtt; nil = sum(idxil); numObsPerChunk = 50; nchunk = floor(nil/numObsPerChunk); ce = array2table(zeros(nchunk,2),VariableNames=["Cumulative","Window"]); numtrainobs = [zeros(nchunk,1)]; Xil = X(idxil,:); Yil = Y(idxil); Wil = W(idxil); % Incremental fitting for j = 1:nchunk ibegin = min(nil,numObsPerChunk*(j-1) + 1); iend = min(nil,numObsPerChunk*j); idx = ibegin:iend; IncrementalMdl = updateMetrics(IncrementalMdl,Xil(idx,:),Yil(idx), ... Weights=Wil(idx)); ce{j,:} = IncrementalMdl.Metrics{"ClassificationError",:}; IncrementalMdl = fit(IncrementalMdl,Xil(idx,:),Yil(idx), ... Weights=Wil(idx)); numtrainobs(j) = IncrementalMdl.NumTrainingObservations; end
IncrementalMdl
は、ストリーム内のすべてのデータで学習させた incrementalClassificationKernel
モデル オブジェクトです。
あるいは、updateMetricsAndFit
を使用して、新しいデータ チャンクに対するモデルのパフォーマンス メトリクスを更新し、モデルをデータに当てはめることもできます。
学習観測値の数とパフォーマンス メトリクスのトレース プロットをプロットします。
t = tiledlayout(2,1); nexttile plot(numtrainobs) xlim([0 nchunk]) ylabel("Number of Training Observations") nexttile plot(ce.Variables) xlim([0 nchunk]) legend(ce.Properties.VariableNames) ylabel("Classification Error") xlabel(t,"Iteration")
プロットは、関数 fit
がインクリメンタル学習のすべての反復でモデルを当てはめることを示しています。累積の損失は安定しており徐々に減少しますが、ウィンドウの損失には急な変動があります。
条件付き学習の実行
カーネル回帰モデルのパフォーマンスが低下した場合にのみ、そのモデルに対してインクリメンタル学習を行います。
2015 年のニューヨーク市住宅データ セットを読み込み、シャッフルします。このデータの詳細については、NYC Open Data を参照してください。
load NYCHousing2015 rng(1) % For reproducibility n = size(NYCHousing2015,1); shuffidx = randsample(n,n); NYCHousing2015 = NYCHousing2015(shuffidx,:);
テーブルから応答変数 SALEPRICE
を抽出します。数値安定性を得るために、SALEPRICE
を 1e6
の尺度でスケールします。
Y = NYCHousing2015.SALEPRICE/1e6; NYCHousing2015.SALEPRICE = [];
この例の計算コストを削減するために、254 個のカテゴリをもつカテゴリカル変数が含まれている NEIGHBORHOOD
列を削除します。
NYCHousing2015.NEIGHBORHOOD = [];
他のカテゴリカル予測子からダミー変数メトリクスを作成します。
catvars = ["BOROUGH","BUILDINGCLASSCATEGORY"]; dumvarstbl = varfun(@(x)dummyvar(categorical(x)),NYCHousing2015, ... InputVariables=catvars); dumvarmat = table2array(dumvarstbl); NYCHousing2015(:,catvars) = [];
テーブル内の他のすべての数値変数を売価の予測子として扱います。ダミー変数の行列を予測子データの残りに連結します。
idxnum = varfun(@isnumeric,NYCHousing2015,OutputFormat="uniform");
X = [dumvarmat NYCHousing2015{:,idxnum}];
推定期間またはメトリクスのウォームアップ期間がないように、インクリメンタル学習用のカーネル回帰モデルを構成します。メトリクス ウィンドウ サイズを 1000 に指定します。モデルを最初の 100 個の観測値に当てはめて updateMetrics
用に準備します。
Mdl = incrementalRegressionKernel(EstimationPeriod=0, ...
MetricsWarmupPeriod=0,MetricsWindowSize=1000);
initobs = 100;
Mdl = fit(Mdl,X(1:initobs,:),Y(1:initobs));
Mdl
は incrementalRegressionKernel
モデル オブジェクトです。
条件付きの当てはめを行い、インクリメンタル学習を実行します。各反復でこの手順に従います。
100 個の観測値のチャンクを一度に処理することで、データ ストリームをシミュレートします。
サイズが 200 の観測ウィンドウ内で、イプシロン不感応損失を計算することにより、モデル パフォーマンスを更新します。
それまでの最小損失の倍を超える損失が発生した場合にのみ、モデルをデータ チャンクに当てはめます。
パフォーマンスと当てはめを追跡するときは、前のインクリメンタル モデルを上書きします。
イプシロン不感応損失と学習観測値の数を保存して、それらが学習中にどのように進化するかを確認します。
fit
がモデルに学習させるタイミングを追跡します。
% Preallocation numObsPerChunk = 100; nchunk = floor((n - initobs)/numObsPerChunk); ei = array2table(nan(nchunk,2),VariableNames=["Cumulative","Window"]); numtrainobs = zeros(nchunk,1); trained = false(nchunk,1); % Incremental fitting for j = 1:nchunk ibegin = min(n,numObsPerChunk*(j-1) + 1 + initobs); iend = min(n,numObsPerChunk*j + initobs); idx = ibegin:iend; Mdl = updateMetrics(Mdl,X(idx,:),Y(idx)); ei{j,:} = Mdl.Metrics{"EpsilonInsensitiveLoss",:}; minei = min(ei{:,2}); pdiffloss = (ei{j,2} - minei)/minei*100; if pdiffloss > 100 Mdl = fit(Mdl,X(idx,:),Y(idx)); trained(j) = true; end numtrainobs(j) = Mdl.NumTrainingObservations; end
Mdl
は、ストリーム内のすべてのデータで学習させた incrementalRegressionKernel
モデル オブジェクトです。
学習観測値の数とモデルのパフォーマンスが学習中にどのように進化するかを確認するには、それらを別々のタイルにプロットします。
t = tiledlayout(2,1); nexttile plot(numtrainobs) hold on plot(find(trained),numtrainobs(trained),"r.") xlim([0 nchunk]) ylabel("Number of Training Observations") legend("Number of Training Observations","Training occurs",Location="best") hold off nexttile plot(ei.Variables) xlim([0 nchunk]) ylabel("Epsilon Insensitive Loss") legend(ei.Properties.VariableNames) xlabel(t,"Iteration")
学習観測値の数のトレース プロットは、損失がそれまでの最小損失の倍とならない定数値の期間を示します。
入力引数
Mdl
— インクリメンタル学習モデル
incrementalClassificationKernel
モデル オブジェクト | incrementalRegressionKernel
モデル オブジェクト
ストリーミング データに当てはめるインクリメンタル学習モデル。incrementalClassificationKernel
または incrementalRegressionKernel
というモデル オブジェクトとして指定します。Mdl
は、直接作成することも、サポートされている従来式の学習済み機械学習モデルを関数 incrementalLearner
によって変換して作成することもできます。詳細については、対応するリファレンス ページを参照してください。
X
— 予測子データのチャンク
浮動小数点行列
予測子データのチャンク。n 個の観測値と Mdl.NumPredictors
個の予測子変数で構成される浮動小数点行列として指定します。
観測値のラベル Y
の長さと X
の観測値の数は同じでなければなりません。Y(
は j
)X
内の観測値 j (行) のラベルです。
メモ
Mdl.NumPredictors
= 0 の場合、fit
はX
から予測子の数を推測し、出力モデルの対応するプロパティを設定します。それ以外の場合、ストリーミング データ内の予測子変数の数がMdl.NumPredictors
から変化すると、fit
がエラーを生成します。fit
は、浮動小数点の入力予測子データのみをサポートしています。入力データに categorical データが含まれている場合は、エンコード バージョンの categorical データを準備する必要があります。dummyvar
を使用して、各カテゴリカル変数をダミー変数で構成される数値行列に変換します。その後、すべてのダミー変数行列とその他の数値予測子を連結します。詳細については、ダミー変数を参照してください。
データ型: single
| double
Y
— 応答 (ラベル) のチャンク
categorical 配列 | 文字配列 | string 配列 | logical ベクトル | 浮動小数点ベクトル | 文字ベクトルの cell 配列
応答 (ラベル) のチャンク。分類問題については、categorical 配列、文字配列、string 配列、logical ベクトル、浮動小数点ベクトルのいずれか、あるいは文字ベクトルの cell 配列として指定します。回帰問題については、浮動小数点ベクトルとして指定します。
観測値のラベル Y
の長さと X
の観測値の数は同じでなければなりません。Y(
は j
)X
内の観測値 j (行) のラベルです。
分類問題では次のようになります。
fit
はバイナリ分類のみをサポートします。入力モデル
Mdl
のClassNames
プロパティが空以外の場合は、次の条件が適用されます。Y
がMdl.ClassNames
のメンバーではないラベルを含む場合、fit
はエラーを生成します。Y
とMdl.ClassNames
のデータ型は同じでなければなりません。
データ型: char
| string
| cell
| categorical
| logical
| single
| double
メモ
観測値 (予測子またはラベル) または重みが少なくとも 1 つの欠損 (
NaN
) 値を含む場合、fit
はその観測値を無視します。したがって、fit
は n 個よりも少ない観測値を使用して更新したモデルを作成します。ここで n はX
内の観測値数です。チャンク サイズ n と確率的勾配降下 (SGD) ハイパーパラメーター ミニバッチ サイズ (
Mdl.SolverOptions.BatchSize
) は異なる値とすることができ、n はミニバッチ サイズの倍数でなくてもかまいません。fit
は SGD の適用時に各学習サイクルでBatchSize
個の観測値を使用します。最後の学習サイクルに使用する最後のミニバッチに含まれる観測値の数は、Mdl.SolverOptions.BatchSize
以下でもかまいません。
出力引数
Mdl
— 更新されたインクリメンタル学習モデル
incrementalClassificationKernel
モデル オブジェクト | incrementalRegressionKernel
モデル オブジェクト
更新されたインクリメンタル学習モデル。incrementalClassificationKernel
または incrementalRegressionKernel
の入力モデル Mdl
と同じデータ型のインクリメンタル学習モデル オブジェクトとして返されます。
Mdl.EstimationPeriod
> 0 の場合、fit
は、渡された最初の Mdl.EstimationPeriod
個の観測値を使用してハイパーパラメーターを推定します。そのデータを使用して入力モデルの学習を行うことはありません。ただし、n 個の観測値の入力チャンクが推定期間 m で残された観測値の数以上である場合、fit
は最初の n – m 個の観測値を使用してハイパーパラメーターを推定し、残りの m 個の観測値に入力モデルを当てはめます。したがって、ソフトウェアは、モデル パラメーター、ハイパーパラメーター プロパティ、および NumTrainingObservations
などの記録保存プロパティを更新します。
分類問題の場合、入力モデル Mdl
の ClassNames
プロパティが空の配列であれば、fit
は出力モデル Mdl
の ClassNames
プロパティを unique(Y)
に設定します。
ヒント
従来式の学習とは異なり、インクリメンタル学習には個別のテスト (ホールドアウト) セットが存在しない場合もあります。そのため、データの各入力チャンクをテスト セットとして扱うには、インクリメンタル モデルと各入力チャンクを、同じデータでモデルに学習させる前に
updateMetrics
に渡します。
アルゴリズム
観測値の重み
分類問題では、クラスの事前確率分布が既知の場合 (つまり、事前分布が経験的分布でない場合)、fit
は、観測値の重みを正規化して、それぞれのクラスの事前クラス確率の合計になるようにします。このアクションは、観測値の重みが既定でそれぞれのクラスの事前確率であることを前提としています。
回帰問題の場合、またはクラスの事前確率分布が経験的分布の場合、ソフトウェアは、fit
が呼び出されるたびに、指定された観測値の重みを正規化して、合計が 1 になるようにします。
バージョン履歴
R2022a で導入
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)