# incrementalClassificationNaiveBayes

Naive Bayes classification model for incremental learning

## Description

incrementalClassificationNaiveBayes creates an incrementalClassificationNaiveBayes model object, which represents a naive Bayes multiclass classification model for incremental learning. incrementalClassificationNaiveBayes supports normally distributed predictor variables.

Unlike other Statistics and Machine Learning Toolbox™ model objects, incrementalClassificationNaiveBayes can be called directly. Also, you can specify learning options such as performance metrics configurations and prior class probabilities before fitting the model to data. After you create an incrementalClassificationNaiveBayes object, it is prepared for incremental learning.

incrementalClassificationNaiveBayes is best suited for incremental learning. For a traditional approach to training a naive Bayes model for multiclass classification (such as creating a model by fitting it to data, performing cross-validation, tuning hyperparameters, and so on), see fitcnb.

## Creation

You can create an incrementalClassificationNaiveBayes model object in several ways:

• Call the function directly — Configure incremental learning options, or specify learner-specific options, by calling incrementalClassificationNaiveBayes directly. This approach is best when you do not have data yet or you want to start incremental learning immediately. You must specify the maximum number of classes or all class names expected in the response data during incremental learning.

• Convert a traditionally trained model — To initialize a naive Bayes classification model for incremental learning using the model parameters of a trained naive Bayes model object, you can convert the traditionally trained model to an incrementalClassificationNaiveBayes model object by passing it to the incrementalLearner function.

• Call an incremental learning functionfit, updateMetrics, and updateMetricsAndFit accept a configured incrementalClassificationNaiveBayes model object and data as input, and return an incrementalClassificationNaiveBayes model object updated with information learned from the input model and data.

### Syntax

Mdl = incrementalClassificationNaiveBayes('MaxNumClasses',MaxNumClasses)
Mdl = incrementalClassificationNaiveBayes('ClassNames',ClassNames)
Mdl = incrementalClassificationNaiveBayes(___,Name,Value)

### Description

example

Mdl = incrementalClassificationNaiveBayes('MaxNumClasses',MaxNumClasses) returns a default naive Bayes classification model object for incremental learning, Mdl, where MaxNumClasses is the maximum number of classes expected in the response data during incremental learning. Properties of a default model contain placeholders for unknown model parameters. You must train a default model before you can track its performance or generate predictions from it.

example

Mdl = incrementalClassificationNaiveBayes('ClassNames',ClassNames) specifies all class names ClassNames expected in the response data during incremental learning, and sets the ClassNames property.

example

Mdl = incrementalClassificationNaiveBayes(___,Name,Value) uses any of the input-argument combinations in the previous syntaxes to set properties and additional options using name-value pair arguments . Enclose each name in quotes. For example, incrementalClassificationNaiveBayes('MaxNumClasses',5,'MetricsWarmupPeriod',100) sets the maximum number of classes expected in the response data to 5, and sets the metrics warm-up period to 100.

### Input Arguments

expand all

Maximum number of classes expected in the response data during incremental learning, specified as a positive integer.

If you do not specify MaxNumClasses, you must specify the ClassNames argument. In that case, MaxNumClasses is the number of class names in ClassNames.

Example: 'MaxNumClasses',5

Data Types: single | double

All unique class labels expected in the response data during incremental learning, specified as a categorical or character array; logical, numeric, or string vector, or cell array of character vectors. ClassNames and the response data must have the same data type. ClassNames sets the ClassNames property.

ClassNames  specifies the order of any input or output argument dimension that corresponds to the class order. For example, set 'ClassNames' to specify the order of the dimensions of Cost or the column order of classification scores returned by predict

If you do not specify ClassNames, you must specify the MaxNumClasses argument. In that case, the software infers the MaxNumClasses ClassNames from the data during incremental learning.

Example: 'ClassNames',["virginica" "setosa" "versicolor"}

Data Types: single | double | logical | string | char | cell | categorical

Name-Value Pair Arguments

