В этом примере показано, как использовать гибкий рабочий процесс для реализации инкрементного обучения линейной регрессии с преквенциальной оценкой. Традиционно обученная модель инициализирует инкрементную модель. В частности, в этом примере выполняется следующее:
Тренировка модели линейной регрессии по подмножеству данных.
Преобразование традиционно обученной модели в модель инкрементного обучения для линейной регрессии.
Моделирование потока данных с помощью цикла for, который подает небольшие части наблюдений в алгоритм инкрементного обучения.
Для каждого блока используйте updateMetrics для измерения производительности модели с учетом входящих данных и последующего использования fit для соответствия модели этим данным.
Загрузите набор данных по жилью в Нью-Йорке за 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 наблюдений. При каждой итерации:
Звонить updateMetrics для обновления кумулятивной и оконной нечувствительной потери модели с учетом входящего фрагмента наблюдений. Перезаписать предыдущую инкрементную модель для обновления потерь в Metrics собственность. Обратите внимание, что функция не подходит модели к порции данных - порция является «новыми» данными для модели. Укажите, что наблюдения ориентированы вдоль столбцов данных.
Звонить fit для соответствия модели входящему фрагменту наблюдений. Перезаписать предыдущую инкрементную модель для обновления параметров модели. Укажите, что наблюдения ориентированы вдоль столбцов данных.
Запишите потери и последний оцененный коэффициент .
% 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 для обновления метрик производительности модели с учетом нового фрагмента данных, а затем подгонки модели к данным.
Постройте график трассировки метрик производительности и оценочного коэффициента .
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 наблюдательном блоке.
резко изменяется сначала, а затем просто немного, как fit обрабатывает куски наблюдений.