fit

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

Описание

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

Для подгонки или перекрестной проверки наивной модели классификации Байеса ко всему пакету данных сразу, см. fitcnb.

пример

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

пример

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

Примеры

свернуть все

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

Создайте инкрементальную наивную модель Байеса. Укажите, что максимальное количество ожидаемых классов составляет 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, отслеживаемая метрика эффективности включает ошибочную частоту ошибок классификации и размер окна метрики 1000. Подгонка сконфигурированной модели к первым 1000 наблюдениям.

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

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

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

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

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

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

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

  • Сохраните вероятность ошибки неправильной классификации и среднее значение первого предиктора во втором классе μ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 показывает периоды постоянных значений, в течение которых потеря в предыдущем окне наблюдения 1000 составляет самое большее 0,05.

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

свернуть все

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

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

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

  • 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, an incrementalClassificationNaiveBayes объект.

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

Совет

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

Алгоритмы

свернуть все

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

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

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

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

Введенный в R2021a