Specify optional comma-separated pairs of Name,Value arguments. Name is the argument name and Value is the corresponding value. Name must appear inside quotes. You can specify several name and value pair arguments in any order as Name1,Value1,...,NameN,ValueN.

Example: 'NumPredictors',4,'Prior',[0.3 0.3 0.4] specifies 4 variables in the predictor data and a prior class probability distribution of [0.3 0.3 0.4].

Cost of misclassifying an observation, specified as a value in this table, where are MaxNumClasses is the number of classes in the ClassNames property:

ValueDescription
MaxNumClasses-by-MaxNumClasses numeric matrix

Cost(i,j) is the cost of classifying an observation into class j when its true class is i. In other words, the rows correspond to the true class and the columns correspond to the predicted class. For example, Cost = [0 2;1 0] applies double the penalty for misclassifying ClassNames(1) than for misclassifying ClassNames(2).

Structure array

A structure array having two fields:

• ClassNames containing the class names, the same value as ClassNames

• ClassificationCosts containing the cost matrix, as previously described.

If you specify Cost, you must also specify the ClassNames argument. Cost sets the Cost property.

The default is a MaxNumClasses-by-MaxNumClasses matrix, where Cost(i,j) = 1 for all ij, and Cost(i,j) = 0 for all i = j.

Example: 'Cost',struct('ClassNames',{'b','g'},'ClassificationCosts',[0 2; 1 0])

Data Types: single | double | struct

Model performance metrics to track during incremental learning, in addition to minimal expected misclassification cost, specified as a built-in loss function name, string vector of names, function handle (@metricName), structure array of function handles, or cell vector of names, function handles, or structure arrays.

When Mdl is warm (see IsWarm), updateMetrics and updateMetricsAndFit track performance metrics in the Metrics property of Mdl.

The following table lists the built-in loss function names. You can specify more than one by using a string vector.

NameDescription
"binodeviance"Binomial deviance
"classiferror"Misclassification error rate
"exponential"Exponential
"hinge"Hinge
"logit"Logistic
'"mincost"

Minimal expected misclassification cost (for classification scores that are posterior probabilities). incrementalClassificationNaiveBayes always tracks this metric.

"quadratic"Quadratic

For more details on the built-in loss functions, see loss.

Example: 'Metrics',["classiferror" "logit"]

To specify a custom function that returns a performance metric, use function handle notation. The function must have this form:

metric = customMetric(C,S,Cost)

• The output argument metric is an n-by-1 numeric vector, where each element is the loss of the corresponding observation in the data processed by the incremental learning functions during a learning cycle.

• You select the function name (customMetric).

• C is an n-by-K logical matrix with rows indicating the class to which the corresponding observation belongs, where K is the number of classes. The column order corresponds to the class order in the ClassNames property. Create C by setting C(p,q) = 1, if observation p is in class q, for each observation in the specified data. Set the other element in row p to 0.

• S is an n-by-K numeric matrix of predicted classification scores. S is similar to the Posterior output of predict, where rows correspond to observations in the data and the column order corresponds to the class order in the ClassNames property. S(p,q) is the classification score of observation p being classified in class q.

• Cost is a K-by-K numeric matrix of misclassification costs. See the 'Cost' name-value argument.

To specify multiple custom metrics and assign a custom name to each, use a structure array. To specify a combination of built-in and custom metrics, use a cell vector.

Example: 'Metrics',struct('Metric1',@customMetric1,'Metric2',@customMetric2)

Example: 'Metrics',{@customMetric1 @customeMetric2 'logit' struct('Metric3',@customMetric3)}

updateMetrics and updateMetricsAndFit store specified metrics in a table in the Metrics property. The data type of Metrics determines the row names of the table.

'Metrics' Value Data TypeDescription of Metrics Property Row NameExample
String or character vectorName of corresponding built-in metricRow name for "classiferror" is "ClassificationError"
Structure arrayField nameRow name for struct('Metric1',@customMetric1) is "Metric1"
Function handle to function stored in a program fileName of functionRow name for @customMetric is "customMetric"
Anonymous functionCustomMetric_j, where j is metric j in MetricsRow name for @(C,S,Cost)customMetric(C,S,Cost)... is CustomMetric_1

