"[SOLVED] Problems with Set Role and ECODB in Java Code"

DGSunican
DGSunican New Altair Community Member
edited November 2024 in Community Q&A
Hello all,

I am having a problem integrating RapidMiner in my Java Code. I am using 5.3.013 version.

What i want to do is the next process:
1. Read a Weak .arff file.
2. Set as label the last nominal attribute, named "note"
3. Apply the ECODB algorithm in order to detect class-outliers
4. Save the resulting set, with the instances marked as outliers, in a new .arff file

Following the documentation in the RapidMiner Wiki, i have implement the following Java method to perform the mentioned steps:
try{
           //initialized RapidMiner
           RapidMiner.init();
           
       } catch(Exception e){System.out.println("Exception initializating Rapidminer, method RapidMiner.init(): "+e);}
       
       /*
        * Creates a new process. This process will contain the
        * whole sequence of reading the .arff Weka file, making the
        * outlier instances and finally saving the .arff Weka file with
        * the marked instances
        */
       com.rapidminer.Process outlierProcess = new com.rapidminer.Process();
       
       try{
           //Operator for reading the .arff Weka file
           Operator initialDatasetECODB =
                   OperatorService.createOperator(com.rapidminer.operator.io.ArffExampleSource.class);
           
           //Operator to perform EDOCB algorithm
           Operator ecodb =
                   OperatorService.createOperator(com.rapidminer.operator.preprocessing.outlier.EcodbOperator.class);
           
           //Operator for saving the markedDataset
           Operator markedDatasetECODB =
                   OperatorService.createOperator(com.rapidminer.operator.io.ArffExampleSetWriter.class);
           
           //Operator for labeling the initial dataset
           Operator labeling =
                   OperatorService.createOperator(
                   com.rapidminer.operator.preprocessing.filter.ChangeAttributeRole.class);
           
           
           //Configures the "read arff" operator to read the dataset file with ID assigned per instance
           initialDatasetECODB.setParameter(
                   com.rapidminer.operator.io.ArffExampleSource.PARAMETER_DATA_FILE,
                   //this.directorio.getAbsolutePath()+"\\originalDataSet.arff");
                   "C:/originalDataSet.arff");

         
           //Configures the ECODB operator
           ecodb.setParameter(
                   com.rapidminer.operator.preprocessing.outlier.EcodbOperator.PARAMETER_NUMBER_OF_NEIGHBORS,
                   ""+this.k+"");
           ecodb.setParameter(
                   com.rapidminer.operator.preprocessing.outlier.EcodbOperator.PARAMETER_NUMBER_OF_Class_OUTLIERS,
                   ""+this.numOutliers+"");
           
           //Configures the operator to save the marked dataset
           markedDatasetECODB.setParameter(com.rapidminer.operator.io.ArffExampleSetWriter.PARAMETER_EXAMPLE_SET_FILE,
                   this.directorio.getAbsolutePath()+"\\markedDataset.arff");
           
           //Configures the operator for labeling the initial dataset
           labeling.setParameter(
                   com.rapidminer.operator.preprocessing.filter.ChangeAttributeRole.PARAMETER_TARGET_ROLE,
                   Attributes.LABEL_NAME);
           labeling.setParameter(
                   com.rapidminer.operator.preprocessing.filter.ChangeAttributeRole.PARAMETER_NAME,
                   "note");
           
           //Adds the operators to the process
           outlierProcess.getRootOperator().getSubprocess(0).addOperator(initialDatasetECODB);
           outlierProcess.getRootOperator().getSubprocess(0).addOperator(ecodb);
           outlierProcess.getRootOperator().getSubprocess(0).addOperator(markedDatasetECODB);
           outlierProcess.getRootOperator().getSubprocess(0).addOperator(labeling);

           
           
           
           //Conects the reader operator to the ecodb operator
           try{
           initialDatasetECODB.getOutputPorts().getPortByName("output")
                   .connectTo(labeling.getInputPorts().getPortByName("example set input"));
           }catch(Exception e){System.out.println("Error in initialDataset operator");}
           try{
           labeling.getOutputPorts().getPortByName("example set output")
                   .connectTo(ecodb.getInputPorts().getPortByName("example set input"));
           
           }catch(Exception e){System.out.println("Error in labeling operator: "+e);}
           try{
           ecodb.getOutputPorts().getPortByName("example set output")
                   .connectTo(markedDatasetECODB.getInputPorts().getPortByName("input"));
           }catch(Exception e){System.out.println("Error in ecodb  operator");}
           
           //Run the whole process
           outlierProcess.run();
           
       }catch (Exception e){ System.out.println("Exception trying to execute the ECODB RapidMiner process "+e);}
       
When i execute it, i get the following Exception:
Exception trying to execute the ECODB RapidMiner process com.rapidminer.operator.UserError: No data was delivered at port Detect Outlier (COF).example set input (connected). 
It seems that the output port of the Set_Role class, "Example output set", do not return nothing. I have tried to connect, directly, the ECODB class to the readArff class, and they seems to connect correctly, but of course ECODB launch en exception requiering to stablish a label attribute, and it only can be done with the Set_Role operation, which do not work correctly.

I hope someone in this forum could help me with this issue.

Thank you very much.


Answers

  • Marco_Boeck
    Marco_Boeck New Altair Community Member
    Hi,

    Please have a look at the sticky thread in the development forum: http://rapid-i.com/rapidforum/index.php/topic,5807.0.html

    What I always recommend is to not create your own process by hand (i.e. don't create operators yourself) but to rather use a predefined process which has been created via RM Studio GUI. That makes things A LOT less prone  to errors.

    Regards,
    Marco
  • DGSunican
    DGSunican New Altair Community Member
    Marco Boeck wrote:

    Hi,

    Please have a look at the sticky thread in the development forum: http://rapid-i.com/rapidforum/index.php/topic,5807.0.html

    What I always recommend is to not create your own process by hand (i.e. don't create operators yourself) but to rather use a predefined process which has been created via RM Studio GUI. That makes things A LOT less prone  to errors.

    Regards,
    Marco

    Thank you so much Marco, it worked for me. Problem solved!

Welcome!

It looks like you're new here. Sign in or register to get started.

Welcome!

It looks like you're new here. Sign in or register to get started.