Main Content

分類学習器で学習させたロジスティック回帰モデルからのインクリメンタル学習モデルの初期化

この例では、分類学習器アプリを使用してロジスティック回帰モデルの学習を行う方法を示します。その後、コマンド ラインで、アプリでの学習から得た情報を使用して、バイナリ分類用のインクリメンタル モデルを初期化し、学習を行います。

データの読み込みと前処理

人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。

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

あるいは、[アプリ] タブで [さらに表示] 矢印をクリックしてアプリ ギャラリーを開きます。[機械学習および深層学習] でアプリのアイコンをクリックします。

学習データ セットと変数を選択します。

  1. [分類学習器] タブの [ファイル] セクションで、[新規セッション]、[ワークスペースから] を選択します。

  2. [ワークスペースからの新規セッション] ダイアログ ボックスで、[データ セット変数] の予測子変数 [Xtt] を選択します。

  3. [応答] で、[ワークスペースから] をクリックします。[Ytt] が自動的に選択されます。

  4. [検証方法] で、[再代入検証] を選択します。

  5. [セッションの開始] をクリックします。

ロジスティック回帰モデルの学習を行います。

  1. [分類学習器] タブの [モデル] セクションで [さらに表示] 矢印をクリックしてモデルのギャラリーを開きます。[ロジスティック回帰分類器] セクションで [ロジスティック回帰] をクリックします。

  2. [分類学習器] タブの [学習] セクションで、[すべてを学習] をクリックして [選択を学習] を選択します。

    モデルに学習させた後、混同行列が表示されます。

    Confusion matrix

    混同行列はモデルが標本内観測値を適切に分類していることを示しています。

学習済みのロジスティック回帰モデルをエクスポートします。

  1. [分類学習器] タブの [エクスポート] セクションで [モデルのエクスポート][モデルのエクスポート] をクリックします。

  2. [モデルのエクスポート] ダイアログ ボックスで [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 個の観測値を一度に処理して、データ ストリームをシミュレートします。各反復で次を行います。

  1. updateMetricsAndFit を呼び出し、観測値の入力チャンクを所与として、モデルの分類誤差の累積とウィンドウを更新します。前のインクリメンタル モデルを上書きして、Metrics プロパティ内の損失を更新します。

  2. 損失と推定された係数 β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')

Trace plots of the epsilon-insensitive loss and last coefficient

累積の損失は各反復 (50 個の観測値のチャンク) ごとに徐々に変化しますが、ウィンドウの損失には急な変動があります。メトリクス ウィンドウの既定値は 200 なので、updateMetricsAndFit は 4 回の反復ごとに性能を測定します。

β14 は、updateMetricsAndFit が観測値のチャンクを処理するたびにデータに適合します。

参考

アプリ

オブジェクト

関数

関連するトピック