For more details on performance metrics options, see Performance Metrics.

Data Types: char | string | struct | cell | function_handle

## Properties

expand all

You can set most properties by using name-value pair argument syntax only when you call incrementalClassificationNaiveBayes directly. You can set some properties when you call incrementalLearner to convert a traditionally trained model. You cannot set the properties DistributionParameters, IsWarm, and NumTrainingObservations.

## Classification Model Parameters

Cost of misclassifying an observation, specified as a MaxNumClasses-by-MaxNumClasses numeric matrix.

If you specify the 'Cost' name-value argument, its value sets Cost. If you specify a structure array, Cost is the value of the ClassificationCosts field.

If you convert a traditionally trained model to create Mdl, Cost is the Cost property of the traditionally trained model.

Data Types: single | double

All unique class labels expected in the response data during incremental learning, specified as a categorical or character array, logical or numeric vector, or cell array of character vectors.

• If you specify the MaxNumClasses argument, the software infers ClassNames during incremental learning.

• If you specify the ClassNames argument, incrementalClassificationNaiveBayes stores your specification in ClassNames. If you specify a string vector, incrementalClassificationNaiveBayes stores it as a cell array of character vectors instead.

• If you convert a traditionally trained model to create Mdl, ClassNames is the ClassNames property of the traditionally trained model.

Data Types: single | double | logical | char | cell | categorical

Number of predictor variables, specified as a nonnegative numeric scalar.

If you convert a traditionally trained model to create Mdl, NumPredictors is specified by the congruent property of the traditionally trained model. Otherwise, incremental fitting functions infer NumPredictors from the predictor data during training.

Data Types: double

Number of observations fit to the incremental model Mdl, specified as a nonnegative numeric scalar. NumTrainingObservations increases when you pass Mdl and training data to fit or updateMetricsAndFit.

Note

If you convert a traditionally trained model to create Mdl, incrementalClassificationNaiveBayes does not add the number of observations fit to the traditionally trained model to NumTrainingObservations.

Data Types: double

Prior class probabilities, specified as a value in this table. You can set this property using name-value pair argument syntax, but incrementalClassificationNaiveBayes always stores a numeric vector.

ValueDescription
'empirical'Incremental learning functions infer prior class probabilities from the observed class relative frequencies in the response data during incremental training.
'uniform'For each class, the prior probability is 1/K, where K is the number of classes.
numeric vectorCustom, normalized prior probabilities. The order of the elements of Prior corresponds to the elements of the ClassNames property.

• If you convert a traditionally trained model to create Mdl, incrementalClassificationNaiveBayes uses the Prior property of the traditionally trained model.

• Otherwise, Prior is 'empirical'.

Data Types: single | double

Score transformation function describing how incremental learning functions transform raw response values, specified as a character vector, string scalar, or function handle. incrementalClassificationNaiveBayes stores the specified value as a character vector or function handle.

This table describes the available built-in functions for score transformation.

ValueDescription
'doublelogit'1/(1 + e–2x)
'invlogit'log(x / (1 – x))
'ismax'Sets the score for the class with the largest score to 1, and sets the scores for all other classes to 0
'logit'1/(1 + ex)
'none' or 'identity'x (no transformation)
'sign'–1 for x < 0
0 for x = 0
1 for x > 0
'symmetric'2x – 1
'symmetricismax'Sets the score for the class with the largest score to 1, and sets the scores for all other classes to –1
'symmetriclogit'2/(1 + ex) – 1

For a MATLAB® function or a function that you define, enter its function handle; for example, 'ScoreTransform',@function, where:

• function accepts an n-by-K matrix (the original scores) and returns a matrix of the same size (the transformed scores).

• n is the number of observations, and row j of the matrix contains the class scores of observation j.

• K is the number of classes, and column k is class ClassNames(k).

