2011-10-18 31 views
5

WEKA tôi ra chương trình:WEKA - làm thế nào để in không đúng trường hợp được phân loại

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

Tôi muốn để có thể in ra những gì các trường hợp không chính xác là vì vậy tôi có thể thực hiện điều chỉnh và hiểu lý do tại sao họ đã phân loại sai.

phương thức in của tôi ở bên dưới.
Tôi đang cố gắng tìm các trường hợp có giá trị lớp được dự đoán không bằng với giá trị lớp thực tế và sau đó in các thuộc tính của nó.
nhưng khi tôi thực hiện điều này, việc liệt kê thuộc tính không in được gì.

Có ai có đề xuất về cách in ra các phiên bản được phân loại sai không?

cảm ơn nhiều.

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()); 
} 
+0

tôi chỉ nhận ra rằng nó trống vì tôi quên bọc nó trong một bản in. – britt

+0

không may thêm nó vào lệnh in hoặc lặp qua các giá trị của enum chỉ cho tôi thấy tất cả các giá trị có thể có của tất cả các thuộc tính. nó không thực sự cho tôi biết giá trị attrib là gì đối với các trường hợp bị phân loại sai của tôi. Bất kỳ trợ giúp nào cũng được đánh giá rất cao. – britt

+0

Tôi hiểu, "Weka đầu ra" là từ Weka Explorer? Nếu vậy, các kết quả này là để xác thực chéo, và bạn hầu hết có thể thực hiện các thử nghiệm theo một cách khác. Trước khi đi sâu vào mã, bạn có thể thực hiện một phép thử đơn giản hay không - thêm mệnh đề 'else' vào' if' của bạn và đếm số thực thể được phân loại chính xác ('pred == actual')? – ffriend

Trả lời

1

Tôi làm điều này theo cách đó:

  1. Train phân loại.
  2. Đối với mỗi trường hợp tôi gọi là 'classifier.explain'
  3. Nếu phân loại là không chính xác tôi lưu trữ chúng bằng khả năng không chính xác (từ lỗi tồi tệ nhất để lỗi nhất tự tin)
  4. lỗi cách tự tin nhất cho tôi ý tưởng những tính năng nên được thêm vào phân loại.
+0

Tôi không thấy phương thức classifier.explain. Bình luận của bạn đã giúp chỉ ra một cái gì đó cho tôi mặc dù. Trước đây tôi đã sử dụng đối tượng eval để in ra dữ liệu tóm tắt và ma trận nhầm lẫn, nhưng tôi cũng đã gọi classifier.classifyInstance. sự khác biệt quan trọng là dữ liệu eval được dựa trên xác thực chéo 10x, và cá thể phân loại đã cố gắng phân loại lại cá thể bằng cách sử dụng trình phân loại được đào tạo. – britt

+0

tôi đã có thể nhận được in ấn i cần thiết bằng cách chỉ cần in ví dụ như thế này: System.out.print (dữ liệu.ví dụ (i)); – britt

+0

cảm ơn rất nhiều vì đã giúp tôi không bị mắc kẹt. – britt

0

Đây là bài đăng cũ nhưng tôi có cùng một vấn đề và giải quyết nó khác đi. Có lẽ một người như tôi sẽ cần nó.

Điều tôi đã làm là đánh giá có dự đoán phương thức trả về ArrayList của đối tượng dự đoán.

Mỗi đối tượng Dự đoán có thực tế và được dự đoán và tôi chỉ in từng trường hợp thực tế của mình không giống với giá trị được dự đoán.

Mã của tôi:

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);; 

     } 

    } 

Hy vọng nó sẽ giúp một ai đó.

Các vấn đề liên quan