jpmml.evaluator.version 1.3.4 & jpmml.model.version 1.3.5を使用しています。JPMML入力値がない場合、述部は未知(つまり、ヌル参照)と評価されます。
私は評価し、エラーを取得するための引数を準備します org.jpmml.evaluator.MissingValueException(でまたはライン10678の周り):org.jpmml.evaluator.mining.MiningModelEvaluator.evaluateSegmentationでdecisionFunction_1 (MiningModelEvaluator.java :436)org.jpmml.evaluator.mining.MiningModelEvaluator.evaluateClassification(MiningModelEvaluator.java:240で )org.jpmml.evaluator.mining.MiningModelEvaluator.evaluate(MiningModelEvaluator.java:207で ) org.jpmml.evaluatorで.mining.MiningModelEvaluator.evaluate(MiningModelEvaluator.java:185)
コード:
//Feature class has 2 fields: String name, Object value
public Double evaluate(List<Feature> givenFeaturesValue) {
Map<FieldName, FieldValue> arguments = new HashMap<>();
List<InputField> inputFields = evaluator.getInputFields();
Map<FieldName, InputField> featureProperties= new HashMap<>(inputFields.size());
for(InputField inputField : inputFields) {
featureProperties.put(inputField.getName(), inputField);
}
for(Entry<FieldName, InputField> featureProperty: featureProperties.entrySet()) {
FieldValue value = featureProperty.getValue().prepare(null);
arguments.put(featureProperty.getKey(), value);
}
for(Entry<FieldName, InputField> featureProperty: featureProperties.entrySet()) {
for(Feature givenFeature: givenFeaturesValue) {
if(givenFeature.getFieldName().equals(featureProperty.getKey().getValue())) {
FieldValue value = givenFeature.getValue().prepare(featureProperty.getValue());
arguments.put(featureProperty.getKey(), value);
}
}
}
Map<FieldName, ?> results = evaluator.evaluate(arguments);
//after this line I get the error
}
PMMLファイル:
<DataDictionary>
<DataField name="GENDER" optype="categorical" dataType="string">
<Value value="0"/>
<Value value="1"/>
</DataField>
<DataField name="1GA" optype="categorical" dataType="string">
<Value value="1GA DEFAULT"/>
<Value value=""/>
<Value value="""/>
<Value value="#"/>
<Value value="#NUM#"/>
</DataField>
<DataField name="DB10" optype="categorical" dataType="integer">
<Value value="0"/>
<Value value="1"/>
</DataField>
<DataField name="ILR" optype="continuous" dataType="double"/>
</DataDictionary>
ヘルプ
引数マップを初期化する正しい方法がわかりません。 PMMLファイルの例を追加しました。引数に値がない場合は、空/ null/0.0にする必要がありますか? – userit1985
'Evaluator#getInputFields()'は入力フィールドのリストを提供します。あなたの議論マップはそれらすべての値を提供しなければなりません。入力フィールドの中には 'null '値を受け入れるものもあれば、そうでないものもあります。JPMML-Evaluator APIを使って2つのモードを区別することができます。あなたのコード例では、 'null'デフォルト値をすべての入力フィールドに渡します。事前チェックは行われません。どうやら、あなたのモデルは欠損値をサポートしていないので、MissingValueExceptionが不完全な引数マップを使って実行されたときにそれが失敗するのは正しい動作です。 – user1808924