Main Content

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.

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.

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('DistributionNames','mn','MaxNumClasses',5,'MetricsWarmupPeriod',100) specifies that the joint conditional distribution of the predictor variables is multinomial, 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 c is the number of classes in the ClassNames property:

ValueDescription
c-by-c numeric matrix

Cost(i,j) is the cost of classifying an observation into class j when its true class is i, for classes ClassNames(i) and ClassNames(j). 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 one of the following alternatives:

  • An empty array [] when you specify MaxNumClasses

  • A c-by-c matrix when you specify ClassNames, 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

This property is read-only.

Categorical predictors list, specified as one of the values in this table.

ValueDescription
Vector of positive integers

Each entry in the vector is an index value corresponding to the column of the predictor data that contains a categorical variable. The index values are between 1 and NumPredictors.

Logical vectorA true entry means that the corresponding column of predictor data is a categorical variable. The length of the vector is NumPredictors.
"all"All predictors are categorical.

For the identified categorical predictors, incrementalClassificationNaiveBayes uses multivariate multinomial distributions. For more details, see DistributionNames.

By default, if you specify the DistributionNames option, all predictor variables corresponding to 'mvmn' are categorical. Otherwise, none of the predictor variables are categorical.

Example: 'CategoricalPredictors',[1 2 4] and 'CategoricalPredictors',[true true false true] specify that the first, second, and fourth of four predictor variables are categorical.

Data Types: single | double | logical

Levels of multivariate multinomial predictor variables, specified as a cell vector. The length of CategoricalLevels is equal to NumPredictors.

Incremental fitting functions fit and updateMetricsAndFit populate cells with the learned numeric categorical levels of each categorical predictor variable, while cells corresponding to other predictor variables contain an empty array []. Specifically, if predictor j is multivariate multinomial, CategoricalLevels{j} is a list of all distinct values of predictor j experienced during incremental fitting. For more details, see the DistributionNames property.

Note

Unlike fitcnb, incremental fitting functions order the levels of a predictor as the functions experience them during training. For example, suppose predictor j is categorical with multivariate multinomial distribution. The order of the levels in CategoricalLevels{j} and, consequently, the order of the level probabilities in each cell of DistributionParameters{:,j} returned by incremental fitting functions can differ from the order returned by fitcnb for the same training data set.

This property is read-only.

Cost of misclassifying an observation, specified as an array.

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

This property is read-only.

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

This property is read-only.

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

This property is read-only.

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

This property is read-only.

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

This property is read-only.

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 | string

Training Parameters

Predictor distributions P(x|ck), where ck is class ClassNames(k), specified as a character vector or string scalar, or a 1-by-NumPredictors string vector or cell vector of character vectors with values from the table.

ValueDescription
"mn"Multinomial distribution. If you specify "mn", then all features are components of a multinomial distribution (for example, a bag-of-tokens model). Therefore, you cannot include "mn" as an element of a string array or a cell array of character vectors. For details, see Estimated Probability for Multinomial Distribution.
"mvmn"Multivariate multinomial distribution. For details, see Estimated Probability for Multivariate Multinomial Distribution.
"normal"Normal distribution. For details, see Normal Distribution Estimators

If you specify a character vector or string scalar, then the software models all the features using that distribution. If you specify a 1-by-NumPredictors string vector or cell vector of character vectors, the software models feature j using the distribution in element j of the vector.

By default, the software sets all predictors specified as categorical predictors (see the CategoricalPredictors property) to 'mvmn'. Otherwise, the default distribution is 'normal'.

incrementalClassificationNaiveBayes stores the value as a character vector or cell vector of character vectors.

Example: 'DistributionNames',"mn" specifies that the joint conditional distribution of all predictor variables is multinomial.

Example: 'DistributionNames',["normal" "mvmn" "normal"] specifies that the first and third predictor variables are normally distributed and the second variable is categorical with a multivariate multinomial distribution.

Data Types: char | string | cell

This property is read-only.

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 ([]).

The elements of DistributionParameters depend on the distributions of the predictors. This table describes the values in DistributionParameters{k,j}.

Distribution of Predictor jValue of Cell Array for Predictor j and Class k
'mn'A scalar representing the probability that token j appears in class k. For details, see Estimated Probability for Multinomial Distribution.
'mvmn'A numeric vector containing the probabilities for each possible level of predictor j in class k. The software orders the probabilities by the sorted order of all unique levels of predictor j (stored in the property CategoricalLevels). For more details, see Estimated Probability for Multivariate Multinomial Distribution.
'normal'A 2-by-1 numeric vector. The first element is the weighted sample mean and the second element is the weighted sample standard deviation. For more details, see Normal Distribution Estimators.

Note

Unlike fitcnb, incremental fitting functions order the levels of a predictor as the functions experience them during training. For example, suppose predictor j is categorical with multivariate multinomial distribution. The order of the levels in CategoricalLevels{j} and, consequently, the order of the level probabilities in each cell of DistributionParameters{:,j} returned by incremental fitting functions can differ from the order returned by fitcnb for the same training data set.

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

This property is read-only.

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

This property is read-only.

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

This property is read-only.

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

fitTrain naive Bayes classification model for incremental learning
updateMetricsAndFitUpdate performance metrics in naive Bayes classification model for incremental learning given new data and train model
updateMetricsUpdate performance metrics in naive Bayes classification model for incremental learning given new data
logpLog unconditional probability density of naive Bayes classification model for incremental learning
lossLoss of naive Bayes classification model for incremental learning on batch of data
predictPredict 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 μ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 μ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 μ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 σ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 σ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')

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

The plot suggests that updateMetricsAndFit does the following:

  • Fit σ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 and Preprocess Data

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 μ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 μ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')

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

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

μ11 changes abruptly at first, then gradually levels off as fit processes more chunks.

More About

expand all

Algorithms

expand all

Compatibility Considerations

expand all

Behavior changed in R2021b

References

[1] Manning, Christopher D., Prabhakar Raghavan, and Hinrich Schütze. Introduction to Information Retrieval, NY: Cambridge University Press, 2008.

Introduced in R2021a