2012-08-14 20 views
6

मैं जानना चाहता हूं कि वर्गीकरण के लिए कई 'सर्वश्रेष्ठ अनुमान' आउटपुट करने के लिए WEKA में कोई तरीका है या नहीं।वर्गों की WEKA वर्गीकरण संभावना

मेरा परिदृश्य है: मैं उदाहरण के लिए क्रॉस-सत्यापन के साथ डेटा वर्गीकृत करता हूं, फिर वीका के आउटपुट पर मुझे कुछ मिलता है: यह इस उदाहरण के वर्गीकरण के लिए 3 सर्वश्रेष्ठ अनुमान हैं। मैं जो चाहता हूं वह ऐसा है, भले ही एक उदाहरण सही ढंग से वर्गीकृत नहीं किया गया हो, मुझे उस उदाहरण के लिए 3 या 5 सर्वश्रेष्ठ अनुमानों का आउटपुट मिलता है।

उदाहरण:

क्लास: ए, बी, सी, डी, ई उदाहरण: 1 ... 10

और उत्पादन होगा: उदाहरण 1 90% वर्ग एक होने की संभावना है, कक्षा बी होने की संभावना 75%, 60% कक्षा सी होने की तरह ..

धन्यवाद।

उत्तर

2

मुझे नहीं पता कि आप इसे मूल रूप से कर सकते हैं, लेकिन आप केवल प्रत्येक वर्ग के लिए संभावनाएं प्राप्त कर सकते हैं, उन्हें क्रमबद्ध कर सकते हैं और पहले तीन ले सकते हैं।

जो फ़ंक्शन आप चाहते हैं वह distributionForInstance(Instance instance) है जो प्रत्येक श्रेणी के लिए double[] देता है।

+0

ठीक है धन्यवाद, मैं कोशिश करता हूं। – user1454263

0

सामान्य रूप से नहीं। जो जानकारी आप चाहते हैं वह सभी वर्गीकरणियों के साथ उपलब्ध नहीं है - ज्यादातर मामलों में (निर्णय पेड़ों के लिए उदाहरण के लिए), निर्णय विश्वास के बिना स्पष्ट (यद्यपि संभावित रूप से गलत है) स्पष्ट है। आपके कार्य के लिए क्लासिफायर की आवश्यकता होती है जो अनिश्चितता को नियंत्रित कर सकती है (जैसे बेवकूफ बेयस वर्गीकृत)।

तकनीकी रूप से सबसे आसान काम करना संभवतः मॉडल को प्रशिक्षित करना है और फिर एक व्यक्तिगत उदाहरण वर्गीकृत करना है, जिसके लिए वीका आपको वांछित आउटपुट देना चाहिए। आम तौर पर आप निश्चित रूप से उदाहरणों के सेट के लिए भी कर सकते हैं, लेकिन मुझे नहीं लगता कि वेका इसे बॉक्स से बाहर प्रदान करता है। आपको शायद कोड को कस्टमाइज़ करना होगा या एपीआई के माध्यम से इसका इस्तेमाल करना होगा (उदाहरण के लिए आर में)।

+0

मैं एपीआई के माध्यम से इसका उपयोग करने का इरादा रखता हूं – user1454263

0

जब आप उदाहरण के लिए संभावना की गणना करते हैं, तो आप यह कैसे करते हैं?

मैंने अपने भाग नियम और डेटा को नए उदाहरण here के लिए पोस्ट किया है लेकिन जहां तक ​​मैन्युअल रूप से गणना है, मुझे यह सुनिश्चित नहीं है कि यह कैसे करें! धन्यवाद

संपादित करें: अब गणना:

