Реализуйте пошаговое обучение Используя гибкий рабочий процесс

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

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

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

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

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

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

Загрузите 2 015 наборов данных корпуса Нью-Йорк Сити и переставьте данные. Для получения дополнительной информации о данных смотрите, что Нью-Йорк Сити Открывает Данные.

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: [313×1 double]
                 Bias: 0.1889
               Lambda: 2.1977e-05
              Learner: 'svm'


  Properties, Methods

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

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

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

IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = 
  incrementalRegressionLinear

               IsWarm: 1
              Metrics: [1×2 table]
    ResponseTransform: 'none'
                 Beta: [313×1 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')

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

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

Смотрите также

Объекты

Функции

Похожие темы