В этом примере показано, как использовать гибкий рабочий процесс, чтобы реализовать пошаговое обучение для линейной регрессии с prequential оценкой. Традиционно обученная модель инициализирует инкрементную модель. А именно, этот пример делает следующее:
Обучите модель линейной регрессии на подмножестве данных.
Преобразуйте традиционно обученную модель в модель пошагового обучения для линейной регрессии.
Симулируйте поток данных с помощью цикла for, который питает маленькие фрагменты наблюдений к алгоритму пошагового обучения.
Для каждого фрагмента используйте 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: [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 фрагменты процессов наблюдений.