2013-10-12 1 views
0

Задача: У меня есть определенный набор данных, которые нужно классифицировать - Полезно (1)/Бесполезно (0). Я предоставил полный набор данных в качестве входных данных для целей обучения классификатора. и тест с различными наборами данных.libsvm классификация - на плохом этапе до сих пор

Для этого я пытаюсь преобразовать свои данные в формат LIBSVM. прежде чем что-либо делать, я подумал о предоставлении числового ввода одного вектора и проверить результат.

Вход:

Обучение: 1 1 2 (первый 1 указывает, полезный класс в этом векторе следуют цифровой вход) Тестирование: 1 1 2 (Я не уверен, что формат входных данных)

Выход:

(0: 0,9982708183417436) (1: 0,0017291816582564153) (Actual: 1,0 Прогноз: 0,0)

Я не имею класс 0 в обучающем наборе, но она probEstimated для класса 0.

Я не уверен, как преобразовать данные в числовой векторный ввод и получить данные из набора числовых тестовых данных в эквивалентные данные, как указано. ЛЮБАЯ ПОМОЩЬ В ЭТОМ РЕГАРДЕ ВЫСОКО ПРИЗНАНА.

Запланированные задания: 1. Загрузите все данные в таблицы Hash и получите ключи для сохранения в наборах данных с соответствующим классификатором - ПОЛЕЗНО (1). 2. Поставьте набор данных в svmTrain и получите модель. 3. Подготовьте набор тестовых данных (преобразуйте каждое слово/фразу в соответствующее числовое значение сохраненного набора тренировок, если оно найдено. Else, назначьте новое значение). 4. Поставьте тестовый набор и модель в метод EVALUATE SVM. 5. Получите результирующие векторы из класса USEFUL и перегруппируйте их с данными.

Код: используется для разных источников.

общественного класса Datatosvmformat {

static double[][] train = new double[1000][3]; 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    HashMap<String, Integer> dataSet = new HashMap<String, Integer>(); 

    double[][] test = new double[10][3]; 

    train[1][0] = 1; 
    train[1][1] = 1; 
    train[1][2] = 2; 

    svm_model model = svmTrain(); 
      //Test Data Set 
    double[] test1 = new double[3]; 
    test1[0] = 1; 
    test1[1] = 1; 
    test1[2] = 2; 
    evaluate(test1,model); 

    } 

    private static svm_model svmTrain() { 
     svm_problem prob = new svm_problem(); 
     int dataCount = train.length; 
     prob.y = new double[dataCount]; 
     prob.l = dataCount; 
     prob.x = new svm_node[dataCount][];  

     for (int i = 0; i <dataCount; i++){    
      double[] features = train[i]; 
      //ystem.out.println("Features "+features[i]); 
      prob.x[i] = new svm_node[features.length-1]; 
      for (int j = 1; j < features.length; j++){ 
       svm_node node = new svm_node(); 
       node.index = j; 
       node.value = features[j]; 
       prob.x[i][j-1] = node; 
      }   
      prob.y[i] = features[0]; 

     }    

     svm_parameter param = new svm_parameter(); 
     param.probability = 1; 
     param.gamma = 0.5; 
     param.nu = 0.5; 
     param.C = 1; 
     param.svm_type = svm_parameter.C_SVC; 
     param.kernel_type = svm_parameter.LINEAR;  
     param.cache_size = 20000; 
     param.eps = 0.001;  

     svm_model model = svm.svm_train(prob, param); 

     return model; 
    } 

    public static double evaluate(double[] features, svm_model model) 
    { 
     svm_node[] nodes = new svm_node[features.length-1]; 
     for (int i = 1; i < features.length; i++) 
     { 
      svm_node node = new svm_node(); 
      node.index = i; 
      node.value = features[i]; 

      nodes[i-1] = node; 
     } 

     int totalClasses = 2;  
     int[] labels = new int[totalClasses]; 
     svm.svm_get_labels(model,labels); 

     double[] prob_estimates = new double[totalClasses]; 
     double v = svm.svm_predict_probability(model, nodes, prob_estimates); 

     for (int i = 0; i < totalClasses; i++){ 
      System.out.print("(" + labels[i] + ":" + prob_estimates[i] + ")"); 
     } 
     System.out.println("(Actual:" + features[0] + " Prediction:" + v + ")"); 
     return v; 
    } 


} 

ответ

0

Я не совсем уверен, но эта проблема может быть связана с тем, что вам нужно отметить положительные примеры с +1 и отрицательных примеров с -1.

В противном случае программа может libsvm asssign в arbitraty класс (например, 0) к обучающему вектору 1 1 2, так как iterprets первого эля из вектора признаков в качестве значения признака (а не класс этикетки).

Так что попробуйте изменить метку класса 1 в +1 для положительных примеров (и -1 для отрицательных примеров).

Как правило, для формата данных для libsvm заключается в следующем:

<label> <index1>:<value1> <index2>:<value2> 

где:

  • метка является метка класса (например, + 1/-1)
  • indexN является функция Id (то есть номер, который идентифицировал определенную функцию)
  • valueN - значение функции (то есть значение, присвоенное указанной функции: 0/1 для двоичных функций или 0,1,2, ...для категориальных признаков)

Пример формата данных, принятого инструмента libsvm можно найти на этой странице: LIBSVM Data: Classification (Binary Class)

Есть много наборов данных, которые вы можете изучить, чтобы понять формат данных, принятый с помощью инструмента libsvm.

+0

Спасибо за ответ, получили определенную ясность. Спасибо. – user1830284