У меня есть программа, которая готовит алгоритм с категориальным результатом 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");
Вы абсолютно правы, что я должен быть другим индексом! Это просто пример, который вы оцениваете. Я исправлю – Walter
Еще раз спасибо. Таким образом, цикл for для первой строки должен быть чем-то вроде 'for (int j = 0; j
Я думаю, что может быть небольшая ошибка или отсутствующий компонент (см. Комментарий выше), но я получил это сейчас только в своей версии, и вы заслуживаете кредита, поэтому я собираюсь отредактировать свой пост с моей версией и отметить его как решение. Если вы хотите отменить редактирование, которое я собираюсь сделать, и просто настройте вашу версию, которая будет полностью крутой. Еще раз спасибо за вашу помощь, я очень благодарен! –