fit
説明
関数 fit
は、構成されたインクリメンタル学習用の誤り訂正出力符号 (ECOC) 分類モデル (incrementalClassificationECOC
オブジェクト) をストリーミング データに当てはめます。到達したデータを使用して追加的にパフォーマンス メトリクスを追跡するには、代わりに updateMetricsAndFit
を使用します。
ECOC 分類モデルを一度にデータのバッチ全体に当てはめるか交差検証するには、fitcecoc
を参照してください。
例
十分な事前情報なしでのモデルのインクリメンタル学習
データに含まれるクラスの想定される最大数のみがわかっている場合にインクリメンタル ECOC 学習器を当てはめます。
インクリメンタル ECOC モデルを作成します。予測される最大クラス数を 5 と指定します。
Mdl = incrementalClassificationECOC(MaxNumClasses=5)
Mdl = incrementalClassificationECOC IsWarm: 0 Metrics: [1x2 table] ClassNames: [1x0 double] ScoreTransform: 'none' BinaryLearners: {10x1 cell} CodingName: 'onevsone' Decoding: 'lossweighted'
Mdl
は incrementalClassificationECOC
モデルです。そのプロパティはすべて読み取り専用です。Mdl
が処理できる一意のクラスは最大 5 つです。既定では、事前クラス分布 Mdl.Prior
は経験的であり、ラベルが見つかると事前分布が更新されます。
Mdl
は、他の演算の実行に使用する前に、データに当てはめなければなりません。
人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。
load humanactivity n = numel(actid); rng(1) % For reproducibility idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
データ セットの詳細については、コマンド ラインで Description
を入力してください。
関数 fit
を使用してインクリメンタル モデルを学習データに当てはめます。50 個の観測値で構成されるチャンクを一度に当てはめます。各反復で次を行います。
50 個の観測値を処理して、データ ストリームをシミュレート。
前のインクリメンタル モデルを、入力観測値に当てはめた新しいモデルで上書き。
1 番目のバイナリ学習器 の 1 番目のモデル係数と被験者が移動しているかどうか (
Y
> 2) の事前確率を保存し、インクリメンタル学習中にそれらのパラメーターがどのように進化するかを確認。
% Preallocation numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); beta11 = 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)); beta11(j) = Mdl.BinaryLearners{1}.Beta(1); priormoved(j) = sum(Mdl.Prior(Mdl.ClassNames > 2)); end
Mdl
は、ストリーム内のすべてのデータで学習させた incrementalClassificationECOC
モデル オブジェクトです。
パラメーターがインクリメンタル学習中にどのように進化するかを確認するには、それらを別々のタイルにプロットします。
t = tiledlayout(2,1); nexttile plot(beta11) xlim([0 nchunk]) ylabel("\beta_{11}") nexttile plot(priormoved) xlim([0 nchunk]) ylabel("\pi(Subject Is Moving)") xlabel(t,"Iteration")
係数は fit
で各チャンクが処理されると更新されます。事前クラス分布は経験的であるため、 (被験者が移動) は fit
で各チャンクが処理されると変化します。
すべてのクラス名を指定した状態での当てはめ
データに含まれるすべてのクラス名がわかっている場合にインクリメンタル ECOC 学習器を当てはめます。
デバイスに学習させ、被験者で測定された生体データに基づいて、被験者が座る、立つ、歩く、走る、踊るのいずれの状態であるかを予測するとします。各行動にはクラス名 1 ~ 5 をマッピングします。また、この調査では、クラスごとのデバイスの分布は一様になるものとします。
マルチクラス学習用のインクリメンタル ECOC モデルを作成します。クラス名および一様な事前クラス分布を指定します。
classnames = 1:5;
Mdl = incrementalClassificationECOC(ClassNames=classnames,Prior="uniform")
Mdl = incrementalClassificationECOC IsWarm: 0 Metrics: [1x2 table] ClassNames: [1 2 3 4 5] ScoreTransform: 'none' BinaryLearners: {10x1 cell} CodingName: 'onevsone' Decoding: 'lossweighted'
Mdl
は incrementalClassificationECOC
モデル オブジェクトです。そのプロパティはすべて読み取り専用です。学習中に観測されるラベルは Mdl.ClassNames
のいずれかでなければなりません。
Mdl
は、他の演算の実行に使用する前に、データに当てはめなければなりません。
人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。
load humanactivity n = numel(actid); rng(1) % For reproducibility idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
データ セットの詳細については、コマンド ラインで Description
を入力してください。
関数 fit
を使用して、インクリメンタル モデルを学習データに当てはめます。50 個の観測値のチャンクを一度に処理して、データ ストリームをシミュレートします。各反復で次を行います。
50 個の観測値を処理。
前のインクリメンタル モデルを、入力観測値に当てはめた新しいモデルで上書き。
1 番目のバイナリ学習器 の 1 番目のモデル係数と被験者が移動しているかどうか (
Y
> 2) の事前確率を保存し、インクリメンタル学習中にそれらのパラメーターがどのように進化するかを確認。
% Preallocation numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); beta11 = 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)); beta11(j) = Mdl.BinaryLearners{1}.Beta(1); priormoved(j) = sum(Mdl.Prior(Mdl.ClassNames > 2)); end
Mdl
は、ストリーム内のすべてのデータで学習させた incrementalClassificationECOC
モデル オブジェクトです。
パラメーターがインクリメンタル学習中にどのように進化するかを確認するには、それらを別々のタイルにプロットします。
t = tiledlayout(2,1); nexttile plot(beta11) xlim([0 nchunk]) ylabel("\beta_{11}") nexttile plot(priormoved) xlim([0 nchunk]) ylabel("\pi(Subject Is Moving)") xlabel(t,"Iteration")
予測子分布の事後平均は fit
で各チャンクが処理されると更新されます。事前クラス分布は一様として指定されているため、 (被験者が移動) は 0.6 のまま fit
で各チャンクが処理されても変化しません。
観測値の方向および観測値の重みの指定
fitcecoc
を使用して ECOC 分類モデルに学習させ、それをインクリメンタル学習器に変換し、その性能をストリーミング データで追跡してからモデルをデータに当てはめます。インクリメンタル学習関数用に、観測値を列に配置し、観測値の重みを指定します。
データの読み込みと前処理
人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。
load humanactivity rng(1); % For reproducibility n = numel(actid); idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
データ セットの詳細については、コマンド ラインで Description
を入力してください。
静止している被験者 (Y
<= 2) のデータが、移動している被験者のデータの倍の品質であると仮定します。静止している被験者の観測値に重み 2 を割り当て、移動している被験者の観測値に重み 1 を割り当てる重み変数を作成します。
W = ones(n,1) + (Y <=2);
ECOC 分類モデルの学習
ECOC 分類モデルをデータの半分の無作為標本に当てはめます。観測値の重みを指定します。
idxtt = randsample([true false],n,true); TTMdl = fitcecoc(X(idxtt,:),Y(idxtt),Weights=W(idxtt))
TTMdl = ClassificationECOC ResponseName: 'Y' CategoricalPredictors: [] ClassNames: [1 2 3 4 5] ScoreTransform: 'none' BinaryLearners: {10x1 cell} CodingName: 'onevsone'
TTMdl
は従来式の学習済み ECOC 分類モデルを表す ClassificationECOC
モデル オブジェクトです。
学習済みモデルの変換
従来式の学習済みモデルをインクリメンタル学習用のモデルに変換します。
IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = incrementalClassificationECOC IsWarm: 1 Metrics: [1x2 table] ClassNames: [1 2 3 4 5] ScoreTransform: 'none' BinaryLearners: {10x1 cell} CodingName: 'onevsone' Decoding: 'lossweighted'
IncrementalMdl
は incrementalClassificationECOC
モデルです。クラス名が IncrementalMdl.ClassNames
で指定されているため、インクリメンタル学習で見つかるラベルは IncrementalMdl.ClassNames
のいずれかでなければなりません。
パフォーマンス メトリクスの追跡とモデルの当てはめの個別の実行
関数 updateMetrics
および fit
を使用して、残りのデータに対してインクリメンタル学習を実行します。インクリメンタル学習用に、予測子データの観測値を列に配置します。各反復で次を行います。
50 個の観測値を一度に処理して、データ ストリームをシミュレートします。
updateMetrics
を呼び出し、観測値の入力チャンクを所与として、モデルの分類誤差の累積とウィンドウを更新します。前のインクリメンタル モデルを上書きして、Metrics
プロパティ内の損失を更新します。関数がモデルをデータ チャンクに当てはめないことに注意してください。チャンクはモデルに対して "新しい" データです。観測値の向きを列方向に指定し、観測値の重みを指定します。分類誤差を保存します。
fit
を呼び出して、観測値の入力チャンクにモデルを当てはめます。前のインクリメンタル モデルを上書きして、モデル パラメーターを更新します。観測値の向きを列方向に指定し、観測値の重みを指定します。
% Preallocation idxil = ~idxtt; nil = sum(idxil); numObsPerChunk = 50; nchunk = floor(nil/numObsPerChunk); mc = array2table(zeros(nchunk,2),VariableNames=["Cumulative","Window"]); 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),ObservationsIn="columns"); mc{j,:} = IncrementalMdl.Metrics{"ClassificationError",:}; IncrementalMdl = fit(IncrementalMdl,Xil(:,idx),Yil(idx), ... Weights=Wil(idx),ObservationsIn="columns"); end
IncrementalMdl
は、ストリーム内のすべてのデータで学習させた incrementalClassificationECOC
モデル オブジェクトです。
あるいは、updateMetricsAndFit
を使用して、新しいデータ チャンクに対するモデルのパフォーマンス メトリクスを更新し、モデルをデータに当てはめることもできます。
パフォーマンス メトリクスのトレース プロットをプロットします。
plot(mc.Variables) xlim([0 nchunk]) legend(mc.Properties.VariableNames) ylabel("Classification Error") xlabel("Iteration")
累積の損失は徐々に安定しますが、ウィンドウの損失には学習全体を通じて急な変動があります。
条件付き学習の実行
ECOC 分類モデルのパフォーマンスが低下した場合にのみ、そのモデルに対してインクリメンタル学習を行います。
人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。
load humanactivity n = numel(actid); rng(1) % For reproducibility idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
データ セットの詳細については、コマンド ラインで Description
を入力してください。
予測される最大クラス数が 5 で、メトリクス ウィンドウ サイズが 1000 となるように、インクリメンタル学習用の ECOC 分類モデルを構成します。モデルを最初の 1000 個の観測値に当てはめて updateMetrics
用にモデルを準備します。
Mdl = incrementalClassificationECOC(MaxNumClasses=5,MetricsWindowSize=1000); initobs = 1000; Mdl = fit(Mdl,X(1:initobs,:),Y(1:initobs));
Mdl
は incrementalClassificationECOC
モデル オブジェクトです。
モデルのプロパティを照会して、モデルがウォームであるかどうかを調べます。
isWarm = Mdl.IsWarm
isWarm = logical
1
Mdl.IsWarm
が 1 であるため、Mdl
はウォームです。
条件付きの当てはめを行い、インクリメンタル学習を実行します。各反復でこの手順に従います。
100 個の観測値のチャンクを一度に処理することで、データ ストリームをシミュレートします。
入力データ チャンクでモデルのパフォーマンスを更新します。
誤分類誤差率が 0.05 を超える場合にのみ、モデルをデータ チャンクに当てはめます。
パフォーマンスと当てはめを追跡するときは、前のインクリメンタル モデルを上書きします。
誤分類誤差率と 1 番目のバイナリ学習器 の 1 番目のモデル係数を保存し、学習中にそれらがどのように進化するかを確認します。
fit
がモデルに学習させるタイミングを追跡します。
% Preallocation numObsPerChunk = 100; nchunk = floor((n - initobs)/numObsPerChunk); beta11 = zeros(nchunk,1); ce = array2table(nan(nchunk,2),VariableNames=["Cumulative","Window"]); 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)); ce{j,:} = Mdl.Metrics{"ClassificationError",:}; if ce{j,2} > 0.05 Mdl = fit(Mdl,X(idx,:),Y(idx)); trained(j) = true; end beta11(j) = Mdl.BinaryLearners{1}.Beta(1); end
Mdl
は、ストリーム内のすべてのデータで学習させた incrementalClassificationECOC
モデル オブジェクトです。
モデルのパフォーマンスと が学習中にどのように進化するかを確認するには、それらを別々のタイルにプロットします。
t = tiledlayout(2,1); nexttile plot(beta11) hold on plot(find(trained),beta11(trained),"r.") xlim([0 nchunk]) ylabel("\beta_{11}") legend("\beta_{11}","Training occurs",Location="best") hold off nexttile plot(ce.Variables) yline(0.05,"--") xlim([0 nchunk]) ylabel("Misclassification Error Rate") legend(ce.Properties.VariableNames,Location="best") xlabel(t,"Iteration")
のトレース プロットは、前の観測ウィンドウ内における損失が最大で 0.05 である定数値の期間を示します。
入力引数
Mdl
— インクリメンタル学習モデル
incrementalClassificationECOC
モデル オブジェクト
ストリーミング データに当てはめるインクリメンタル学習モデル。incrementalClassificationECOC
モデル オブジェクトとして指定します。Mdl
は、incrementalClassificationECOC
を直接呼び出して作成することも、サポートされている従来式の学習済み機械学習モデルを関数 incrementalLearner
で変換して作成することもできます。
X
— 予測子データのチャンク
浮動小数点行列
予測子データのチャンク。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
Y
— ラベルのチャンク
categorical 配列 | 文字配列 | string 配列 | logical ベクトル | 浮動小数点ベクトル | 文字ベクトルの cell 配列
ラベルのチャンク。categorical 配列、文字配列、string 配列、logical ベクトル、浮動小数点ベクトル、または文字ベクトルの cell 配列として指定します。
観測値のラベル Y
の長さと X
の観測値の数は同じでなければなりません。Y(
は j
)X
内の観測値 j (行または列) のラベルです。
次の状況のいずれかまたは両方に該当する場合、fit
からエラーが発行されます。
Y
に新しいラベルが格納された時点で既にクラスの最大数に達していた (incrementalClassificationECOC
の引数MaxNumClasses
およびClassNames
を参照)。入力モデル
Mdl
のClassNames
プロパティが空以外で、Y
とMdl.ClassNames
のデータ型が異なる。
データ型: char
| string
| cell
| categorical
| logical
| single
| double
メモ
観測値 (予測子またはラベル) または重みが少なくとも 1 つの欠損 (NaN
) 値を含む場合、fit
はその観測値を無視します。したがって、fit
は n 個よりも少ない観測値を使用して更新したモデルを作成します。ここで n は X
内の観測値数です。
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
例: ObservationsIn="columns",Weights=W
は、予測子行列の列が観測値に対応すること、およびインクリメンタル学習中に適用する観測値の重みがベクトル W
に格納されていることを指定します。
ObservationsIn
— 予測子データにおける観測値の次元
"rows"
(既定値) | "columns"
予測子データにおける観測値の次元。"rows"
または "columns"
として指定します。
例: ObservationsIn="columns"
データ型: char
| string
出力引数
Mdl
— 更新されたインクリメンタル学習用の ECOC 分類モデル
incrementalClassificationECOC
モデル オブジェクト
更新されたインクリメンタル学習用の ECOC 分類モデル。入力モデル Mdl
と同じデータ型のインクリメンタル学習モデル オブジェクト incrementalClassificationECOC
として返されます。
incrementalClassificationECOC
を使用して入力モデル Mdl
を作成する際、想定されるすべてのクラスが名前と値の引数 ClassNames
を使用して指定されていない場合、想定されるクラスで未処理のクラスが Y
に含まれていると、fit
は次のアクションを実行します。
Y
内の新しいラベルをMdl.ClassNames
の末尾に追加します。Mdl.Prior
を更新された経験的クラス分布の長さ c のベクトルに拡張します。ここで、c はMdl.ClassNames
内のクラスの数です。
ヒント
従来式の学習とは異なり、インクリメンタル学習には個別のテスト (ホールドアウト) セットが存在しない場合もあります。そのため、データの各入力チャンクをテスト セットとして扱うには、インクリメンタル モデルと各入力チャンクを、同じデータでモデルに学習させる前に
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)