В weka, использующей Java, как я могу сопоставить экземпляры со строковым идентификатором с прогнозами из оценки после перекрестной проверки?

#java #weka

#java #weka

Вопрос:

Причина, по которой я хочу это сделать, заключается в том, что у меня есть дополнительный набор данных с нумерованными файлами (назовем его dataset ‘numberedFiles’ dataset), которые соответствуют идентификаторам строк в экземплярах, и я хочу использовать метки прогнозирования в качестве фильтров для получения подмножества набора данных numberedFiles. Просто чтобы предоставить больше контекста, я хочу сегментировать ложноположительные и ложноотрицательные результаты отдельно (это двоичная классификация с метками «да» и «нет»).

Следовательно, теоретический рабочий процесс будет таким:

1) загрузите файл .arff в java, настройте FilteredClassifier с фильтром RemoveType для идентификатора строки.

2) Используйте класс оценки для выполнения перекрестной проверки.

3) Каким-то образом получить доступ к экземплярам с их новыми метками прогнозирования.

4) Зациклите все экземпляры с их новой меткой прогнозирования. Если прогноз == ‘нет’ и фактический == ‘да’, запишите строковый идентификатор, связанный с образцом, в текстовый файл для получения ложноотрицательных результатов. Если прогноз ==’yes’ и фактический ==’no’, запишите строковый идентификатор, связанный с образцом, в текстовый файл на случай ложных срабатываний.

Как вы можете видеть, проблема связана с шагом 3. Пока я могу использовать только ‘eval.predictions()’ для получения быстрого вектора элементов nominal prediction’а. Эти элементы содержат прогнозируемую метку, фактическую метку, вес, распределение. НО они не содержат никакой информации о функциях, связанных с экземпляром (а именно, о строковом идентификаторе, который мне нужен). Я знаю, что в проводнике weka вы можете заставить его выводить дополнительные атрибуты каждого экземпляра (строковый идентификатор, который мне нужен в этом случае), но я не могу понять, как получить к этому доступ в java.

Кстати, вот фрагмент кода для справки

     Instances trainingData = DataSource.read("my_data_file.arff");
    trainingData.setClassIndex(trainingData.numAttributes()-1);

    // build classifier
    J48 classifier = new J48();

    RemoveType removeID = new RemoveType();
    removeID.setAttributeType(new SelectedTag("Delete string attributes", RemoveType.TAGS_ATTRIBUTETYPE));

    FilteredClassifier meta = new FilteredClassifier();
    meta.setClassifier(classifier);
    meta.setFilter(removeID);

    Evaluation eval = new Evaluation(trainingData);
    Random r = new Random(1);
    // 10-fold
    eval.crossValidateModel(meta, trainingData, 10, r);
    System.out.println(eval.toSummaryString("=== Cross-Validation Summary ===n", false));
    System.out.println(eval.toClassDetailsString("=== Detailed Accuracy By Class ===n"));
    System.out.println(eval.toMatrixString("=== Confusion Matrix ===n"));
    FastVector predictions = eval.predictions();
  

Ответ №1:

Извините, но я не уверен, что полностью понимаю ваши потребности, особенно когда вы говорите об идентификаторе строки. RemoveType предназначен для удаления всех атрибутов указанного типа, поэтому, если вы укажете «string», вы не получите никакой строки после этого. Насколько я понимаю, вам лучше использовать RemoveWithValues.

Если вы хотите получить доступ к полным атрибутам / функциям набора данных при прогнозировании, вам следует использовать не оценку, а стандартный код weka для классификации. Пожалуйста, посмотрите на «Классификацию экземпляров» здесь: http://weka.wikispaces.com/Use Weka in your Java code