Множественная классификация с использованием Liblinear в Accord.net Framework

Мне нужно реализовать классификатор множественной классификации с использованием Liblinear. Механизм машинного обучения Accord.net предоставляет все свойства Liblinear, кроме формулировки Краммера и Сингера для многоклассовой классификации. Это процесс.

1 ответ

Решение

Обычный способ изучения многоклассовой машины - использование класса MulticlassSupportVectorLearning. Этот класс может обучать машины "один против одного", к которым затем можно обращаться, используя стратегии голосования или исключения.

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

// Let's say we have the following data to be classified
// into three possible classes. Those are the samples:
// 
double[][] inputs =
{
    //               input         output
    new double[] { 0, 1, 1, 0 }, //  0 
    new double[] { 0, 1, 0, 0 }, //  0
    new double[] { 0, 0, 1, 0 }, //  0
    new double[] { 0, 1, 1, 0 }, //  0
    new double[] { 0, 1, 0, 0 }, //  0
    new double[] { 1, 0, 0, 0 }, //  1
    new double[] { 1, 0, 0, 0 }, //  1
    new double[] { 1, 0, 0, 1 }, //  1
    new double[] { 0, 0, 0, 1 }, //  1
    new double[] { 0, 0, 0, 1 }, //  1
    new double[] { 1, 1, 1, 1 }, //  2
    new double[] { 1, 0, 1, 1 }, //  2
    new double[] { 1, 1, 0, 1 }, //  2
    new double[] { 0, 1, 1, 1 }, //  2
    new double[] { 1, 1, 1, 1 }, //  2
};

int[] outputs = // those are the class labels
{
    0, 0, 0, 0, 0,
    1, 1, 1, 1, 1,
    2, 2, 2, 2, 2,
};

// Create a one-vs-one multi-class SVM learning algorithm 
var teacher = new MulticlassSupportVectorLearning<Linear>()
{
    // using LIBLINEAR's L2-loss SVC dual for each SVM
    Learner = (p) => new LinearDualCoordinateDescent()
    {
        Loss = Loss.L2
    }
};

// Learn a machine
var machine = teacher.Learn(inputs, outputs);

// Obtain class predictions for each sample
int[] predicted = machine.Decide(inputs);

// Compute classification accuracy
double acc = new GeneralConfusionMatrix(expected: outputs, predicted: predicted).Accuracy;

Вы также можете попытаться решить проблему мультикласса, используя стратегию "один против остальных". В этом случае вы можете использовать алгоритм обучения MultilabelSupportVectorLearning вместо мультикласса, показанного выше.

Другие вопросы по тегам