weka — как печатать неправильно классифицированные экземпляры

мой вывод weka показывает:

Correctly Classified Instances       32083               94.0244 %
Incorrectly Classified Instances      2039                5.9756 %

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

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

Есть ли у кого-нибудь предложение о том, как распечатать ошибочно классифицированные экземпляры?

Спасибо большое.

private void printSummary(Classifier base, Evaluation eval, Instances data) throws Exception
{
    // output evaluation
    System.out.println();
    System.out.println("=== Setup ===");
    System.out.println("Classifier: " + classifierName.getClass().getName() + " " + Utils.joinOptions(base.getOptions()));
    System.out.println("Dataset: " + data.relationName());
    System.out.println();

    // output predictions
    System.out.println("# - actual - predicted - error - distribution - token");
    for (int i = 0; i < data.numInstances(); i++) 
    {
        double pred = base.classifyInstance(data.instance(i));
        double actual = data.instance(i).classValue();
        double[] dist = base.distributionForInstance(data.instance(i));

        if (pred != actual)
        {
            System.out.print((i+1));
            System.out.print(" - ");
            System.out.print(data.instance(i).toString(data.classIndex()));
            System.out.print(" - ");
            System.out.print(data.classAttribute().value((int) pred));
            System.out.print(" - ");
            if (pred != data.instance(i).classValue())
                System.out.print("yes");
            else
                System.out.print("no");
            System.out.print(" - ");
            System.out.print(Utils.arrayToString(dist));
            System.out.print(" - ");
            data.instance(i).enumerateAttributes().toString();
            System.out.println();
        }
    }

    System.out.println(eval.toSummaryString());
    System.out.println(eval.toClassDetailsString());
    System.out.println(eval.toMatrixString());
}

person britt    schedule 18.10.2011    source источник
comment
я только что понял, что он пуст, потому что я забыл обернуть его в оператор печати.   -  person britt    schedule 19.10.2011
comment
к сожалению, добавление его в оператор печати или повторение значений перечисления просто показывает мне все возможные значения всех атрибутов. на самом деле это не говорит мне, какие значения атрибутов были для моих неправильно классифицированных экземпляров. любая помощь приветствуется.   -  person britt    schedule 19.10.2011
comment
Я так понимаю, Weka выводит из Weka Explorer? Если это так, то эти результаты предназначены для перекрестной проверки, и вы, скорее всего, делаете тесты каким-то другим способом. Прежде чем погрузиться в код, можете ли вы провести простой тест — добавить предложение else к вашему if и подсчитать, сколько экземпляров на самом деле классифицировано правильно (pred == actual)?   -  person ffriend    schedule 19.10.2011


Ответы (2)


Я делаю так:

  1. Классификатор поездов.
  2. Для каждого экземпляра я вызываю «classifier.explain»
  3. Если классификация неверна, я сохраняю их по неправильной вероятности (от наихудшей ошибки до наименее достоверной ошибки).
  4. Самая уверенная ошибка дает мне представление о том, какие функции следует добавить в классификатор.
person yura    schedule 19.10.2011
comment
Я не вижу доступного метода classifier.explain. Тем не менее, ваш комментарий помог мне кое-что указать. Раньше я использовал объект eval для вывода сводных данных и матрицы путаницы, но я также вызывал classifier.classifyInstance. важным отличием было то, что данные eval были основаны на 10-кратной перекрестной проверке, а экземпляр classify пытался снова классифицировать экземпляр с помощью обученного классификатора. - person britt; 19.10.2011
comment
я смог получить необходимую печать, просто напечатав экземпляр следующим образом: System.out.print(data.instance(i)); - person britt; 19.10.2011
comment
Извините, в weka это double[] distributionForInstance(Instance instance) Predicts the class memberships for a given instance., но он хорошо работает не для всех классификаторов, для байесов и деревьев он всегда возвращает 1,0. Это хорошо для LibSVM и Logistic и некоторых других, которые поддерживают вероятности прогнозирования, - person yura; 20.10.2011

Это старый пост, но у меня была та же проблема, и я решил ее по-другому. Может быть, кому-то вроде меня это понадобится.

Что я сделал, так это то, что Evaluation имеет метод predictions, который возвращает ArrayList объекта прогнозирования.

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

Мой код:

ArrayList<Prediction> predictions = evaluation.predictions();
for (int i = 0, trainDataSize = trainData.size(); i < trainDataSize; i++) {
        Instance instance = trainData.get(i);
        Prediction prediction = predictions.get(i);

        if (prediction.actual() != prediction.predicted()) {

            System.out.println(instance);;

        }

    }

Надеюсь, это поможет кому-то.

person danny11    schedule 05.12.2015