2017-01-30 2 views
1

У меня есть программа, которая готовит алгоритм с категориальным результатом 2 класса, а затем запускает и записывает предсказания (вероятности каждого из двух классов) для немаркированного набора данных.Правильная маркировка прогнозируемых классов при использовании библиотеки Java WEKA

Все наборы данных, запускаемые в отношении этой программы, будут иметь те же 2 класса, что и исход. Имея это в виде, я побежал предсказание и использовал немного статистики ретроспективной, чтобы выяснить, какой столбец результатов, описанных какой результат, и приступил к жесткому коду их:

public class runPredictions { 
public static void runPredictions(ArrayList al2) throws IOException, Exception{ 
    // Retrieve objects 
    Instances newTest = (Instances) al2.get(0); 
    Classifier clf = (Classifier) al2.get(1); 

    // Print status 
    System.out.println("Generating predictions..."); 

    // create copy 
    Instances labeled = new Instances(newTest); 

    BufferedWriter outFile = new BufferedWriter(new FileWriter("silverbullet_rro_output.csv")); 
    StringBuilder builder = new StringBuilder(); 

    builder.append("Prob_Retain"+","+"Prob_Attrite"+"\n"); 
    for (int i = 0; i < labeled.size(); i++)  
    { 
     double[] clsLabel = clf.distributionForInstance(newTest.instance(i)); 
     for(int j=0;j<2;j++){ 
      builder.append(clsLabel[j]+""); 
      if(j < clsLabel.length - 1) 
       builder.append(","); 
     } 
     builder.append("\n"); 
    } 
    outFile.write(builder.toString());//save the string representation 
    System.out.println("Output file written."); 
    System.out.println("Completed successfully!"); 
    outFile.close();  
}  
} 

Проблема с этим в том, что получается, что тот из двух столбцов описывает, какая из двух категорий результатов не фиксирована. Кажется, что это связано с тем, какая категория появляется сначала в наборе данных обучения, что совершенно произвольно. Поэтому, когда с этой программой были использованы другие наборы данных, жестко закодированные метки были обратными.

Итак, мне нужен лучший способ маркировать их, но, глядя на документацию для Classifier и distributionForInstance, и я не вижу ничего полезного.

Update:

Я понял, как напечатать его на экран (спасибо this), но по-прежнему были проблемы с записью в формате CSV:

for (int i = 0; i < labeled.size(); i++)  
    { 
     // Discreet prediction 
     double predictionIndex = 
      clf.classifyInstance(newTest.instance(i)); 

     // Get the predicted class label from the predictionIndex. 
     String predictedClassLabel = 
      newTest.classAttribute().value((int) predictionIndex); 

     // Get the prediction probability distribution. 
     double[] predictionDistribution = 
      clf.distributionForInstance(newTest.instance(i)); 

     // Print out the true predicted label, and the distribution 
     System.out.printf("%5d: predicted=%-10s, distribution=", 
          i, predictedClassLabel); 

     // Loop over all the prediction labels in the distribution. 
     for (int predictionDistributionIndex = 0; 
      predictionDistributionIndex < predictionDistribution.length; 
      predictionDistributionIndex++) 
     { 
      // Get this distribution index's class label. 
      String predictionDistributionIndexAsClassLabel = 
       newTest.classAttribute().value(
        predictionDistributionIndex); 

      // Get the probability. 
      double predictionProbability = 
       predictionDistribution[predictionDistributionIndex]; 

      System.out.printf("[%10s : %6.3f]", 
           predictionDistributionIndexAsClassLabel, 
           predictionProbability); 

      // Attempt to write to CSV 
      builder.append(i+","+predictedClassLabel+","+ 
        predictionDistributionIndexAsClassLabel+","+predictionProbability); 
          //.charAt(0)+','+predictionProbability.charAt(0)); 

     } 

     System.out.printf("\n"); 
     builder.append("\n"); 

ответ

1

Я приспособил этот код от этого answer и этого answer. В принципе, вы можете запросить данные теста для атрибута класса, а затем получить конкретное значение для каждого возможного класса.

for (int i = 0; i < labeled.size(); i++)  
{ 
// Discreet prediction 

double predictionIndex = 
    clf.classifyInstance(newTest.instance(i)); 

// Get the predicted class label from the predictionIndex. 
String predictedClassLabel = 
    newTest.classAttribute().value((int) predictionIndex); 

// Get the prediction probability distribution. 
double[] predictionDistribution = 
    clf.distributionForInstance(newTest.instance(i)); 

// Print out the true predicted label, and the distribution 
System.out.printf("%5d: predicted=%-10s, distribution=", 
        i, predictedClassLabel); 

// Loop over all the prediction labels in the distribution. 
for (int predictionDistributionIndex = 0; 
    predictionDistributionIndex < predictionDistribution.length; 
    predictionDistributionIndex++) 
{ 
    // Get this distribution index's class label. 
    String predictionDistributionIndexAsClassLabel = 
     newTest.classAttribute().value(
      predictionDistributionIndex); 

    // Get the probability. 
    double predictionProbability = 
     predictionDistribution[predictionDistributionIndex]; 

    System.out.printf("[%10s : %6.3f]", 
         predictionDistributionIndexAsClassLabel, 
         predictionProbability); 

    // Write to CSV 
    builder.append(i+","+ 
      predictionDistributionIndexAsClassLabel+","+predictionProbability); 


} 

System.out.printf("\n"); 
builder.append("\n"); 

} 


// Save results in .csv file 
outFile.write(builder.toString());//save the string representation 
+1

Вы абсолютно правы, что я должен быть другим индексом! Это просто пример, который вы оцениваете. Я исправлю – Walter

+0

Еще раз спасибо. Таким образом, цикл for для первой строки должен быть чем-то вроде 'for (int j = 0; j

+1

Я думаю, что может быть небольшая ошибка или отсутствующий компонент (см. Комментарий выше), но я получил это сейчас только в своей версии, и вы заслуживаете кредита, поэтому я собираюсь отредактировать свой пост с моей версией и отметить его как решение. Если вы хотите отменить редактирование, которое я собираюсь сделать, и просто настройте вашу версию, которая будет полностью крутой. Еще раз спасибо за вашу помощь, я очень благодарен! –

Смежные вопросы