fit

Обучите наивную модель классификации Бейеса пошаговому обучению

Описание

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

Чтобы соответствовать или перекрестный подтвердить наивную модель классификации Бейеса к целому пакету данных целиком, смотрите fitcnb.

пример

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

пример

Mdl = fit(Mdl,X,Y,'Weights',Weights) задает веса наблюдения Weights.

Примеры

свернуть все

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

Создайте инкрементную наивную модель Bayes. Укажите, что максимальное количество ожидаемых классов равняется 5.

Mdl = incrementalClassificationNaiveBayes('MaxNumClasses',5)
Mdl = 
  incrementalClassificationNaiveBayes

                    IsWarm: 0
                   Metrics: [1×2 table]
                ClassNames: [1×0 double]
            ScoreTransform: 'none'
         DistributionNames: 'normal'
    DistributionParameters: {}


  Properties, Methods

Mdl incrementalClassificationNaiveBayes модель. Все его свойства только для чтения. Mdl может столкнуться самое большее с 5 уникальными классами. По умолчанию, предшествующее распределение класса Mdl.Prior является эмпирическим, что означает обновления программного обеспечения предшествующее распределение, когда оно сталкивается с метками.

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

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

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

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

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

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

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

  • Сохраните среднее значение первого предиктора в первом классе μ11 и априорная вероятность, что предмет перемещается (Y > 2), чтобы видеть, как они развиваются во время инкрементного обучения.

% Preallocation
numObsPerChunk = 50;
nchunk = floor(n/numObsPerChunk);
mu11 = 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));
    mu11(j) = Mdl.DistributionParameters{1,1}(1);
    priormoved(j) = sum(Mdl.Prior(Mdl.ClassNames > 2));
end

IncrementalMdl incrementalClassificationNaiveBayes объект модели, обученный на всех данных в потоке.

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

figure;
subplot(2,1,1)
plot(mu11)
ylabel('\mu_{11}')
xlabel('Iteration')
axis tight
subplot(2,1,2)
plot(priormoved);
ylabel('Prior P(Subject Moved)')
xlabel('Iteration')
axis tight

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

В этом примере показано, как соответствовать инкрементному наивному ученику Бейеса, когда вы знаете все имена классов в данных.

Считайте обучение устройством, чтобы предсказать, находится ли предмет, положение, обход, выполнение или танец на основе биометрических данных, измеренных на предмете, и вы знаете карту 1 - 5 имен классов к действию. Кроме того, предположите, что исследователи планируют отсоединить устройство каждому классу однородно.

Создайте инкрементного наивного ученика Бейеса для изучения мультикласса. Задайте имена классов и универсальное предшествующее распределение класса.

classnames = 1:5;
Mdl = incrementalClassificationNaiveBayes('ClassNames',classnames,'Prior','uniform')
Mdl = 
  incrementalClassificationNaiveBayes

                    IsWarm: 0
                   Metrics: [1×2 table]
                ClassNames: [1 2 3 4 5]
            ScoreTransform: 'none'
         DistributionNames: 'normal'
    DistributionParameters: {5×0 cell}


  Properties, Methods

Mdl incrementalClassificationNaiveBayes объект модели. Все его свойства только для чтения. Во время обучения наблюдаемые метки должны быть в Mdl.ClassNames.

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

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

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

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

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

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

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

  • Сохраните среднее значение первого предиктора в первом классе μ11 и априорная вероятность, что предмет перемещается (Y > 2), чтобы видеть, как они развиваются во время инкрементного обучения.

% Preallocation
numObsPerChunk = 50;
nchunk = floor(n/numObsPerChunk);
mu11 = 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));
    mu11(j) = Mdl.DistributionParameters{1,1}(1);
    priormoved(j) = sum(Mdl.Prior(Mdl.ClassNames > 2));
end

IncrementalMdl incrementalClassificationNaiveBayes объект модели, обученный на всех данных в потоке.

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

figure;
subplot(2,1,1)
plot(mu11)
ylabel('\mu_{11}')
xlabel('Iteration')
axis tight
subplot(2,1,2)
plot(priormoved);
ylabel('Prior P(Subject Moved)')
xlabel('Iteration')
axis tight

fit обновляет следующее среднее значение распределения предиктора, когда это обрабатывает каждый фрагмент. Поскольку предшествующее распределение класса задано как универсальная форма, π(предмет перемещается), = 0.6, и не изменяется как fit процессы каждый фрагмент.

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

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

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

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

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

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

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

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

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

idxtt = randsample([true false],n,true);
TTMdl = fitcnb(X(idxtt,:),Y(idxtt),'Weights',W(idxtt))
TTMdl = 
  ClassificationNaiveBayes
              ResponseName: 'Y'
     CategoricalPredictors: []
                ClassNames: [1 2 3 4 5]
            ScoreTransform: 'none'
           NumObservations: 12053
         DistributionNames: {1×60 cell}
    DistributionParameters: {5×60 cell}


  Properties, Methods

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

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

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

IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = 
  incrementalClassificationNaiveBayes

                    IsWarm: 1
                   Metrics: [1×2 table]
                ClassNames: [1 2 3 4 5]
            ScoreTransform: 'none'
         DistributionNames: {1×60 cell}
    DistributionParameters: {5×60 cell}


  Properties, Methods

IncrementalMdl incrementalClassificationNaiveBayes модель. Поскольку имена классов заданы в Mdl.ClassNames, метки, с которыми сталкиваются во время пошагового обучения, должны быть в Mdl.ClassNames.

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

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

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

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

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

  4. Сохраните минимальную стоимость.

% Preallocation
idxil = ~idxtt;
nil = sum(idxil);
numObsPerChunk = 50;
nchunk = floor(nil/numObsPerChunk);
mc = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
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),...
        'Weights',Wil(idx));
    mc{j,:} = IncrementalMdl.Metrics{"MinimalCost",:};
    IncrementalMdl = fit(IncrementalMdl,Xil(idx,:),Yil(idx),'Weights',Wil(idx));
end

IncrementalMdl incrementalClassificationNaiveBayes объект модели, обученный на всех данных в потоке.

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

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

h = plot(mc.Variables);
xlim([0 nchunk]);
ylabel('Minimal Cost')
legend(h,mc.Properties.VariableNames)
xlabel('Iteration')

Совокупная потеря постепенно стабилизировалась, тогда как потеря окна переходит.

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

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

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

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

Сконфигурируйте наивную модель классификации Бейеса для пошагового обучения так, чтобы максимальное количество ожидаемых классов равнялось 5, отслеженный показатель производительности включает misclassification коэффициент ошибок и метрический размер окна 1 000. Подбирайте сконфигурированную модель к первым 1 000 наблюдений.

Mdl = incrementalClassificationNaiveBayes('MaxNumClasses',5,'MetricsWindowSize',1000,...
    'Metrics','classiferror');
initobs = 1000;
Mdl = fit(Mdl,X(1:initobs,:),Y(1:initobs));

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

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

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

  • Обновите производительность модели на входящем фрагменте данных.

  • Подбирайте модель к фрагменту данных только, когда misclassification коэффициент ошибок будет больше 0.05.

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

  • Сохраните misclassification коэффициент ошибок и среднее значение первого предиктора во втором классе μ21 чтобы видеть, как они развиваются во время обучения.

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

% Preallocation
numObsPerChunk = 100;
nchunk = floor((n - initobs)/numObsPerChunk);
mu21 = zeros(nchunk,1);
ce = array2table(nan(nchunk,2),'VariableNames',["Cumulative" "Window"]);
trained = false(nchunk,1);

% Incremental fitting
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1 + initobs);
    iend   = min(n,numObsPerChunk*j + initobs);
    idx = ibegin:iend;
    Mdl = updateMetrics(Mdl,X(idx,:),Y(idx));
    ce{j,:} = Mdl.Metrics{"ClassificationError",:};
    if ce{j,2} > 0.05
        Mdl = fit(Mdl,X(idx,:),Y(idx));
        trained(j) = true;
    end    
    mu21(j) = Mdl.DistributionParameters{2,1}(1);
end

Mdl incrementalClassificationNaiveBayes объект модели, обученный на всех данных в потоке.

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

subplot(2,1,1)
plot(mu21)
hold on
plot(find(trained),mu21(trained),'r.')
ylabel('\mu_{21}')
legend('\mu_{21}','Training occurs','Location','best')
hold off
subplot(2,1,2)
plot(ce.Variables)
ylabel('Misclassification Error Rate')
xlabel('Iteration')
legend(ce.Properties.VariableNames,'Location','best')

График трассировки μ21 показывает периоды постоянных значений, во время которых потеря в предыдущих 1 000 окон наблюдения самое большее 0.05.

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

свернуть все

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

Фрагмент данных о предикторе, к которым модель является подходящей в виде n-by-Mdl.NumPredictors матрица с плавающей точкой.

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

  • Y содержит метку, с которой недавно сталкиваются, и максимальное количество классов было достигнуто ранее (см. MaxNumClasses и ClassNames аргументы incrementalClassificationNaiveBayes).

  • Типы данных Y и Mdl.ClassNames отличаются.

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

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

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

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

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

Примечание

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

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

свернуть все

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

Если ClassNames свойство входной модели Mdl пустой массив, fit устанавливает ClassNames свойство выходной модели Mdl к unique(Y). Если максимальное количество классов не достигнуто, fit добавляет к Mdl.ClassNames любые метки, с которыми недавно сталкиваются, в Y.

Советы

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

Алгоритмы

свернуть все

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

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

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

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

Введенный в R2021a