fit

Обучите модель пошагового обучения

Описание

fit функция подбирает сконфигурированную модель пошагового обучения для линейной регрессии (incrementalRegressionLinear объект) или линейная бинарная классификация (incrementalClassificationLinear объект) к потоковой передаче данных. Чтобы дополнительно отследить показатели производительности с помощью данных, когда это прибывает, использовать updateMetricsAndFit вместо этого.

Чтобы соответствовать или перекрестный подтвердить регрессию или модель классификации к целому пакету данных целиком, см. другие модели машинного обучения в Регрессии или Классификации.

пример

Mdl = fit(Mdl,X,Y) возвращает модель Mdl пошагового обучения, который представляет входную модель Mdl пошагового обучения обученное использование предиктора и данных об ответе, X и Y соответственно. А именно, fit реализации следующая процедура:

  1. Инициализируйте решатель настройками и линейным коэффициентом модели и сместите оценки входной модели Mdl пошагового обучения.

  2. Подбирайте модель к данным и сохраните обновленные содействующие оценки и настройки в выходной модели Mdl.

Модели ввода и вывода являются совпадающим типом данных.

пример

Mdl = fit(Mdl,X,Y,Name,Value) дополнительные опции использования заданы одним или несколькими аргументами пары "имя-значение". Например, можно задать веса наблюдения или что столбцы матрицы данных предиктора соответствуют наблюдениям.

Примеры

свернуть все

Создайте инкрементную линейную модель SVM по умолчанию для бинарной классификации. Задайте 5 000 периодов оценки наблюдения и решатель SGD.

Mdl = incrementalClassificationLinear('EstimationPeriod',5000,'Solver','sgd')
Mdl = 
  incrementalClassificationLinear

            IsWarm: 0
           Metrics: [1×2 table]
        ClassNames: [1×0 double]
    ScoreTransform: 'none'
              Beta: [0×1 double]
              Bias: 0
           Learner: 'svm'


  Properties, Methods

Mdl incrementalClassificationLinear модель. Все его свойства только для чтения.

Mdl должно быть подходящим к данным, прежде чем можно будет выполнить любые другие операции с помощью них.

Загрузите набор данных деятельности человека. Случайным образом переставьте данные.

load humanactivity
n = numel(actid);
rng(1) % For reproducibility
idx = randsample(n,n);
X = feat(idx,:);
Y = actid(idx);

Для получения дополнительной информации на наборе данных, отобразите Description.

Ответы могут быть одним из пяти классов. Разделите пополам ответ путем идентификации, перемещается ли предмет (actid > 2).

Y = Y > 2;

Используйте fit подбирать инкрементную модель к обучающим данным, во фрагментах 50 наблюдений за один раз, симулировать поток данных. В каждой итерации:

  • Процесс 50 наблюдений.

  • Перезапишите предыдущую инкрементную модель с новой, адаптированной к входящему наблюдению.

  • Хранилище β1, количество учебных наблюдений и априорная вероятность ли перемещенный предмет (Y = true) контролировать их эволюцию во время инкрементного обучения.

% Preallocation
numObsPerChunk = 50;
nchunk = floor(n/numObsPerChunk);
beta1 = zeros(nchunk,1);    
numtrainobs = zeros(nchunk,1);
priormoved = zeros(nchunk,1);

% Incremental fitting
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1);
    iend   = min(n,numObsPerChunk*j);
    idx = ibegin:iend;    
    Mdl = fit(Mdl,X(idx,:),Y(idx));
    beta1(j) = Mdl.Beta(1);
    numtrainobs(j) = Mdl.NumTrainingObservations; 
    priormoved(j) = Mdl.Prior(Mdl.ClassNames == true);
end

IncrementalMdl incrementalClassificationLinear объект модели, который испытал все данные в потоке.

Чтобы видеть, как параметры, развитые во время пошагового обучения, постройте их на отдельных подграфиках.

figure;
subplot(2,2,1)
plot(beta1)
ylabel('\beta_1')
xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.');
xlabel('Iteration')
axis tight
subplot(2,2,2)
plot(numtrainobs);
ylabel('Number of Training Observations')
xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.');
xlabel('Iteration')
axis tight
subplot(2,2,3)
plot(priormoved);
ylabel('Prior P(Subject Moved)')
xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.');
xlabel('Iteration')
axis tight

График предлагает тот fit не подбирает модель к данным, ни обновляет параметры до окончания периода оценки.

Обучите линейную модель бинарной классификации при помощи fitclinear, преобразуйте его в инкрементного ученика, и затем отследите его эффективность и соответствуйте ему к потоковой передаче фрагментов данных. Восток наблюдения в столбцах, и задает веса наблюдения.

