Я написал программу на Java с использованием библиотеки WEKA, чтоИзменение Java код, который записывает двойной CSV записать двойной [] в CSV (использование прецедентного = библиотека ВЕКА)
- тренирует алгоритм классификации
- прогонов прогнозы на немеченом наборе данных с использованием обученного алгоритма
- выписывает результаты в файл .csv
проблема заключаются в том, что она в данный момент записывает результаты дискретной классификации (т.е. whic h, алгоритм догадывается, что строка попадает в). Я хочу записать вероятность данного класса (например, если я классифицирую строки как «спам» или «не спам», тогда я хочу, чтобы вероятность спама была результатом).
Я понимаю, что для этого мне нужно использовать distributionForInstance
вместо classifyInstance
в моем коде. От WEKA:
Если вы заинтересованы в распределении по всем классам, используйте метод distributionForInstance (Instance). Этот метод возвращает двойной массив с вероятностью для каждого класса.
Проблема Я бегу в том, что с classifyInstance
я имел дело с типом данных double
и distributionForInstance
Я имею дело с типом double[]
данных и, видимо, не подстраиваясь мой код правильно.
Вот рабочий код, который выписывает осторожные прогнозы:
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);
// label instances
for (int i = 0; i < newTest.numInstances(); i++) {
double clsLabel = clf.classifyInstance(newTest.instance(i));
labeled.instance(i).setClassValue(clsLabel);
}
System.out.println("Predictions complete! Writing output file to csv...");
BufferedWriter outFile = new BufferedWriter(new FileWriter("C:/Users/hackr/Desktop/silverbullet_output.csv"));
for (int i = 0; i < labeled.size(); i++)
{
outFile.write(labeled.get(i).toString());
outFile.write("\n");
}
System.out.println("Output file written.");
System.out.println("Completed successfully!");
outFile.close();
}
}
Сейчас код я работаю имеет следующее:
и бросает
Индекс за пределами
погрешность.
Я также переместил создание clsLabel
, потому что, видимо, он больше не мог найти символ, когда тип данных изменился, если только я не переместил его в цикл for
.
на основе беглого взгляда, его можно индексы не выстраиваются в очередь, так что' i' может причинить вам выйти за пределы. Функция возвращает массив результатов, а не один результат, хранящийся в индексе 'i'. Вам нужно будет пройти через результирующий набор, чтобы получить то, что вы ожидаете. 'for (double d: clsLabel) {write (Double.toString (d))}' – Brendan
@HackR (ну, он обрезает ваше имя при использовании «-»). Возможно, это не все, но я считаю, что это начало. Если это сработает, я переведу свой комментарий как ответ. – Brendan
@Brendan Update - да, это полностью сработало! :) Спасибо –