8

Mi sono formato e creato un modello J48 con GUI WEKA. Ho salvato il file del modello sul mio computer e ora mi piacerebbe usarlo per classificare una singola istanza nel mio codice Java. Mi piacerebbe avere una previsione per l'attributo "cluster". Quello che faccio è la seguente:Classificazione istanza singola in Weka

public void classify(double lat, double lon, double co) 
{    

// Create attributes to be used with classifiers 
        Attribute latitude = new Attribute("latitude"); 
        Attribute longitude = new Attribute("longitude"); 
        Attribute carbonmonoxide = new Attribute("co"); 

        // Create instances for each pollutant with attribute values latitude, longitude and pollutant itself 
        inst_co = new DenseInstance(4); 

        // Set instance's values for the attributes "latitude", "longitude", and "pollutant concentration" 
        inst_co.setValue(latitude, lat); 
        inst_co.setValue(longitude, lon); 
        inst_co.setValue(carbonmonoxide, co); 
        inst_co.setMissing(cluster); 


    Classifier cls_co = (Classifier) weka.core.SerializationHelper.read("/CO_J48Model.model");//load classifier from file 

        // Test the model 
     double result = cls_co.classifyInstance(inst_co); 
} 

Tuttavia, ottengo un'IndexArrayOutofBoundsException sulla linea inst_co.setValue(latitude, lat);. Non sono riuscito a trovare il motivo di questa eccezione. Apprezzerò se qualcuno potesse indicarmi la giusta direzione.

risposta

8

È necessario aggiungere il proprio inst_co al set di dati, un oggetto Istanze. Il seguente codice dovrebbe funzionare.

import java.util.ArrayList; 

import weka.classifiers.Classifier; 
import weka.core.Attribute; 
import weka.core.DenseInstance; 
import weka.core.Instance; 
import weka.core.Instances; 

public class QuestionInstanceClassifiy { 

    public static void main(String[] args) { 
     QuestionInstanceClassifiy q = new QuestionInstanceClassifiy(); 
     double result = q.classify(1.0d, 1, 1); 
     System.out.println(result); 
    } 

    private Instance inst_co; 

    public double classify(double lat, double lon, double co) { 

     // Create attributes to be used with classifiers 
     // Test the model 
     double result = -1; 
     try { 

      ArrayList<Attribute> attributeList = new ArrayList<Attribute>(2); 

      Attribute latitude = new Attribute("latitude"); 
      Attribute longitude = new Attribute("longitude"); 
      Attribute carbonmonoxide = new Attribute("co"); 

      ArrayList<String> classVal = new ArrayList<String>(); 
      classVal.add("ClassA"); 
      classVal.add("ClassB"); 


      attributeList.add(latitude); 
      attributeList.add(longitude); 
      attributeList.add(carbonmonoxide); 
      attributeList.add(new Attribute("@@[email protected]@",classVal)); 

      Instances data = new Instances("TestInstances",attributeList,0); 


      // Create instances for each pollutant with attribute values latitude, 
      // longitude and pollutant itself 
      inst_co = new DenseInstance(data.numAttributes()); 
      data.add(inst_co); 

      // Set instance's values for the attributes "latitude", "longitude", and 
      // "pollutant concentration" 
      inst_co.setValue(latitude, lat); 
      inst_co.setValue(longitude, lon); 
      inst_co.setValue(carbonmonoxide, co); 
      // inst_co.setMissing(cluster); 

      // load classifier from file 
      Classifier cls_co = (Classifier) weka.core.SerializationHelper 
        .read("/CO_J48Model.model"); 

      result = cls_co.classifyInstance(inst_co); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return result; 
    } 
} 

L'oggetto dati viene creato da Istanze. Aggiungi la tua istanza a questi dati. Dopodiché puoi impostare i tuoi valori in Instance.

Instances data = new Instances("TestInstances",attributeList,0); 
inst_co = new DenseInstance(data.numAttributes()); 
data.add(inst_co); 

Suggerisco di procurarsi valori di informazioni di intestazione e istanze da file esterno o la creazione di queste informazioni solo una volta.

+0

Grazie per l'ottima risposta. Giusto per chiarire, classe A e classe B sono i possibili risultati della classificazione, cioè i nomi dei miei cluster, giusto? Suppongo che debbano essere uguali a quelli usati mentre stavo creando il modello. – Erol

+0

Non funziona, sto diventando weka.core.UnassignedDatasetException: DenseInstance non ha accesso a un set di dati! errore. Suppongo che dovrò assegnarlo a un set di dati, forse quello che ho usato per addestrarlo? – Erol

+0

@babatenor è necessario assegnarlo al set di dati con la stessa intestazione. Le loro informazioni di intestazione dovrebbero essere le stesse –

3

In realtà ho provato nella mia situazione è chiamare il metodo instance.setDataSet(), non il metodo addInstance. Quindi il codice dovrebbe essere inst_co.setDataSet (dati).

Problemi correlati