Загрузите и предварительно обработайте данные

Загрузите набор данных деятельности человека. Случайным образом переставьте данные. Восток наблюдения за данными о предикторе в столбцах.

load humanactivity
rng(1); % For reproducibility
n = numel(actid);
idx = randsample(n,n);
X = feat(idx,:)';
Y = actid(idx);

Для получения дополнительной информации на наборе данных, отобразите Description.

Ответы могут быть одним из пяти классов. Разделите пополам ответ путем идентификации, перемещается ли предмет (actid > 2).

Y = Y > 2;

Предположим, что данные собрались, когда предмет не перемещался (Y = false) имеет дважды качество чем тогда, когда предмет перемещался. Создайте переменную веса, которая приписывает 2 наблюдениям, собранным из все еще предмет, и 1 к движущемуся предмету.

W = ones(n,1) + ~Y;

Обучите линейную модель бинарной классификации

Подбирайте линейную модель для бинарной классификации к случайной выборке половины данных.

idxtt = randsample([true false],n,true);
TTMdl = fitclinear(X(:,idxtt),Y(idxtt),'ObservationsIn','columns',...
    'Weights',W(idxtt))
TTMdl = 
  ClassificationLinear
      ResponseName: 'Y'
        ClassNames: [0 1]
    ScoreTransform: 'none'
              Beta: [60×1 double]
              Bias: -0.1107
            Lambda: 8.2967e-05
           Learner: 'svm'


  Properties, Methods

TTMdl ClassificationLinear объект модели, представляющий традиционно обученную линейную модель для бинарной модели классификации.

Преобразуйте обученную модель

Преобразуйте традиционно обученную модель классификации в бинарную классификацию линейная модель для пошагового обучения.

IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = 
  incrementalClassificationLinear

            IsWarm: 1
           Metrics: [1×2 table]
        ClassNames: [0 1]
    ScoreTransform: 'none'
              Beta: [60×1 double]
              Bias: -0.1107
           Learner: 'svm'


  Properties, Methods

Отдельно отследите показатели производительности и подбирайте модель

Используйте updateMetrics и fit функции, чтобы выполнить пошаговое обучение на остальной части данных. Симулируйте поток данных путем обработки 50 наблюдений за один раз. В каждой итерации:

  1. Вызовите updateMetrics обновить совокупное и ошибку классификации окон модели, учитывая входящий фрагмент наблюдений. Перезапишите предыдущую инкрементную модель, чтобы обновить потери в Metrics свойство. Обратите внимание на то, что функция не подбирает модель к фрагменту данных — фрагмент является "новыми" данными для модели. Укажите, что наблюдения ориентированы в столбцах и задают веса наблюдения.

  2. Вызовите fit подбирать модель к входящему фрагменту наблюдений. Перезапишите предыдущую инкрементную модель, чтобы обновить параметры модели. Укажите, что наблюдения ориентированы в столбцах и задают веса наблюдения.

  3. Сохраните ошибку классификации и сначала оцененный коэффициент β1.

% Preallocation
idxil = ~idxtt;
nil = sum(idxil);
numObsPerChunk = 50;
nchunk = floor(nil/numObsPerChunk);
ce = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
beta1 = [IncrementalMdl.Beta(1); zeros(nchunk,1)];
Xil = X(:,idxil);
Yil = Y(idxil);
Wil = W(idxil);

% Incremental fitting
for j = 1:nchunk
    ibegin = min(nil,numObsPerChunk*(j-1) + 1);
    iend   = min(nil,numObsPerChunk*j);
    idx = ibegin:iend;
    IncrementalMdl = updateMetrics(IncrementalMdl,Xil(:,idx),Yil(idx),...
        'ObservationsIn','columns','Weights',Wil(idx));
    ce{j,:} = IncrementalMdl.Metrics{"ClassificationError",:};
    IncrementalMdl = fit(IncrementalMdl,Xil(:,idx),Yil(idx),'ObservationsIn','columns',...
        'Weights',Wil(idx));
    beta1(j + 1) = IncrementalMdl.Beta(1);
end

IncrementalMdl incrementalClassificationLinear объект модели, который испытал все данные в потоке.

В качестве альтернативы можно использовать updateMetricsAndFit обновить показатели производительности модели, учитывая новый фрагмент данных, и затем подбирать модель к данным.

Постройте трассировку графики показателей производительности и оцененного коэффициента β1.

figure;
subplot(2,1,1)
h = plot(ce.Variables);
xlim([0 nchunk]);
ylabel('Classification Error')
legend(h,ce.Properties.VariableNames)
subplot(2,1,2)
plot(beta1)
ylabel('\beta_1')
xlim([0 nchunk]);
xlabel('Iteration')

