Множественная классификация с использованием 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 вместо мультикласса, показанного выше.