Инициализируйте модель инкрементного обучения из модели логистической регрессии, обученной в Classification Learner

В этом примере показано, как обучить логистическую регрессионую модель с помощью Classification Learner app. затем, в командной строке, инициализируйте и обучите инкрементальную модель для двоичной классификации, используя информацию, полученную из обучения в приложении.

Загрузка и предварительная обработка данных

Загрузите набор данных о деятельности человека. Случайным образом перетасуйте данные.

load humanactivity
rng(1); % For reproducibility
n = numel(actid);
idx = randsample(n,n);
X = feat(idx,:);
actid = actid(idx);

Для получения дополнительной информации о наборе данных введите Description в командной строке.

Ответы могут быть одним из пяти классов: Сидя, Стоя, Ходьба, Бег, или Танцы. Дихотомизируйте ответ путем создания категориального массива, который идентифицирует, движется ли субъект (actid > 2).

moveidx = actid > 2;
Y = repmat("NotMoving",n,1);
Y(moveidx) = "Moving";
Y = categorical(Y);

Рассмотрите обучение логистической регрессионной модели приблизительно 1% данных и резервирование остальных данных для инкрементного обучения.

Случайным образом разбейте данные на подмножества 1% и 99% путем вызова cvpartition и определение доли выборок удержания (теста) 0.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);

Обучите модель с помощью Classification Learner

Откройте Classification Learner путем ввода classificationLearner в командной строке.

classificationLearner

Кроме того, на вкладке Apps щелкните стрелу Show more, чтобы открыть галерею Apps. В разделе Machine Learning and Deep Learning щелкните значок приложения.

Выберите набор обучающих данных и переменные.

  1. На вкладке Classification Learner, в разделе File, выберите New Session > From Workspace.

  2. В диалоговом окне New Session from Workspace, в разделе Переменная набора данных, выберите Xtt переменной предиктора.

  3. В разделе Response нажмите From workspace; Обратите внимание, что Ytt выбирается автоматически.

  4. В разделе Validation нажмите Resubstitution Validation.

  5. Нажмите Start Session.

Обучите логистическую регрессионую модель.

  1. На вкладке Classification Learner, в разделе Model Type, щелкните стрелу Show more, чтобы открыть галерею моделей. В Logistic Regression Classifiers разделе нажмите Logistic Regression.

  2. На вкладке Classification Learner, в разделе Training, нажмите Train.

  3. Когда приложение закончит обучение модели, постройте матрицу неточностей. На вкладке Classification Learner, в разделе Plots, нажмите Confusion Matrix и выберите Validation Data.

    Confusion matrix

    Матрица неточностей предполагает, что модель хорошо классифицирует наблюдения в выборке.

Экспорт обученной модели логистической регрессии.

  1. На вкладке Classification Learner, в разделе Export, выберите Export Model > Export Model.

  2. В диалоговом окне Export Model нажмите OK.

Приложение передает обученную модель, помимо других переменных, в массиве структур trainedModel в рабочую область. Закройте Classification Learner .

Инициализируйте инкрементальную модель с помощью экспортированной модели

В командной строке извлеките обученную модель логистической регрессии и имена классов из trainedModel. Модель является GeneralizedLinearModel объект. Поскольку имена классов должны совпадать с типом данных переменной отклика, преобразуйте сохраненное значение в categorical.

Mdl = trainedModel.GeneralizedLinearModel;
ClassNames = categorical(trainedModel.ClassNames);

Извлеките из модели точку пересечения и коэффициенты. Точка пересечения является первым коэффициентом.

Bias = Mdl.Coefficients.Estimate(1);
Beta = Mdl.Coefficients.Estimate(2:end);

Вы не можете преобразовать GeneralizedLinearModel объект к инкрементной модели непосредственно. Однако можно инициализировать инкрементальную модель для двоичной классификации, передав информацию, полученную из приложения, такую как оценочные коэффициенты и имена классов.

Создайте инкрементальную модель для двоичной классификации непосредственно. Задайте ученика, точку пересечения, оценки коэффициентов и имена классов, полученные из Classification Learner. Поскольку хорошие начальные значения коэффициентов существуют, и все имена классов известны, задайте период разогрева метрики длины 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.

Реализация инкрементного обучения

Выполните инкрементальное обучение для раздела данных 99% при помощи updateMetricsAndFit функция. Симулируйте поток данных путем обработки 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 измеряет эффективность каждые четыре итерации.

β 14 адаптируется к данным какupdateMetricsAndFit обрабатывает фрагменты наблюдений.

См. также

Приложения

Объекты

Функции

Похожие темы