Совокупная потеря устойчива и постепенно уменьшается, тогда как потеря окна переходит.

β1 изменения постепенно, затем выравнивается, как fit процессы больше фрагментов.

Инкрементно обучите модель линейной регрессии только, когда ее эффективность ухудшится.

Загрузите и переставьте 2 015 наборов данных корпуса Нью-Йорк Сити. Для получения дополнительной информации о данных смотрите, что Нью-Йорк Сити Открывает Данные.

load NYCHousing2015

rng(1) % For reproducibility
n = size(NYCHousing2015,1);
shuffidx = randsample(n,n);
NYCHousing2015 = NYCHousing2015(shuffidx,:);

Извлеките переменную отклика 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}];

Сконфигурируйте модель линейной регрессии для пошагового обучения так, чтобы оно не имело оценки или метрического периода прогрева, и метрический размер окна 1000. Подбирайте сконфигурированную модель к первым 100 наблюдениям.

Mdl = incrementalRegressionLinear('EstimationPeriod',0,'MetricsWarmupPeriod',0,'MetricsWindowSize',1000);
numObsPerChunk = 100;
Mdl = fit(Mdl,X(1:numObsPerChunk,:),Y(1:numObsPerChunk));

Mdl incrementalRegressionLinear объект модели.

Выполните пошаговое обучение, с условным подбором кривой, путем выполнения этой процедуры для каждой итерации.

  • Симулируйте поток данных путем обработки фрагмента 100 наблюдений за один раз.

  • Обновите производительность модели путем вычисления эпсилона нечувствительная потеря в 200 окнах наблюдения.

  • Подбирайте модель к фрагменту данных только, когда потеря более чем удвоится от опытных минимальных потерь.

  • При отслеживании эффективности и подбора кривой, перезапишите предыдущую инкрементную модель.

  • Сохраните эпсилон нечувствительная потеря и β313 видеть эволюцию потери и коэффициента.

  • Отследите когда fit обучает модель.

% Preallocation
n = numel(Y) - numObsPerChunk;
nchunk = floor(n/numObsPerChunk);
beta313 = zeros(nchunk,1);
ei = array2table(nan(nchunk,2),'VariableNames',["Cumulative" "Window"]);
trained = false(nchunk,1);

% Incremental fitting
for j = 2:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1);
    iend   = min(n,numObsPerChunk*j);
    idx = ibegin:iend;
    Mdl = updateMetrics(Mdl,X(idx,:),Y(idx));
    ei{j,:} = Mdl.Metrics{"EpsilonInsensitiveLoss",:};
    minei = min(ei{:,2});
    pdiffloss = (ei{j,2} - minei)/minei*100;
    if pdiffloss > 100
        Mdl = fit(Mdl,X(idx,:),Y(idx));
        trained(j) = true;
    end    
    beta313(j) = Mdl.Beta(end);
end

Mdl incrementalRegressionLinear объект модели, который испытал все данные в потоке.

Чтобы видеть, как производительность модели и β313 развитый во время обучения, постройте их на отдельных подграфиках.

subplot(2,1,1)
plot(beta313)
hold on
plot(find(trained),beta313(trained),'r.')
ylabel('\beta_{313}')
xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.');
legend('\beta_{313}','Training occurs','Location','southeast')
hold off
subplot(2,1,2)
plot(ei.Variables)
ylabel('Epsilon Insensitive Loss')
xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.');
xlabel('Iteration')
legend(ei.Properties.VariableNames)

График трассировки β313 показывает периоды постоянных значений, во время которых потеря не удвоилась от опытного минимума.

Входные параметры

свернуть все

Модель пошагового обучения, чтобы соответствовать к потоковой передаче данных в виде incrementalClassificationLinear или incrementalRegressionLinear объект модели. Можно создать Mdl непосредственно или путем преобразования поддерживаемой, традиционно обученной модели машинного обучения использование incrementalLearner функция. Для получения дополнительной информации смотрите соответствующую страницу с описанием.

Фрагмент данных о предикторе, к которым модель является подходящей в виде матрицы с плавающей точкой наблюдений n и Mdl.NumPredictors переменные предикторы. Значение 'ObservationsIn' аргумент пары "имя-значение" определяет ориентацию переменных и наблюдения.

Продолжительность наблюдения маркирует Y и количество наблюдений в X должно быть равным; Y (j) метка наблюдения j (строка или столбец) в X.