If you convert a traditionally trained model to create Mdl, ScoreTransform is specified by the congruent property of the traditionally trained model.

The default 'none' specifies returning posterior class probabilities.

Data Types: char | function_handle

## Training Parameters

Predictor distributions, specified as 'normal' or a 1-by-NumPredictors cell array with all cells containing 'normal'. The conditional distribution P(xj|ck) is normal (Gaussian), for j = 1,…,NumPredictors and each kClassNames.

Data Types: char | string | cell

Distribution parameter estimates, specified as a cell array. DistributionParameters is a K-by-NumPredictors cell array, where K is the number of classes and cell (k,j) contains the distribution parameter estimates for instances of predictor j in class k. The order of the rows corresponds to the order of the classes in the property ClassNames, and the order of the columns corresponds to the order of the predictors in the predictor data.

If class k has no observations for predictor j, then DistributionParameters{k,j} is empty ([]).

Because all predictor distributions, specified by the DistributionNames property, are 'normal', each cell of DistributionParameters is a 2-by-1 numeric vector, where the first element is the sample mean and the second element is the sample standard deviation.

Data Types: cell

## Performance Metrics Parameters

Flag indicating whether the incremental model tracks performance metrics, specified as false or true.

The incremental model Mdl is warm (IsWarm becomes true) when incremental fitting functions perform both of the following actions:

• Fit the incremental model to MetricsWarmupPeriod observations.

• Process MaxNumClasses classes or all class names specified by the ClassNames name-value argument.

ValueDescription
trueThe incremental model Mdl is warm. Consequently, updateMetrics and updateMetricsAndFit track performance metrics in the Metrics property of Mdl.
falseupdateMetrics and updateMetricsAndFit do not track performance metrics.

Data Types: logical

Model performance metrics updated during incremental learning by updateMetrics and updateMetricsAndFit, specified as a table with two columns and m rows, where m is the number of metrics specified by the 'Metrics' name-value pair argument.

The columns of Metrics are labeled Cumulative and Window.

• Cumulative: Element j is the model performance, as measured by metric j, from the time the model became warm (IsWarm is 1).

• Window: Element j is the model performance, as measured by metric j, evaluated over all observations within the window specified by the MetricsWindowSize property. The software updates Window after it processes MetricsWindowSize observations.

Rows are labeled by the specified metrics. For details, see 'Metrics'.

Data Types: table

Number of observations the incremental model must be fit to before it tracks performance metrics in its Metrics property, specified as a nonnegative integer.

For more details, see Performance Metrics.

Data Types: single | double

Number of observations to use to compute window performance metrics, specified as a positive integer.

For more details on performance metrics options, see Performance Metrics.

Data Types: single | double

## Object Functions

 fit Train naive Bayes classification model for incremental learning updateMetricsAndFit Update performance metrics in naive Bayes classification model for incremental learning given new data and train model updateMetrics Update performance metrics in naive Bayes classification model for incremental learning given new data logp Log unconditional probability density of naive Bayes classification model for incremental learning loss Loss of naive Bayes classification model for incremental learning on batch of data predict Predict responses for new observations from naive Bayes classification model for incremental learning

## Examples

collapse all

To create a naive Bayes classification model for incremental learning, the least amount of information you must specify is the maximum number of classes that you expect the model to experience ('MaxNumClasses' name-value argument). As you fit the model to incoming batches of data by using an incremental fitting function, the model collects newly experienced classes in its ClassNames property. If the specified expected maximum number of classes is inaccurate, one of the following alternatives occurs:

• Before an incremental fitting function experiences the expected maximum number of classes, the model is cold. Consequently, the updateMetrics and updateMetricsAndFit functions do not measure performance metrics.

• If the number of classes exceeds the maximum expected, the incremental fitting function issues an error.

This example shows how to create a naive Bayes classification model for incremental learning when you know only the expected maximum number of classes in the data. Also, the example illustrates the consequences when incremental fitting functions experience all expected classes early and late in the sample.

