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 по умолчанию для двоичной классификации. Задайте период оценки 5000 наблюдений и решателя SGD.

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

            IsWarm: 0
           Metrics: [1x2 table]
        ClassNames: [1x0 double]
    ScoreTransform: 'none'
              Beta: [0x1 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;

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

  • Симулируйте поток данных путем обработки 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

Figure contains 3 axes. Axes 1 contains 2 objects of type line, constantline. Axes 2 contains 2 objects of type line, constantline. Axes 3 contains 2 objects of type line, constantline.

График предполагает, что 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: [60x1 double]
              Bias: -0.1107
            Lambda: 8.2967e-05
           Learner: 'svm'


  Properties, Methods

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

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

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

IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = 
  incrementalClassificationLinear

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


  Properties, Methods

Отдельно отслеживайте метрики эффективности и подгоняйте модель

Выполните инкрементальное обучение для остальных данных с помощью updateMetrics и fit функций. При каждой итерации:

  1. Симулируйте поток данных путем обработки 50 наблюдений за раз.

  2. Функции updateMetrics обновить совокупную и оконную ошибку классификации модели с учетом входящего фрагмента наблюдений. Перезаписайте предыдущую инкрементальную модель, чтобы обновить потери в Metrics свойство. Обратите внимание, что функция не подгоняет модель к фрагменту данных - фрагмент является «новыми» данными для модели. Задайте, что наблюдения ориентированы в столбцах, и задайте веса наблюдений.

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

  4. Сохраните ошибку классификации и первый оцененный коэффициент β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')

Figure contains 2 axes. Axes 1 contains 2 objects of type line. These objects represent Cumulative, Window. Axes 2 contains an object of type line.

Совокупные потери стабильны и постепенно уменьшаются, в то время как потери окна скачут.

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

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

Загрузите и перетащите набор данных о корпусе NYC 2015 года. Для получения дополнительной информации о данных смотрите Открытые данные NYC.

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)

Figure contains 2 axes. Axes 1 contains 3 objects of type line, constantline. These objects represent \beta_{313}, Training occurs. Axes 2 contains 3 objects of type line, constantline. These objects represent Cumulative, Window.

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

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

свернуть все

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

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

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

Примечание

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

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

Типы данных: 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'.

Типы данных: char | string

Фрагмент весов наблюдений, заданный как разделенная разделенными запятой парами, состоящая из '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).

Совет

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

Алгоритмы

свернуть все

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

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

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

Расширенные возможности

.
Введенный в R2020b