Примечание

  • Если Mdl.NumPredictors = 0, fit выводит количество предикторов от X, и устанавливает конгруэнтное свойство выходной модели. В противном случае, если количество переменных предикторов в данных о потоковой передаче изменяется от Mdl.NumPredictors, fit выдает ошибку.

  • fit поддержки только входные данные о предикторе с плавающей точкой. Если входная модель Mdl представляет конвертированное, традиционно обучил подгонку модели к категориальным данным, использовать dummyvar преобразовывать каждую категориальную переменную в числовую матрицу фиктивных переменных и конкатенировать все фиктивные переменные матрицы и любые другие числовые предикторы. Для получения дополнительной информации смотрите Фиктивные Переменные.

Типы данных: single | double

Фрагмент меток, к которым модель является подходящей в виде категориального, символа, или массива строк, логического или вектора с плавающей точкой или массива ячеек из символьных векторов для проблем классификации; или вектор с плавающей точкой для проблем регрессии.

Продолжительность наблюдения маркирует Y и количество наблюдений в X должно быть равным; Y (j) метка наблюдения j (строка или столбец) в X.

Для проблем классификации:

  • fit классификация двоичных файлов поддержек только.

  • Когда ClassNames свойство входной модели Mdl непусто, следующие условия применяются:

    • Если Y содержит метку, которая не является членом Mdl.ClassNames, fit выдает ошибку.

    • Тип данных Y и Mdl.ClassNames должно быть то же самое.

Типы данных: char | string | cell | categorical | logical | single | double

Примечание

  • Если наблюдение (предиктор или метка) или вес Weight содержит по крайней мере одно отсутствие (NaNЗначение, fit игнорирует наблюдение. Следовательно, fit использование меньше, чем наблюдения n, чтобы вычислить производительность модели.

  • Размер фрагмента n и гиперпараметр стохастического градиентного спуска (SGD) обрабатывает размер в пакетном режиме (Mdl.BatchSize) могут быть различные значения. Если n <Mdl.BatchSize, fit использует n доступные наблюдения, когда он применяет SGD.

Аргументы в виде пар имя-значение

Задайте дополнительные разделенные запятой пары Name,Value аргументы. Name имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: 'ObservationsIn','columns','Weights',W указывает, что столбцы матрицы предиктора соответствуют наблюдениям и векторному W содержит веса наблюдения, чтобы применяться во время пошагового обучения.

Размерность наблюдения данных о предикторе в виде разделенной запятой пары, состоящей из 'ObservationsIn' и 'columns' или 'rows'.

Фрагмент весов наблюдения в виде разделенной запятой пары, состоящей из 'Weights' и вектор с плавающей точкой из положительных значений. fit взвешивает наблюдения в X с соответствующими значениями в Weights. Размер Weights должен равняться n, который является количеством наблюдений в X.

По умолчанию, Weights единицы (n,1).

Для получения дополнительной информации, включая схемы нормализации, смотрите Веса Наблюдения.

Типы данных: double | single

Выходные аргументы

свернуть все

Обновленная модель пошагового обучения, возвращенная как объект модели пошагового обучения совпадающего типа данных как входная модель Mdl, любой incrementalClassificationLinear или incrementalRegressionLinear.

Если Mdl.EstimationPeriod > 0, инкрементные подходящие функции updateMetricsAndFit и fit оцените гиперпараметры с помощью первого Mdl.EstimationPeriod наблюдения передали им; они не обучают входную модель к тем данным. Однако, если входящий фрагмент наблюдений n больше или равен количеству наблюдений, оставленных в период оценки m, fit оценочные гиперпараметры с помощью первого n – наблюдения m, и подбирают входную модель к остающимся наблюдениям m. Следовательно, обновления программного обеспечения Beta и Bias свойства, свойства гиперпараметра и свойства ведения записей, такие как NumTrainingObservations.

Для проблем классификации, если ClassNames свойство входной модели Mdl пустой массив, fit устанавливает ClassNames свойство выходной модели Mdl к unique(Y).

Советы

  • В отличие от традиционного обучения, (протягивает) отдельный тест, набор не может существовать для пошагового обучения. Поэтому, чтобы обработать каждый входящий фрагмент данных как набор тестов, передайте инкрементную модель и каждый входящий фрагмент к updateMetrics перед обучением модель на тех же данных.

Алгоритмы

свернуть все

Веса наблюдения

Для проблем классификации, если предшествующее вероятностное распределение класса известно (Mdl.Prior не состоит из NaN значения, fit нормирует веса наблюдения, чтобы суммировать к предшествующим вероятностям класса в соответствующих классах. Это действие подразумевает, что веса наблюдения являются соответствующими предшествующими вероятностями класса по умолчанию.

Для проблем регрессии или если предшествующее вероятностное распределение класса неизвестно, программное обеспечение нормирует заданные веса наблюдения, чтобы суммировать к 1 каждому разу, когда вы вызываете fit.

Введенный в R2020b