For this example, consider training a device to predict whether a subject is sitting, standing, walking, running, or dancing based on biometric data measured on the subject. Therefore, the device has a maximum of 5 classes from which to choose.

Experience Expected Maximum Number of Classes Early in Sample

Create an incremental naive Bayes learner for multiclass learning. Specify a maximum of 5 classes in the data.

MdlEarly = incrementalClassificationNaiveBayes('MaxNumClasses',5)
MdlEarly = incrementalClassificationNaiveBayes IsWarm: 0 Metrics: [1×2 table] ClassNames: [1×0 double] ScoreTransform: 'none' DistributionNames: 'normal' DistributionParameters: {} Properties, Methods 

MdlEarly is an incrementalClassificationNaiveBayes model object. All its properties are read-only.

MdlEarly must be fit to data before you can use it to perform any other operations.

Load the human activity data set. Randomly shuffle the data.

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

For details on the data set, enter Description at the command line.

Fit the incremental model to the training data by using the updateMetricsAndfit function. Simulate a data stream by processing chunks of 50 observations at a time. At each iteration:

• Process 50 observations.

• Overwrite the previous incremental model with a new one fitted to the incoming observation.

• Store ${\mu }_{11}$ (the mean of the first predictor variable in the first class), the cumulative metrics, and the window metrics to see how they evolve during incremental learning.

% Preallocation numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); mc = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]); mu1 = zeros(nchunk,1); % Incremental learning for j = 1:nchunk ibegin = min(n,numObsPerChunk*(j-1) + 1); iend = min(n,numObsPerChunk*j); idx = ibegin:iend; MdlEarly = updateMetricsAndFit(MdlEarly,X(idx,:),Y(idx)); mc{j,:} = MdlEarly.Metrics{"MinimalCost",:}; mu1(j + 1) = MdlEarly.DistributionParameters{1,1}(1); end

MdlEarly is an incrementalClassificationNaiveBayes model object trained on all the data in the stream. During incremental learning and after the model is warmed up, updateMetricsAndFit checks the performance of the model on the incoming observation, and then fits the model to that observation.

To see how the performance metrics and ${\mu }_{11}$ evolved during training, plot them on separate subplots.

figure; subplot(2,1,1) plot(mu1) ylabel('\mu_{11}') xlim([0 nchunk]); subplot(2,1,2) h = plot(mc.Variables); xlim([0 nchunk]); ylabel('Minimal Cost') xline(MdlEarly.MetricsWarmupPeriod/numObsPerChunk,'r-.'); legend(h,mc.Properties.VariableNames) xlabel('Iteration')

The plot suggests that updateMetricsAndFit does the following:

• Fit ${\mu }_{11}$ during all incremental learning iterations

• Compute performance metrics after the metrics warm-up period only.

• Compute the cumulative metrics during each iteration.

• Compute the window metrics after processing 500 observations.

Experience Expected Maximum Number of Classes Late in Sample

Create a different naive Bayes model for incremental learning for the objective.

MdlLate = incrementalClassificationNaiveBayes('MaxNumClasses',5)
MdlLate = incrementalClassificationNaiveBayes IsWarm: 0 Metrics: [1×2 table] ClassNames: [1×0 double] ScoreTransform: 'none' DistributionNames: 'normal' DistributionParameters: {} Properties, Methods 

Move all observations labeled with class 5 to the end of the sample.

idx5 = Y == 5; Xnew = [X(~idx5,:); X(idx5,:)]; Ynew = [Y(~idx5) ;Y(idx5)];

Fit the incremental model and plot results, as performed previously.

