How to incapsulate data in IOContainer
leno
New Altair Community Member
Hi i have extract a model file from a process.
I want load the model and apply this model to data that i calculate a runtime.
The data are all integer value.
My code is
RapidMiner.init();
//create the operator for apply model
Operator testSource = OperatorService.createOperator(ModelApplier.class);
//create the operator for load the model
Operator loadModel= OperatorService.createOperator(ModelLoader.class);
then i have to load the model and this is not a problem.
My problem is
" How i can incapsulate a set of number in an IOContainer for using this as input of the Model?"
Thank you very much
I want load the model and apply this model to data that i calculate a runtime.
The data are all integer value.
My code is
RapidMiner.init();
//create the operator for apply model
Operator testSource = OperatorService.createOperator(ModelApplier.class);
//create the operator for load the model
Operator loadModel= OperatorService.createOperator(ModelLoader.class);
then i have to load the model and this is not a problem.
My problem is
" How i can incapsulate a set of number in an IOContainer for using this as input of the Model?"
Thank you very much
0
Answers
-
Hi,
just set up your ExampleSet and put it in the IOContainer. See the following examples.
Create ExampleSet:
Put ExampleSet into IOContainer:
List<Attribute> listOfAttributes;
listOfAttributes.add(AttributeFactory.createAttribute("helloWorldAttribute", Ontology.NUMERICAL);
// setup your attribute list
MemoryExampleTable table = new MemoryExampleTable(listOfAttributes);
// setup your data rows
double[] doubleArray = new double[] { 1.0d, 2.0d, 3.0d };
table.addDataRow(new DoubleArrayDataRow(doubleArray));
ExampleSet exSet = table.createExampleSet();
// if you need special roles:
Attribute att = listOfAttributes.get(0);
exSet.getAttributes().setSpecialAttribute(att, "label");
Just make sure to use the correct input order in your process design.
IOContainer ioInput = new IOContainer(new IOObject[]{ exSet });
IOContainer ioResult = process.run(ioInput);
ExampleSet resultSet;
if (ioResult.getElementAt(0) instanceof ExampleSet) {
resultSet = (ExampleSet)ioResult.getElementAt(0);
// do stuff
}
Regards,
Marco0 -
But the resultSet contain only the predicted label? And another doubt but if the apply method of the class ModelApplier is deprecated, How i can apply a model that i have in a file?
I have
RapidMiner.init();
// loading the test set (plus adding the model to result container)
Operator testSource = OperatorService.createOperator(ModelApplier.class);
Operator loadModel= OperatorService.createOperator(ModelLoader.class);
File modelFile=new File("neuralX.mod");
loadModel.setParameter(ModelLoader.PARAMETER_MODEL_FILE, modelFile.getAbsolutePath());
Some idea? Very much thanks for the help0 -
Hi,
I strongly suggest using RapidMiner to design your process(es) beforehand and then using them via the code I posted in my first response. You can connect the input ports on the left border of the procecss design window to your operators, and then deliver the data at these ports at runtime to your process via:
This way, you can do anything you can do from RapidMiner, so the result(s) from the process are the same as in RapidMiner. Trying to create the process "by hand" and not using a process xml is very, very error-prone (and a lot more work).
IOContainer ioInput = new IOContainer(new IOObject[]{ exSet });
IOContainer ioResult = process.run(ioInput);
Regards,
Marco0 -
Ok more problem is done, now i have to extract the predicted label by the ExampleSet i do
resultSet = (ExampleSet)ioResult.getElementAt(0);
System.out.println("resultset");
Example e=resultSet.getExample(0);
predetto=e.getPredictedLabel();
System.out.println("predetto="+predetto);
It is correct? And then the process.run is in a while loop , have i to destroy the table and the example map at every iterate? Thank you very much Marco i have problem to understand the index that i insert in the call of function.
Happy data miner0 -
Hi,
I suggest using something along these lines:
This will iterate over all examples of the specified attribute.
// change attribute name to whatever you need
Attribute targetAtt = exampleSet.getAttributes().get("attributeName");
double result;
for (Example example: exampleSet) {
result = example.getValue(targetAtt);
// or if nominal attribute
String resultString = example.getValueAsString(targetAtt);
// insert custom code here
}
If you want to run your process execution in a while loop you can do that, there is no need to explicitly destroy something.
Regards,
Marco0 -
But i need to get the last resultSet and only the predicted Label not an attribute, this is my doubt.
Then i have to use getPredictedLabel() not getAttribute right? Then is there an order of the ExampleSet? The last example Set is the first of the table?
Finally a question if i have two output port for my process what i have to do for get a specific port?
You are very nice thank you very much and i'm sorry for the great number of question that i do0 -
Hi,
1) Predictions are also attributes. They have a special role, but my code above should work anyway.
2) The order you get when iterating over the example set as indicated above should match the order displayed in RapidMiner.
3) ioResult.getElementAt(0) will get you the first output IOObject, ioResult.getElementAt(1) the second, and so on.
Regards,
Marco0 -
ioResult.getElementAt(0) is the first output port ok very well.
My problem is that i have to insert a new row in the data table and create an exampleSet of only this new row data, maybe i don't have understand something.
0 -
Ok i have done
It play and no problem of major number of attribute i have, but if i print the numer of Attributes it say 12, but must be 10.
table.addDataRow(new DoubleArrayDataRow(doubleArray));
exSet =table.createExampleSet();
ioInput = new IOContainer(new IOObject[]{ exSet });
ioResult = process.run(ioInput);
if (ioResult.getElementAt(0) instanceof ExampleSet) {
resultSet = (ExampleSet)ioResult.getElementAt(0);
e =resultSet.getExample(0);
predetto=e.getPredictedLabel();
System.out.println("predettoX="+predetto);
}
if (ioResult.getElementAt(1) instanceof ExampleSet) {
resultSet = (ExampleSet)ioResult.getElementAt(1);
e =resultSet.getExample(0);
predetto=e.getPredictedLabel();
System.out.println("predettoY="+predetto);
}
Attribute attribute = table.getAttribute(table.getNumberOfAttributes()-1);
System.out.println("Nome del 11 "+attribute.getName());
table.removeAttribute(table.getNumberOfAttributes()-1);
attribute = table.getAttribute(table.getNumberOfAttributes()-2);
System.out.println("Nome del 12 "+attribute.getName());
table.removeAttribute(table.getNumberOfAttributes()-2);
removeDataRow = table.removeDataRow(0);
table.clear();
Everyone have an idea?
My goal is at every loop i have to give it a new exampleSet, run my process that give me two ResultSet, and then prepare for the next iterate(then eliminate the prediction attribute that Rapidminer add to my exampleSet).
Thank you very much0