В этом примере показано, как настроить и обучить линейную регрессионую модель SVM с помощью Regression Learner приложения. Затем в командной строке инициализируйте и обучите инкрементальную модель для линейной регрессии SVM с помощью информации, полученной из обучения в приложении.
Загрузите набор данных о корпусе NYC 2015 года и перетащите данные. Для получения дополнительной информации о данных смотрите Открытые данные NYC.
load NYCHousing2015 rng(1); % For reproducibility n = size(NYCHousing2015,1); idxshuff = randsample(n,n); NYCHousing2015 = NYCHousing2015(idxshuff,:);
Для числовой устойчивости шкалы SALEPRICE
по 1e6
.
NYCHousing2015.SALEPRICE = NYCHousing2015.SALEPRICE/1e6;
Рассмотрите настройку линейной регрессионой модели SVM примерно к 1% данных и резервирование остальных данных для инкрементного обучения.
Regression Learner поддерживает категориальные переменные. Однако, потому что модели SVM требуют фиктивных категориальных переменных и BUILDINGCLASSCATEGORY
и NEIGHBORHOOD
переменные содержат много уровней (некоторые с низким уровнем представления), вероятность того, что раздел не имеет всех категорий, высока. Поэтому фиктивный код все категориальные переменные. Соедините матрицу фиктивных переменных с остальными числовыми переменными.
catvars = ["BOROUGH" "BUILDINGCLASSCATEGORY" "NEIGHBORHOOD"]; dumvars = splitvars(varfun(@(x)dummyvar(categorical(x)),NYCHousing2015,... 'InputVariables',catvars)); NYCHousing2015(:,catvars) = []; idxnum = varfun(@isnumeric,NYCHousing2015,'OutputFormat','uniform'); NYCHousing2015 = [dumvars NYCHousing2015(:,idxnum)];
Случайным образом разбейте данные на подмножества 1% и 99% путем вызова cvpartition
и определение доли выборок удержания (теста) 0.99
. Создайте таблицы для разделов 1% и 99%.
cvp = cvpartition(n,'HoldOut',0.99);
idxtt = cvp.training;
idxil = cvp.test;
NYCHousing2015tt = NYCHousing2015(idxtt,:);
NYCHousing2015il = NYCHousing2015(idxil,:);
Откройте Regression Learner путем ввода regressionLearner
в командной строке.
regressionLearner
Кроме того, на вкладке Apps щелкните стрелу Show more, чтобы открыть галерею Apps. В разделе Machine Learning and Deep Learning щелкните значок приложения.
Выберите набор обучающих данных и переменные.
На вкладке Regression Learner, в разделе File, выберите New Session, а затем From Workspace.
В диалоговом окне New Session from Workspace, в разделе Переменная набора данных, выберите NYCHousing2015tt набора данных.
В разделе Response убедитесь, что выбран SALEPRICE переменной отклика.
Нажмите Start Session.
Приложение реализует 5-кратную перекрестную валидацию по умолчанию.
Обучите линейную регрессионую модель SVM. Настройте только Epsilon гиперпараметр с помощью байесовской оптимизации.
На вкладке Regression Learner, в разделе Model Type, нажмите стрелу Show more, чтобы открыть галерею Apps. В Support Vector Machines разделе нажмите Optimizable SVM.
На вкладке Regression Learner, в разделе Model Type, выберите Advanced, а затем Advanced.
В диалоговом окне Select SVM Hyperparameters to Optimize:
Снимите флажки Optimize для всех опций, кроме Epsilon.
Установите значение Kernel scale равным Manual
и 1
.
Снимите флажок Value Standardize data.
Закройте диалоговое окно.
На вкладке Regression Learner, в разделе Training, нажмите Train.
Приложение показывает график минимального MSE обобщения модели по мере прогрессирования оптимизации. Приложение может занять некоторое время, чтобы оптимизировать алгоритм.
Экспортируйте обученную, оптимизированную линейную регрессионую модель SVM.
На вкладке Regression Learner, в разделе Export, выберите Export Model и Export Model.
В диалоговом окне Export Model нажмите OK.
Приложение передает обученную модель, помимо других переменных, в массиве структур trainedModel
в рабочую область. Закройте Regression Learner .
В командной строке извлеките обученную регрессионую модель SVM из trainedModel
.
Mdl = trainedModel.RegressionSVM;
Преобразуйте модель в инкрементальную модель.
IncrementalMdl = incrementalLearner(Mdl) IncrementalMdl.Epsilon
IncrementalMdl = incrementalRegressionLinear IsWarm: 1 Metrics: [1×2 table] ResponseTransform: 'none' Beta: [312×1 double] Bias: 10.1437 Learner: 'svm' Properties, Methods ans = 1.4453
IncrementalMdl
является incrementalRegressionLinear
объект модели для инкрементного обучения с использованием линейной регрессионой SVM модели. incrementalLearner
инициализирует IncrementalMdl
использование коэффициентов и оптимизированного значения Epsilon
гиперпараметр, полученный из Mdl
. Поэтому можно предсказать ответы путем передачи IncrementalMdl
и данные для predict
. Кроме того, IsWarm
свойство true
, что означает, что инкрементальные функции обучения измеряют производительность модели с начала инкрементного обучения.
Поскольку функции инкрементного обучения принимают только матрицы с плавающей точкой, создайте матрицы для данных предиктора и отклика.
Xil = NYCHousing2015il{:,1:(end-1)}; Yil = NYCHousing2015il{:,end};
Выполните инкрементальное обучение для раздела данных 99% при помощи updateMetricsAndFit
функция. Симулируйте поток данных путем обработки 500 наблюдений за раз. При каждой итерации:
Функции updateMetricsAndFit
обновить кумулятивную и оконную эпсилоновую нечувствительную потерю модели с учетом входящего фрагмента наблюдений. Перезаписайте предыдущую инкрементальную модель, чтобы обновить потери в Metrics
свойство. Обратите внимание, что функция не подгоняет модель к фрагменту данных - фрагмент является «новыми» данными для модели.
Сохраните потери и последний оцененный коэффициент β 313.
% Preallocation nil = sum(idxil); numObsPerChunk = 500; nchunk = floor(nil/numObsPerChunk); ei = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]); beta313 = [IncrementalMdl.Beta(end); zeros(nchunk,1)]; % Incremental learning for j = 1:nchunk ibegin = min(nil,numObsPerChunk*(j-1) + 1); iend = min(nil,numObsPerChunk*j); idx = ibegin:iend; IncrementalMdl = updateMetricsAndFit(IncrementalMdl,Xil(idx,:),Yil(idx)); ei{j,:} = IncrementalMdl.Metrics{"EpsilonInsensitiveLoss",:}; beta313(j + 1) = IncrementalMdl.Beta(end); end
IncrementalMdl
является incrementalRegressionLinear
объект модели обучен на всех данных в потоке.
Постройте график трассировки метрик эффективности и оценочного коэффициента β 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, updateMetricsAndFit
измеряет эффективность на основе последних 200 наблюдений в каждом 500 фрагменте наблюдения.
β 313 изменяется резко, а затем отключается какupdateMetricsAndFit
обрабатывает фрагменты наблюдений.