mcnew = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]); mu1new = zeros(nchunk,1); for j = 1:nchunk ibegin = min(n,numObsPerChunk*(j-1) + 1); iend = min(n,numObsPerChunk*j); idx = ibegin:iend; MdlLate = updateMetricsAndFit(MdlLate,Xnew(idx,:),Ynew(idx)); mcnew{j,:} = MdlLate.Metrics{"MinimalCost",:}; mu1new(j + 1) = MdlLate.DistributionParameters{1,1}(1); end figure; subplot(2,1,1) plot(mu1new) ylabel('\mu_{11}') xlim([0 nchunk]); subplot(2,1,2) h = plot(mcnew.Variables); xlim([0 nchunk]); ylabel('Minimal Cost') xline(MdlLate.MetricsWarmupPeriod/numObsPerChunk,'r-.'); xline(sum(~idx5)/numObsPerChunk,'g-.'); legend(h,mcnew.Properties.VariableNames,'Location','best') xlabel('Iteration')

The updateMetricsAndFit function trains throughout incremental learning, but the function starts tracking performance metrics after the model has been fit to all expected number of classes (the green vertical line in the bottom subplot).

This example shows how to create an incremental naive Bayes learner when you know all the class names in the data.

Consider training a device to predict whether a subject is sitting, standing, walking, running, or dancing based on biometric data measured on the subject, and you know the class names map 1 through 5 to an activity.

Create an incremental naive Bayes learner for multiclass learning. Specify the class names.

classnames = 1:5; Mdl = incrementalClassificationNaiveBayes('ClassNames',classnames)
Mdl = incrementalClassificationNaiveBayes IsWarm: 0 Metrics: [1x2 table] ClassNames: [1 2 3 4 5] ScoreTransform: 'none' DistributionNames: 'normal' DistributionParameters: {5x0 cell} Properties, Methods 

Mdl is an incrementalClassificationNaiveBayes model object. All its properties are read-only.

Mdl must be fit to data before you can use it to perform any other operations.

Load the human activity data set. Randomly shuffle the data.

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

For details on the data set, enter Description at the command line.

Fit the incremental model to the training data by using the updateMetricsAndfit function. Simulate a data stream by processing chunks of 50 observations at a time. At each iteration:

• Process 50 observations.

• Overwrite the previous incremental model with a new one fitted to the incoming observation.

% Preallocation numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); % Incremental learning for j = 1:nchunk ibegin = min(n,numObsPerChunk*(j-1) + 1); iend = min(n,numObsPerChunk*j); idx = ibegin:iend; Mdl = updateMetricsAndFit(Mdl,X(idx,:),Y(idx)); end

In addition to specifying the maximum number of class names, prepare an incremental naive Bayes learner by specifying a metrics warm-up period, during which the updateMetricsAndFit function only fits the model. Specify a metrics window size of 500 observations.

Load the human activity data set. Randomly shuffle the data.

load humanactivity n = numel(actid); idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);

For details on the data set, enter Description at the command line.

Create an incremental linear model for binary classification. Configure the model as follows:

• Specify a metrics warm-up period of 5000 observations.

• Specify a metrics window size of 500 observations.

• Track the classification error and minimal cost to measure the performance of the model.

Mdl = incrementalClassificationNaiveBayes('MaxNumClasses',5,'MetricsWarmupPeriod',5000,... 'MetricsWindowSize',500,'Metrics',["classiferror" "mincost"])
Mdl = incrementalClassificationNaiveBayes IsWarm: 0 Metrics: [2x2 table] ClassNames: [1x0 double] ScoreTransform: 'none' DistributionNames: 'normal' DistributionParameters: {} Properties, Methods 

Mdl is an incrementalClassificationNaiveBayes model object configured for incremental learning.

Fit the incremental model to the rest of the data by using the updateMetricsAndfit function. At each iteration:

• Simulate a data stream by processing a chunk of 50 observations.

• Overwrite the previous incremental model with a new one fitted to the incoming observation.

• Store ${\sigma }_{11}$ (the standard deviation of the first predictor variable in the first class), the cumulative metrics, and the window metrics to see how they evolve during incremental learning.

% Preallocation numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); ce = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]); mc = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]); sigma11 = 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 = updateMetricsAndFit(Mdl,X(idx,:),Y(idx)); ce{j,:} = Mdl.Metrics{"ClassificationError",:}; mc{j,:} = Mdl.Metrics{"MinimalCost",:}; sigma11(j + 1) = Mdl.DistributionParameters{1,1}(2); end

