jpmml / jpmml-converter

Java library for authoring PMML
GNU Affero General Public License v3.0
15 stars 4 forks source link

Can you provide a parameter to control the Separator of output result #10

Closed Ying456123 closed 5 years ago

Ying456123 commented 5 years ago

Hi @vruusmann, through the code, I see the prediction name and probability name of output result is hard coded. Is it possible to provide a parameter to control the Separator of output result? For example, change probability(1) to probability-1

Below is the existing naming rules, and separator is brackets:

static
public OutputField createProbabilityField(DataType dataType, String value){
    return createProbabilityField(FieldName.create("probability(" + value + ")"), dataType, value);
}

Thanks a lot.

vruusmann commented 5 years ago

.. prediction name and probability name of output result is hard coded.

That's intentional - helps to enforce a convention that all "function fields" are named as <name>(<arg1>, <arg2>, .., <argn>).

By this convention, probability is a "function field" whose name is probability which that takes exactly one argument (category label).

For example, change probability(1) to probability-1

"Conventions over configuration".

If you're unhappy with the default naming system, then you can always rename fields using the Visitor API of the JPMML-Model library (eg. class org.jpmml.model.visitors.FieldRenamer).

Ying456123 commented 5 years ago

@vruusmann Thanks a lot. Just want to know how can I get the probability name fields when I creating the name mapping? I have load the pmml model by using the function:

PMML load(InputStream is)

And then get call getModels() to fetch the model, and call model.getOutput(), and get null result. But form the pmml file, I can see there are two output fields. Do you have any advice? Thanks a lot.

<Output>
    <OutputField name="probability_0" optype="continuous" dataType="float" feature="probability" value="0"/>
    <OutputField name="probability_1" optype="continuous" dataType="float" feature="probability" value="1"/>
</Output>

test_classifier_pmml_46.tar.gz

vruusmann commented 5 years ago

And then get call getModels() to fetch the model, and call model.getOutput(), and get null result.

This sequence of calls queries the top-level model element. In your file, the top-level model element is the MiningModel element, which in fact does not specify an Output child element - so the null result value is to be expected.

Anyway, one is not supposed to query PMML elements directly. You should be using the Evaluator#getOutputFields() method, which would give you a two-element list (defined by the last segment on lines 936 -- 939 of your PMML file).