このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
fit
インクリメンタル学習用の線形モデルの学習
説明
関数 fit
は、線形回帰 (incrementalRegressionLinear
オブジェクト) または線形バイナリ分類 (incrementalClassificationLinear
オブジェクト) について、構成されたインクリメンタル学習モデルをストリーミング データに当てはめます。到達したデータを使用して追加的にパフォーマンス メトリクスを追跡するには、代わりに updateMetricsAndFit
を使用します。
回帰モデルまたは分類モデルを一度にデータのバッチ全体に当てはめるか交差検証するには、回帰または分類の他の機械学習モデルを参照してください。
例
バイナリ分類用の既定のインクリメンタル線形 SVM モデルを作成します。推定期間を 5000 個の観測値に指定し、SGD ソルバーを指定します。
Mdl = incrementalClassificationLinear('EstimationPeriod',5000,'Solver','sgd')
Mdl = incrementalClassificationLinear IsWarm: 0 Metrics: [1×2 table] ClassNames: [1×0 double] ScoreTransform: 'none' Beta: [0×1 double] Bias: 0 Learner: 'svm' Properties, Methods
Mdl
は incrementalClassificationLinear
モデルです。そのプロパティはすべて読み取り専用です。
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); beta1 = zeros(nchunk,1); 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)); beta1(j) = Mdl.Beta(1); numtrainobs(j) = Mdl.NumTrainingObservations; priormoved(j) = Mdl.Prior(Mdl.ClassNames == true); end
Mdl
は、ストリーム内のすべてのデータで学習させた incrementalClassificationLinear
モデル オブジェクトです。
パラメーターがインクリメンタル学習中にどのように進化するかを確認するには、それらを別々のタイルにプロットします。
tiledlayout(2,2) nexttile plot(beta1) ylabel('\beta_1') xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.') xlabel('Iteration') axis tight nexttile plot(numtrainobs) ylabel('Number of Training Observations') xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.') xlabel('Iteration') axis tight nexttile plot(priormoved) ylabel('\pi(Subject Is Moving)') xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.') xlabel('Iteration') axis tight
プロットは、推定期間が経過するまでは、fit
がモデルをデータに当てはめることも、パラメーターを更新することもないということを示します。
fitclinear
を使用してバイナリ分類用の線形モデルに学習させ、それをインクリメンタル学習器に変換し、その性能を追跡し、ストリーミング データに当てはめます。観測値を列に配置し、観測値の重みを指定します。
データの読み込みと前処理
人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。予測子データの観測値を列に配置します。
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 = fitclinear(X(:,idxtt),Y(idxtt),'ObservationsIn','columns', ... 'Weights',W(idxtt))
TTMdl = ClassificationLinear ResponseName: 'Y' ClassNames: [0 1] ScoreTransform: 'none' Beta: [60×1 double] Bias: -0.1107 Lambda: 8.2967e-05 Learner: 'svm' Properties, Methods
TTMdl
は、バイナリ分類用の従来式の学習済み線形モデルを表す ClassificationLinear
モデル オブジェクトです。
学習済みモデルの変換
従来式の学習済み分類モデルを、インクリメンタル学習用のバイナリ分類線形モデルに変換します。
IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = incrementalClassificationLinear IsWarm: 1 Metrics: [1×2 table] ClassNames: [0 1] ScoreTransform: 'none' Beta: [60×1 double] Bias: -0.1107 Learner: 'svm' Properties, Methods
パフォーマンス メトリクスの追跡とモデルの当てはめの個別の実行
関数 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"]); beta1 = [IncrementalMdl.Beta(1); 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), ... 'ObservationsIn','columns','Weights',Wil(idx)); ce{j,:} = IncrementalMdl.Metrics{"ClassificationError",:}; IncrementalMdl = fit(IncrementalMdl,Xil(:,idx),Yil(idx),'ObservationsIn','columns', ... 'Weights',Wil(idx)); beta1(j + 1) = IncrementalMdl.Beta(1); end
IncrementalMdl
は、ストリーム内のすべてのデータで学習させた incrementalClassificationLinear
モデル オブジェクトです。
あるいは、updateMetricsAndFit
を使用して、新しいデータ チャンクに対するモデルのパフォーマンス メトリクスを更新し、モデルをデータに当てはめることもできます。
パフォーマンス メトリクスと推定された係数 のトレース プロットをプロットします。
t = tiledlayout(2,1); nexttile h = plot(ce.Variables); xlim([0 nchunk]) ylabel('Classification Error') legend(h,ce.Properties.VariableNames) nexttile plot(beta1) ylabel('\beta_1') xlim([0 nchunk]) 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,:);
table から応答変数 SALEPRICE
を抽出します。数値安定性を得るために、SALEPRICE
を 1e6
の尺度でスケールします。
Y = NYCHousing2015.SALEPRICE/1e6; NYCHousing2015.SALEPRICE = [];
カテゴリカル予測子からダミー変数メトリクスを作成します。
catvars = ["BOROUGH" "BUILDINGCLASSCATEGORY" "NEIGHBORHOOD"]; dumvarstbl = varfun(@(x)dummyvar(categorical(x)),NYCHousing2015, ... 'InputVariables',catvars); dumvarmat = table2array(dumvarstbl); NYCHousing2015(:,catvars) = [];
table 内の他のすべての数値変数を売価の線形予測子として扱います。ダミー変数の行列を予測子データの残りに連結します。
idxnum = varfun(@isnumeric,NYCHousing2015,'OutputFormat','uniform'); X = [dumvarmat NYCHousing2015{:,idxnum}];
推定期間またはメトリクスのウォームアップ期間がないように、インクリメンタル学習用の線形回帰モデルを構成します。メトリクス ウィンドウ サイズを 1000 に指定します。構成したモデルを最初の 100 個の観測値に当てはめます。
Mdl = incrementalRegressionLinear('EstimationPeriod',0, ... 'MetricsWarmupPeriod',0,'MetricsWindowSize',1000); numObsPerChunk = 100; Mdl = fit(Mdl,X(1:numObsPerChunk,:),Y(1:numObsPerChunk));
Mdl
は incrementalRegressionLinear
モデル オブジェクトです。
条件付きの当てはめを行い、インクリメンタル学習を実行します。各反復でこの手順に従います。
100 個の観測値のチャンクを一度に処理することで、データ ストリームをシミュレートします。
サイズが 200 の観測ウィンドウ内で、イプシロン不感応損失を計算することにより、モデル パフォーマンスを更新します。
それまでの最小損失の倍を超える損失が発生した場合にのみ、モデルをデータ チャンクに当てはめます。
パフォーマンスと当てはめを追跡するときは、前のインクリメンタル モデルを上書きします。
イプシロン不感応損失と を保存して、損失と係数が学習中にどのように進化するかを確認します。
fit
がモデルに学習させるタイミングを追跡します。
% Preallocation n = numel(Y) - numObsPerChunk; nchunk = floor(n/numObsPerChunk); beta313 = zeros(nchunk,1); ei = array2table(nan(nchunk,2),'VariableNames',["Cumulative" "Window"]); trained = false(nchunk,1); % Incremental fitting for j = 2:nchunk ibegin = min(n,numObsPerChunk*(j-1) + 1); iend = min(n,numObsPerChunk*j); 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 beta313(j) = Mdl.Beta(end); end
Mdl
は、ストリーム内のすべてのデータで学習させた incrementalRegressionLinear
モデル オブジェクトです。
モデルのパフォーマンスと が学習中にどのように進化するかを確認するには、それらを別々のタイルにプロットします。
t = tiledlayout(2,1); nexttile plot(beta313) hold on plot(find(trained),beta313(trained),'r.') xlim([0 nchunk]) ylabel('\beta_{313}') xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.') legend('\beta_{313}','Training occurs','Location','southeast') hold off nexttile plot(ei.Variables) xlim([0 nchunk]) ylabel('Epsilon Insensitive Loss') xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.') legend(ei.Properties.VariableNames) xlabel(t,'Iteration')
のトレース プロットは、損失がそれまでの最小損失の倍とならない定数値の期間を示します。
入力引数
ストリーミング データに当てはめるインクリメンタル学習モデル。incrementalClassificationLinear
または incrementalRegressionLinear
というモデル オブジェクトとして指定します。Mdl
は、直接作成することも、サポートされている従来式の学習済み機械学習モデルを関数 incrementalLearner
によって変換して作成することもできます。詳細については、対応するリファレンス ページを参照してください。
モデルが当てはめられる予測子データ チャンク。n 個の観測値と Mdl.NumPredictors
個の予測子変数で構成される浮動小数点行列として指定します。名前と値の引数 ObservationsIn
の値は、変数と観測値の方向を決定します。ObservationsIn
の既定値は "rows"
であり、予測子データの観測値が X
の行に沿うことを示しています。
観測値のラベル Y
の長さと X
の観測値の数は同じでなければなりません。Y(
は j
)X
内の観測値 j (行または列) のラベルです。
メモ
Mdl.NumPredictors
= 0 の場合、fit
はX
から予測子の数を推測し、出力モデルの対応するプロパティを設定します。それ以外の場合、ストリーミング データ内の予測子変数の数がMdl.NumPredictors
から変化すると、fit
がエラーを生成します。fit
は、浮動小数点の入力予測子データのみをサポートしています。入力データに categorical データが含まれている場合は、エンコード バージョンの categorical データを準備する必要があります。dummyvar
を使用して、各カテゴリカル変数をダミー変数で構成される数値行列に変換します。その後、すべてのダミー変数行列とその他の数値予測子を連結します。詳細については、ダミー変数を参照してください。
データ型: single
| double
モデルを当てはめる応答 (ラベル) のチャンク。分類問題については、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.BatchSize
) は異なる値とすることができ、n はミニバッチ サイズの倍数でなくてもかまいません。n <Mdl.BatchSize
の場合、fit
は SGD の適用時に n 個の利用可能な観測値を使用します。n >Mdl.BatchSize
の場合、この関数は指定されたサイズのミニバッチでモデルを複数回更新し、残りの観測値を最後のミニバッチに使用します。最後のミニバッチに使用する観測値の数は、Mdl.BatchSize
より小さくてもかまいません。
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで、Name
は引数名で、Value
は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name
を引用符で囲みます。
例: 'ObservationsIn','columns','Weights',W
は、予測子行列の列が観測値に対応すること、およびインクリメンタル学習中に適用する観測値の重みがベクトル W
に格納されていることを指定します。
予測子データにおける観測値の次元。'ObservationsIn'
と 'columns'
または 'rows'
から構成されるコンマ区切りのペアとして指定します。
データ型: char
| string
出力引数
更新されたインクリメンタル学習モデル。incrementalClassificationLinear
または incrementalRegressionLinear
の入力モデル Mdl
と同じデータ型のインクリメンタル学習モデル オブジェクトとして返されます。
Mdl.EstimationPeriod
> 0 の場合、インクリメンタル近似関数 updateMetricsAndFit
および fit
は、どちらかの関数に渡された最初の Mdl.EstimationPeriod
観測値を使用してハイパーパラメーターを推定します。これらの関数がそのデータへの入力モデルの学習を行うことはありません。ただし、n 個の観測値の入力チャンクが推定期間 m で残された観測値の数以上である場合、fit
は最初の n – m 個の観測値を使用してハイパーパラメーターを推定し、残りの m 個の観測値に入力モデルを当てはめます。したがって、ソフトウェアは、Beta
プロパティ、Bias
プロパティ、ハイパーパラメーター プロパティ、および NumTrainingObservations
などの記録保存プロパティを更新します。
分類問題の場合、入力モデル Mdl
の ClassNames
プロパティが空の配列であれば、fit
は出力モデル Mdl
の ClassNames
プロパティを unique(Y)
に設定します。
ヒント
従来式の学習とは異なり、インクリメンタル学習には個別のテスト (ホールドアウト) セットが存在しない場合もあります。そのため、データの各入力チャンクをテスト セットとして扱うには、インクリメンタル モデルと各入力チャンクを、同じデータでモデルに学習させる前に
updateMetrics
に渡します。
アルゴリズム
分類問題では、クラスの事前確率分布が既知の場合 (つまり、事前分布が経験分布でない場合)、fit
は、観測値の重みを正規化して、それぞれのクラスの事前クラス確率の合計になるようにします。このアクションは、観測値の重みが既定でそれぞれのクラスの事前確率であることを前提としています。
回帰問題の場合、またはクラスの事前確率分布が経験分布の場合、ソフトウェアは、fit
が呼び出されるたびに、指定された観測値の重みを正規化して、合計が 1 になるようにします。
拡張機能
使用上の注意および制限:
saveLearnerForCoder
、loadLearnerForCoder
およびcodegen
(MATLAB Coder) を使用して、関数fit
のコードを生成します。saveLearnerForCoder
を使用して、学習済みモデルを保存します。loadLearnerForCoder
を使用して保存済みモデルを読み込んで関数fit
を呼び出す、エントリポイント関数を定義します。次に、codegen
を使用して、エントリポイント関数のコードを生成します。fit
の単精度の C/C++ コードを生成するには、loadLearnerForCoder
関数を呼び出すときにDataType="single"
を指定します。次の表は、
fit
の引数に関する注意です。この表に含まれていない引数は、完全にサポートされています。引数 注意と制限 Mdl
モデル オブジェクトの使用上の注意および制限については、
incrementalClassificationLinear
またはincrementalRegressionLinear
を参照してください。X
バッチ間の観測値の数は可変サイズにすることができますが、対応する
Y
の観測値の数と等しくなければなりません。予測子変数の数は
Mdl.NumPredictors
と等しくなければなりません。X
はsingle
またはdouble
でなければなりません。
Y
バッチ間の観測値の数は可変サイズにすることができますが、対応する
X
の観測値の数と等しくなければなりません。分類問題では、
Y
のすべてのラベルをMdl.ClassNames
で表さなければなりません。Y
とMdl.ClassNames
は同じデータ型でなければなりません。
次の制限が適用されます。
データをシャッフルするように
Mdl
を構成した場合 (Mdl.Shuffle
がtrue
であるか、Mdl.Solver
が'sgd'
または'asgd'
)、関数fit
は、モデルをバッチに当てはめる前に観測値の各入力バッチを無作為にシャッフルします。シャッフルされた観測値の順序は、MATLAB® で生成される順序と一致しないことがあります。したがって、MATLAB と生成コードで計算される近似係数が等しくならない場合があります。浮動小数点の入力引数およびオブジェクト プロパティには、すべて同質なデータ型を使用します。具体的には、
single
またはdouble
のいずれかです。
詳細は、コード生成の紹介を参照してください。
バージョン履歴
R2020b で導入
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)