分類学習器で学習させたロジスティック回帰モデルからのインクリメンタル学習モデルの初期化
この例では、分類学習器アプリを使用してロジスティック回帰モデルの学習を行う方法を示します。その後、コマンド ラインで、アプリでの学習から得た情報を使用して、バイナリ分類用のインクリメンタル モデルを初期化し、学習を行います。
データの読み込みと前処理
人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。
load humanactivity rng(1); % For reproducibility n = numel(actid); idx = randsample(n,n); X = feat(idx,:); actid = actid(idx);
データ セットの詳細については、コマンド ラインで Description
を入力してください。
応答は、次の 5 つのクラスのいずれかになります。座る、立つ、歩く、走る、または踊る。被験者が移動しているかどうか (actid > 2
) を区別する categorical 配列を作成して、応答を二分します。
moveidx = actid > 2; Y = repmat("NotMoving",n,1); Y(moveidx) = "Moving"; Y = categorical(Y);
ロジスティック回帰モデルにデータの約 1% を学習させ、残りのデータをインクリメンタル学習用に予約するとします。
cvpartition
を呼び出し、0.99
のホールドアウト (テスト) 標本比率を指定して、データを無作為に 1% と 99% のサブセットに分割します。1% と 99% の区画用の変数を作成します。
cvp = cvpartition(n,'HoldOut',0.99);
idxtt = cvp.training;
idxil = cvp.test;
Xtt = X(idxtt,:);
Xil = X(idxil,:);
Ytt = Y(idxtt);
Yil = Y(idxil);
分類学習器を使用したモデルの学習
コマンド ラインに classificationLearner
と入力して、分類学習器を開きます。
classificationLearner
あるいは、[アプリ] タブで [さらに表示] 矢印をクリックしてアプリ ギャラリーを開きます。[機械学習および深層学習] でアプリのアイコンをクリックします。
学習データ セットと変数を選択します。
[分類学習器] タブの [ファイル] セクションで、[新規セッション]、[ワークスペースから] を選択します。
[ワークスペースからの新規セッション] ダイアログ ボックスで、[データ セット変数] の予測子変数 [Xtt] を選択します。
[応答] で、[ワークスペースから] をクリックします。[Ytt] が自動的に選択されます。
[検証方法] で、[再代入検証] を選択します。
[セッションの開始] をクリックします。
ロジスティック回帰モデルの学習を行います。
[分類学習器] タブの [モデル] セクションで [さらに表示] 矢印をクリックしてモデルのギャラリーを開きます。[ロジスティック回帰分類器] セクションで [ロジスティック回帰] をクリックします。
[分類学習器] タブの [学習] セクションで、[すべてを学習] をクリックして [選択を学習] を選択します。
モデルに学習させた後、混同行列が表示されます。
混同行列はモデルが標本内観測値を適切に分類していることを示しています。
学習済みのロジスティック回帰モデルをエクスポートします。
[分類学習器] タブの [エクスポート] セクションで [モデルのエクスポート]、[モデルのエクスポート] をクリックします。
[モデルのエクスポート] ダイアログ ボックスで [OK] をクリックします。
アプリは、学習済みのモデルを構造体配列 trainedModel
で他の変数と共にワークスペースに渡します。分類学習器を閉じます。
エクスポートされたモデルを使用したインクリメンタル モデルの初期化
コマンド ラインで、trainedModel
から学習済みのロジスティック回帰モデルとクラス名を抽出します。モデルは GeneralizedLinearModel
オブジェクトです。クラス名は応答変数のデータ型と一致しなければならないため、格納されている値を categorical
に変換します。
Mdl = trainedModel.GeneralizedLinearModel; ClassNames = categorical(trainedModel.ClassNames);
切片と係数をモデルから抽出します。切片は最初の係数です。
Bias = Mdl.Coefficients.Estimate(1); Beta = Mdl.Coefficients.Estimate(2:end);
GeneralizedLinearModel
オブジェクトをインクリメンタル モデルに直接変換することはできません。ただし、推定係数やクラス名などの、アプリから学習した情報を渡すことで、バイナリ分類用のインクリメンタル モデルを初期化できます。
バイナリ分類用のインクリメンタル モデルを直接作成します。学習器と、分類学習器から学習した切片、係数の推定、およびクラス名を指定します。係数の適切な初期値が存在し、すべてのクラス名が既知であるため、メトリクスのウォームアップ期間を長さ 0
に指定します。
IncrementalMdl = incrementalClassificationLinear('Learner','logistic', ... 'Beta',Beta,'Bias',Bias,'ClassNames',ClassNames, ... 'MetricsWarmupPeriod',0)
IncrementalMdl = incrementalClassificationLinear IsWarm: 0 Metrics: [1×2 table] ClassNames: [Moving NotMoving] ScoreTransform: 'logit' Beta: [60×1 double] Bias: -471.7873 Learner: 'logistic' Properties, Methods
IncrementalMdl
は、ロジスティック回帰モデルを使用したインクリメンタル学習用の incrementalClassificationLinear
モデル オブジェクトです。係数とすべてのクラス名が指定されているため、IncrementalMdl
とデータを predict
に渡すことで応答を予測できます。
インクリメンタル学習の実装
関数 updateMetricsAndFit
を使用して、99% のデータ区画でインクリメンタル学習を実行します。50 個の観測値を一度に処理して、データ ストリームをシミュレートします。各反復で次を行います。
updateMetricsAndFit
を呼び出し、観測値の入力チャンクを所与として、モデルの分類誤差の累積とウィンドウを更新します。前のインクリメンタル モデルを上書きして、Metrics
プロパティ内の損失を更新します。損失と推定された係数 β14 を保存します。
% Preallocation nil = sum(idxil); numObsPerChunk = 50; nchunk = floor(nil/numObsPerChunk); ce = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]); beta14 = [IncrementalMdl.Beta(14); zeros(nchunk,1)]; % Incremental learning for j = 1:nchunk ibegin = min(nil,numObsPerChunk*(j-1) + 1); iend = min(nil,numObsPerChunk*j); idx = ibegin:iend; IncrementalMdl = updateMetricsAndFit(IncrementalMdl,Xil(idx,:),Yil(idx)); ce{j,:} = IncrementalMdl.Metrics{"ClassificationError",:}; beta14(j + 1) = IncrementalMdl.Beta(14); end
IncrementalMdl
は、ストリーム内のすべてのデータで学習させた incrementalClassificationLinear
モデル オブジェクトです。
パフォーマンス メトリクスと β14 のトレース プロットをプロットします。
figure; subplot(2,1,1) h = plot(ce.Variables); xlim([0 nchunk]); ylabel('Classification Error') legend(h,ce.Properties.VariableNames) subplot(2,1,2) plot(beta14) ylabel('\beta_{14}') xlim([0 nchunk]); xlabel('Iteration')
累積の損失は各反復 (50 個の観測値のチャンク) ごとに徐々に変化しますが、ウィンドウの損失には急な変動があります。メトリクス ウィンドウの既定値は 200 なので、updateMetricsAndFit
は 4 回の反復ごとに性能を測定します。
β14 は、updateMetricsAndFit
が観測値のチャンクを処理するたびにデータに適合します。