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