IncrementalMdl is an incrementalClassificationNaiveBayes model object trained on all the data in the stream. During incremental learning and after the model is warmed up, updateMetricsAndFit checks the performance of the model on the incoming observation, and then fits the model to that observation.

To see how the performance metrics and ${\sigma }_{11}$ evolved during training, plot them on separate subplots.

figure; subplot(2,2,1) plot(sigma11) ylabel('\sigma_{11}') xlim([0 nchunk]); xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,'r-.'); xlabel('Iteration') subplot(2,2,2) h = plot(ce.Variables); xlim([0 nchunk]); ylabel('Classification Error') xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,'r-.'); legend(h,ce.Properties.VariableNames) xlabel('Iteration') subplot(2,2,3) h = plot(mc.Variables); xlim([0 nchunk]); ylabel('Minimal Cost') xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,'r-.'); legend(h,mc.Properties.VariableNames) xlabel('Iteration')

The plot suggests that updateMetricsAndFit does the following:

• Fit ${\sigma }_{11}$ during all incremental learning iterations

• Compute performance metrics after the metrics warm-up period only.

• Compute the cumulative metrics during each iteration.

• Compute the window metrics after processing 500 observations (10 iterations).

Train a naive Bayes model for multiclass classification by using fitcnb, convert it to an incremental learner, track its performance, and fit it to streaming data. Carry over training options from traditional to incremental learning.

Load the human activity data set. Randomly shuffle the data.

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

For details on the data set, enter Description at the command line.

Suppose that the data collected when the subject was idle (Y > 2) has double the quality than when the subject was moving. Create a weight variable that attributes 2 to observations collected from an idle subject, and 1 to a moving subject.

W = ones(n,1) + (Y < 3);

Train Naive Bayes Model

Fit a naive Bayes model for multiclass classification to a random sample of half the data.

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: {1x60 cell} DistributionParameters: {5x60 cell} Properties, Methods 

TTMdl is a ClassificationNaiveBayes model object representing a traditionally trained naive Bayes model.

Convert Trained Model

Convert the traditionally trained naive Bayes model to a naive Bayes classification model for incremental learning.

IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = incrementalClassificationNaiveBayes IsWarm: 1 Metrics: [1x2 table] ClassNames: [1 2 3 4 5] ScoreTransform: 'none' DistributionNames: {1x60 cell} DistributionParameters: {5x60 cell} Properties, Methods 

Separately Track Performance Metrics and Fit Model

Perform incremental learning on the rest of the data by using the updateMetrics and fit functions. Simulate a data stream by processing 50 observations at a time. At each iteration:

1. Call updateMetrics to update the cumulative and window classification error of the model given the incoming chunk of observations. Overwrite the previous incremental model to update the losses in the Metrics property. Note that the function does not fit the model to the chunk of data—the chunk is "new" data for the model. Specify the observation weights.

2. Call fit to fit the model to the incoming chunk of observations. Overwrite the previous incremental model to update the model parameters. Specify the observation weights.

3. Store the minimal cost and mean of the first predictor variable of the first class ${\mu }_{11}$.

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

IncrementalMdl is an incrementalClassificationNaiveBayes model object trained on all the data in the stream.

Alternatively, you can use updateMetricsAndFit to update performance metrics of the model given a new chunk of data, and then fit the model to the data.

Plot a trace plot of the performance metrics and estimated coefficient ${\mu }_{11}$.

figure; subplot(2,1,1) h = plot(mc.Variables); xlim([0 nchunk]); ylabel('Minimal Cost') legend(h,mc.Properties.VariableNames) subplot(2,1,2) plot(mu11) ylabel('\mu_11') xlim([0 nchunk]); xlabel('Iteration')

The cumulative loss is stable and decreases gradually, whereas the window loss jumps.

${\mu }_{11}$ changes abruptly at first, then gradually levels off as fit processes more chunks.

expand all

## Algorithms

expand all

Introduced in R2021a