weka - как печатать неправильно классифицированные экземпляры - PullRequest
5 голосов
/ 19 октября 2011

мой вывод 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());
}

Ответы [ 2 ]

1 голос
/ 05 декабря 2015

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

Что я сделал, так это то, что в Evaluation есть предсказания метод, который возвращает 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);;

        }

    }

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

1 голос
/ 19 октября 2011

Я делаю это так:

  1. Классификатор поезда.
  2. Для каждого экземпляра я называю 'classifier.explain'
  3. Если классификация неверна, я сохраняю ихпо неверной вероятности (от худшей ошибки до наименее достоверной ошибки)
  4. Наиболее достоверная ошибка дает мне представление о том, какие функции следует добавить в классификатор.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...