Реализуйте инкрементальное обучение для линейной регрессии с помощью гибкого рабочего процесса

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

  1. Обучите линейную регрессионую модель на подмножестве данных.

  2. Преобразуйте традиционно обученную модель в модель инкрементного обучения для линейной регрессии.

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

  4. Для каждого фрагмента используйте updateMetrics для измерения производительности модели с учетом входящих данных и затем используйте fit для соответствия модели этим данным.

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

Загрузите набор данных о корпусе NYC 2015 года и перетащите данные. Для получения дополнительной информации о данных смотрите Открытые данные NYC.

load NYCHousing2015
rng(1); % For reproducibility
n = size(NYCHousing2015,1);
idxshuff = randsample(n,n);
NYCHousing2015 = NYCHousing2015(idxshuff,:);

Предположим, что данные, собранные с Манхэттена (BOROUGH = 1) был собран с помощью нового метода, который удваивает его качество. Создайте весовую переменную, которая атрибутирует 2 к наблюдениям, собранным с Манхэттена, и 1 ко всем остальным наблюдениям.

NYCHousing2015.W = ones(n,1) + (NYCHousing2015.BOROUGH == 1);

Извлеките переменную отклика 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) = [];

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

idxnum = varfun(@isnumeric,NYCHousing2015,'OutputFormat','uniform');
X = [dumvarmat NYCHousing2015{:,idxnum}]';

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

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

idxtt = randsample([true false],n,true);
TTMdl = fitrlinear(X(:,idxtt),Y(idxtt),'ObservationsIn','columns')
TTMdl = 
  RegressionLinear
         ResponseName: 'Y'
    ResponseTransform: 'none'
                 Beta: [313x1 double]
                 Bias: 0.1889
               Lambda: 2.1977e-05
              Learner: 'svm'


  Properties, Methods

TTMdl является RegressionLinear объект модели, представляющий традиционно обученную линейную регрессионую модель.

Преобразуйте обученную модель

Преобразуйте традиционно обученную линейную регрессионую модель в линейную регрессионую модель для инкрементного обучения.

IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = 
  incrementalRegressionLinear

               IsWarm: 1
              Metrics: [1x2 table]
    ResponseTransform: 'none'
                 Beta: [313x1 double]
                 Bias: 0.1889
              Learner: 'svm'


  Properties, Methods

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

Используйте гибкий рабочий процесс, чтобы обновить метрики производительности модели и подгонять инкрементальную модель к обучающим данным путем вызова updateMetrics и fit функционирует отдельно. Симулируйте поток данных путем обработки 500 наблюдений за раз. При каждой итерации:

  1. Функции updateMetrics обновить кумулятивную и оконную эпсилоновую нечувствительную потерю модели с учетом входящего фрагмента наблюдений. Перезаписайте предыдущую инкрементальную модель, чтобы обновить потери в Metrics свойство. Обратите внимание, что функция не подгоняет модель к фрагменту данных - фрагмент является «новыми» данными для модели. Задайте, что наблюдения ориентированы вдоль столбцов данных.

  2. Функции fit для подгонки модели к входящему фрагменту наблюдений. Перезаписайте предыдущую инкрементную модель, чтобы обновить параметры модели. Задайте, что наблюдения ориентированы вдоль столбцов данных.

  3. Сохраните потери и последний оцененный коэффициент β313.

% Preallocation
numObsPerChunk = 500;
nchunk = floor(n/numObsPerChunk);
ei = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
beta313 = zeros(nchunk,1);

% Incremental fitting
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1);
    iend   = min(n,numObsPerChunk*j);
    idx = ibegin:iend;
    IncrementalMdl = updateMetrics(IncrementalMdl,X(:,idx),Y(idx),'ObservationsIn','columns');
    ei{j,:} = IncrementalMdl.Metrics{"EpsilonInsensitiveLoss",:};
    IncrementalMdl = fit(IncrementalMdl,X(:,idx),Y(idx),'ObservationsIn','columns');
    beta313(j) = IncrementalMdl.Beta(end);
end

IncrementalMdl является incrementalRegressionLinear объект модели обучен на всех данных в потоке.

Также можно использовать updateMetricsAndFit чтобы обновить метрики эффективности модели, заданные новый фрагмент данных, и затем подгонять модель к данным.

Смотрите эволюцию модели

Постройте график трассировки метрик эффективности и оценочного коэффициента β313.

figure;
subplot(2,1,1)
h = plot(ei.Variables);
xlim([0 nchunk]);
ylabel('Epsilon Insensitive Loss')
legend(h,ei.Properties.VariableNames)
subplot(2,1,2)
plot(beta313)
ylabel('\beta_{313}')
xlim([0 nchunk]);
xlabel('Iteration')

Figure contains 2 axes. Axes 1 contains 2 objects of type line. These objects represent Cumulative, Window. Axes 2 contains an object of type line.

Совокупные потери постепенно изменяются с каждой итерацией (фрагмент 500 наблюдений), в то время как потери окна скачут. Поскольку окно метрики по умолчанию 200, updateMetrics измеряет эффективность на основе последних 200 наблюдений в каждом 500 фрагменте наблюдения.

β313 сначала резко изменяется, а затем слегка так же fit обрабатывает фрагменты наблюдений.

См. также

Объекты

Функции

Похожие темы