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