निजी नाव [] getProbDist (स्ट्रिंग विभाजन) {

// जैसे (52/2) कुछ में ले जाता है 52 उदाहरणों को सही ढंग से वर्गीकृत और 2 गलती से वर्गीकृत अर्थ।

if(prob_dis.length > 2) 
     return null; 

    if(prob_dis.length == 1){ 
     String temp = prob_dis[0]; 
     prob_dis = new String[2]; 
     prob_dis[0] = "1"; 
     prob_dis[1] = temp; 
    } 

    float p1 = new Float(prob_dis[0]); 
    float p2 = new Float(prob_dis[1]); 
    // assumes two tags 
    float[] tag_prob = new float[2]; 

    tag_prob[1] = 1 - tag_prob[1]; 
    tag_prob[0] = (float)p2/p1; 

// returns double[] as being the probabilities 

return tag_prob;  
} 
5

Weka के एपीआई एक विधि Classifier.distributionForInstance कहा जाता है() था वर्गीकरण भविष्यवाणी वितरण प्राप्त करने के लिए इस्तेमाल किया जा सकता है। फिर आप अपनी शीर्ष-एन भविष्यवाणियों को प्राप्त करने के लिए संभाव्यता को कम करके वितरण को सॉर्ट कर सकते हैं।

नीचे एक ऐसा कार्य है जो प्रिंट करता है: (1) परीक्षण उदाहरण का ग्राउंड सच्चाई लेबल; (2) classifyInstance() से अनुमानित लेबल; और (3) वितरण से भविष्यवाणी वितरणForInstance()। मैंने इसका उपयोग J48 के साथ किया है, लेकिन इसे अन्य क्लासिफायर के साथ काम करना चाहिए।

इनपुट पैरामीटर धारावाहिक मॉडल फ़ाइल (जिसे आप मॉडल प्रशिक्षण चरण के दौरान बना सकते हैं और -d विकल्प लागू कर सकते हैं) और एआरएफएफ प्रारूप में परीक्षण फ़ाइल हैं।

public void test(String modelFileSerialized, String testFileARFF) 
    throws Exception 
{ 
    // Deserialize the classifier. 
    Classifier classifier = 
     (Classifier) weka.core.SerializationHelper.read(
      modelFileSerialized); 

    // Load the test instances. 
    Instances testInstances = DataSource.read(testFileARFF); 

    // Mark the last attribute in each instance as the true class. 
    testInstances.setClassIndex(testInstances.numAttributes()-1); 

    int numTestInstances = testInstances.numInstances(); 
    System.out.printf("There are %d test instances\n", numTestInstances); 

    // Loop over each test instance. 
    for (int i = 0; i < numTestInstances; i++) 
    { 
     // Get the true class label from the instance's own classIndex. 
     String trueClassLabel = 
      testInstances.instance(i).toString(testInstances.classIndex()); 

     // Make the prediction here. 
     double predictionIndex = 
      classifier.classifyInstance(testInstances.instance(i)); 

     // Get the predicted class label from the predictionIndex. 
     String predictedClassLabel = 
      testInstances.classAttribute().value((int) predictionIndex); 

     // Get the prediction probability distribution. 
     double[] predictionDistribution = 
      classifier.distributionForInstance(testInstances.instance(i)); 

     // Print out the true label, predicted label, and the distribution. 
     System.out.printf("%5d: true=%-10s, predicted=%-10s, distribution=", 
          i, trueClassLabel, predictedClassLabel); 

     // Loop over all the prediction labels in the distribution. 
     for (int predictionDistributionIndex = 0; 
      predictionDistributionIndex < predictionDistribution.length; 
      predictionDistributionIndex++) 
     { 
      // Get this distribution index's class label. 
      String predictionDistributionIndexAsClassLabel = 
       testInstances.classAttribute().value(
        predictionDistributionIndex); 

      // Get the probability. 
      double predictionProbability = 
       predictionDistribution[predictionDistributionIndex]; 

      System.out.printf("[%10s : %6.3f]", 
           predictionDistributionIndexAsClassLabel, 
           predictionProbability); 
     } 

     o.printf("\n"); 
    } 
} 
संबंधित मुद्दे