Sourabh Jain
Sourabh Jain

Reputation: 31

accord.net svm incremental training

I am using SVM in Accord.net for time series modeling. I train it once with available data (say 5000). After that, I get new data every second, I want to update my SVM machine in incremental fashion using one data every second, is that possible?

Upvotes: 1

Views: 571

Answers (1)

Cesar
Cesar

Reputation: 2118

While it is now possible to learn SVMs incrementally in Accord.NET, this functionality is unfortunately only available for linear machines. Since you are working with time series, I am assuming you are working with a kernel SVM using the Dynamic Time Warping kernel.

If you are able to extract fixed-length features from your sequences, then what you ask may be possible if you feed those features to a linear machine instead and train it using Stochastic Gradient Descent or Averaged Stochastic Gradient Descent, as shown below:

// In this example, we will learn a multi-class SVM using the one-vs-one (OvO)
// approach. The OvO approacbh can decompose decision problems involving multiple 
// classes into a series of binary ones, which can then be solved using SVMs.

// Ensure we have reproducible results
Accord.Math.Random.Generator.Seed = 0;

// We will try to learn a classifier
// for the Fisher Iris Flower dataset
var iris = new Iris();
double[][] inputs = iris.Instances; // get the flower characteristics
int[] outputs = iris.ClassLabels;   // get the expected flower classes

// We will use mini-batches of size 32 to learn a SVM using SGD
var batches = MiniBatches.Create(batchSize: 32, maxIterations: 1000,
   shuffle: ShuffleMethod.EveryEpoch, input: inputs, output: outputs);

// Now, we can create a multi-class teaching algorithm for the SVMs
var teacher = new MulticlassSupportVectorLearning<Linear, double[]>
{
    // We will use SGD to learn each of the binary problems in the multi-class problem
    Learner = (p) => new StochasticGradientDescent<Linear, double[], LogisticLoss>()
    {
        LearningRate = 1e-3, 
        MaxIterations = 1 // so the gradient is only updated once after each mini-batch
    }
};

// The following line is only needed to ensure reproducible results. Please remove it to enable full parallelization
teacher.ParallelOptions.MaxDegreeOfParallelism = 1; // (Remove, comment, or change this line to enable full parallelism)

// Now, we can start training the model on mini-batches:
foreach (var batch in batches)
{
    teacher.Learn(batch.Inputs, batch.Outputs);
}

// Get the final model:
var svm = teacher.Model;

// Now, we should be able to use the model to predict 
// the classes of all flowers in Fisher's Iris dataset:
int[] prediction = svm.Decide(inputs);

// And from those predictions, we can compute the model accuracy:
var cm = new GeneralConfusionMatrix(expected: outputs, predicted: prediction);
double accuracy = cm.Accuracy; // should be approximately 0.973

Upvotes: 1

Related Questions