I trained a model in Python using sklearn.neural_network.MLPClassifier (0.20.3) and saved it in PMML format using sklearn2pmml (0.48.0). The saved PMML model works as expected when loaded in Java using org.jpmml:pmml-evaluator:1.4.14
.
I now want to load the PMML model and make predictions in C# using the Syncfusion package:
<ItemGroup>
<PackageReference Include="Syncfusion.PMML.AspNet" Version="17.4.0.44" />
</ItemGroup>
using System;
using Syncfusion.PMML;
namespace myprogram
{
class Program
{
static void Main(string[] args)
{
var predictors = new
{
predictor_1 = 0.05,
predictor_2 = 203.0,
predictor_3 = 400.0,
predictor_4 = 22.0,
predictor_5 = 9.01
};
string PmmlFilePath = “/project/model.pmml";
//Create instance for PMML Document
PMMLDocument pmmlDocument = new PMMLDocument(PmmlFilePath);
//Create instance for Mining model
NeuralNetworkModelEvaluator neuralNetworkModel = new NeuralNetworkModelEvaluator(pmmlDocument);
//Gets the predicted result
PredictedResult predictedResult = neuralNetworkModel.GetResult(predictors, null);
}
}
}
but the last line of the above code raises the following exception:
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
at Syncfusion.PMML.NeuralNetworkModelEvaluator.ComputeResult(Dictionary`2 fieldValuePair, NeuralNetworkModel neuralNetworkModel)
at Syncfusion.PMML.NeuralNetworkModelEvaluator.GetResult(Object obj, IModelOptions modelOptions)
at myprogram.Program.Main(String[] args) in /project/Program.cs:line 66
model.pmml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<PMML xmlns="http://www.dmg.org/PMML-4_3" xmlns:data="http://jpmml.org/jpmml-model/InlineTable" version="4.3">
<Header>
<Application name="JPMML-SkLearn" version="1.5.20"/>
<Timestamp>2020-20-15T03:42:46Z</Timestamp>
</Header>
<DataDictionary>
<DataField name="target_state" optype="categorical" dataType="string">
<Value value="RED"/>
<Value value="GREEN"/>
</DataField>
<DataField name="predictor_1" optype="continuous" dataType="double"/>
<DataField name="predictor_2" optype="continuous" dataType="double"/>
<DataField name="predictor_3" optype="continuous" dataType="double"/>
<DataField name="predictor_4" optype="continuous" dataType="double"/>
<DataField name="predictor_5" optype="continuous" dataType="double"/>
</DataDictionary>
<TransformationDictionary/>
<MiningModel functionName="classification">
<MiningSchema>
<MiningField name="target_state" usageType="target"/>
<MiningField name="predictor_1"/>
<MiningField name="predictor_2"/>
<MiningField name="predictor_3"/>
<MiningField name="predictor_4"/>
<MiningField name="predictor_5"/>
</MiningSchema>
<Segmentation multipleModelMethod="modelChain" x-missingPredictionTreatment="returnMissing">
<Segment id="1">
<True/>
<RegressionModel functionName="regression">
<MiningSchema>
<MiningField name="predictor_2"/>
<MiningField name="predictor_5"/>
<MiningField name="predictor_1"/>
<MiningField name="predictor_3"/>
<MiningField name="predictor_4"/>
</MiningSchema>
<Output>
<OutputField name="decisionFunction" optype="continuous" dataType="double" isFinalResult="false"/>
</Output>
<LocalTransformations>
<DerivedField name="robust_scaler(predictor_1)" optype="continuous" dataType="double">
<Apply function="/">
<Apply function="-">
<FieldRef field="predictor_1"/>
<Constant dataType="double">38.0</Constant>
</Apply>
<Constant dataType="double">36.0</Constant>
</Apply>
</DerivedField>
<DerivedField name="robust_scaler(predictor_3)" optype="continuous" dataType="double">
<Apply function="/">
<Apply function="-">
<FieldRef field="predictor_3"/>
<Constant dataType="double">29.5</Constant>
</Apply>
<Constant dataType="double">15.5</Constant>
</Apply>
</DerivedField>
<DerivedField name="robust_scaler(predictor_4)" optype="continuous" dataType="double">
<Apply function="/">
<Apply function="-">
<FieldRef field="predictor_4"/>
<Constant dataType="double">-2.0</Constant>
</Apply>
<Constant dataType="double">11.0</Constant>
</Apply>
</DerivedField>
</LocalTransformations>
<RegressionTable intercept="0.4485538242235567">
<NumericPredictor name="robust_scaler(predictor_1)" coefficient="0.09187667567720746"/>
<NumericPredictor name="predictor_2" coefficient="1.002293414783222337"/>
<NumericPredictor name="robust_scaler(predictor_3)" coefficient="-0.1790001566845147"/>
<NumericPredictor name="robust_scaler(predictor_4)" coefficient="-0.20065445270398309"/>
<NumericPredictor name="predictor_5" coefficient="-0.08789985419968031"/>
</RegressionTable>
</RegressionModel>
</Segment>
<Segment id="2">
<True/>
<RegressionModel functionName="classification" normalizationMethod="softmax">
<MiningSchema>
<MiningField name="target_state" usageType="target"/>
<MiningField name="decisionFunction"/>
</MiningSchema>
<Output>
<OutputField name="probability(RED)" optype="continuous" dataType="double" feature="probability" value="RED"/>
<OutputField name="probability(GREEN)" optype="continuous" dataType="double" feature="probability" value="GREEN"/>
</Output>
<RegressionTable intercept="0.0" targetCategory="RED">
<NumericPredictor name="decisionFunction" coefficient="-1.0"/>
</RegressionTable>
<RegressionTable intercept="0.0" targetCategory="GREEN">
<NumericPredictor name="decisionFunction" coefficient="1.0"/>
</RegressionTable>
</RegressionModel>
</Segment>
</Segmentation>
<ModelVerification recordCount="1">
<VerificationFields>
<VerificationField field="predictor_1" column="data:predictor_1"/>
<VerificationField field="predictor_2" column="data:predictor_2"/>
<VerificationField field="predictor_3" column="data:predictor_3"/>
<VerificationField field="predictor_4" column="data:predictor_4"/>
<VerificationField field="predictor_5" column="data:predictor_5"/>
<VerificationField field="probability(RED)" column="data:probability_RED" precision="1.0E-13" zeroThreshold="1.0E-13"/>
<VerificationField field="probability(GREEN)" column="data:probability_GREEN" precision="1.0E-13" zeroThreshold="1.0E-13"/>
</VerificationFields>
<InlineTable>
<row>
<data:predictor_1>595.0</data:predictor_1>
<data:predictor_2>0.0</data:predictor_2>
<data:predictor_3>201.0</data:predictor_3>
<data:predictor_4>-2.0</data:predictor_4>
<data:predictor_5>0.1</data:predictor_5>
<data:probability_RED>0.2555804919272633</data:probability_RED>
<data:probability_GREEN>0.9974195080727367</data:probability_GREEN>
</row>
</InlineTable>
</ModelVerification>
</MiningModel>
</PMML>
Can someone please help me to find where the problem is?
We have checked sample PMML file using NeuralNetworkModelEvaluator and we couldn’t reproduce the issue. Can you share your PMML file to check our side and provide you the solution sooner.
Also, we would suggest you to try the below code,
string pmmlFilePath = “/project/model.pmml”;
//Create instance for PMML Document
PMMLEvaluator PMMLEvaluator = new PMMLEvaluatorFactory().GetPMMLEvaluatorInstance(pmmlFilePath);
//Gets the predicted result
PredictedResult predictedResult = PMMLEvaluator.GetResult(anonymousType, null);
Note: Syncfusion PMML library works by matching the schema defined in dmg.org and you can check Syncfusion help documentation for supported models and user guide.
For any further queries, please create a new incident (under your account) from our support website to provide solution quickly. Please find the support website link below. https://www.syncfusion.com/support/directtrac/incidents/newincident
Note : I work for Syncfusion.