From 3679e74467f668a17bc12052e9d81bf64e1a1ac2 Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Tue, 16 Jul 2024 19:39:30 +0300 Subject: [PATCH] Updated JPMML-Python dependency --- .../glassbox/ebm/ExplainableBoostingUtil.java | 7 +++--- .../java/sktree/tree/ProjectionManager.java | 2 +- .../java/h2o/estimators/H2OEstimator.java | 4 +-- .../main/java/lightgbm/sklearn/Booster.java | 3 ++- .../java/lightgbm/sklearn/BoosterUtil.java | 2 +- .../statsmodels/StatsModelsUtil.java | 4 +-- .../src/main/java/sklearn/Calibrator.java | 5 ++-- .../src/main/java/sklearn/Estimator.java | 2 +- .../calibration/SigmoidCalibration.java | 3 +-- .../ensemble/iforest/IsolationForestUtil.java | 2 +- .../logistic/LogisticRegression.java | 4 +-- .../preprocessing/PowerTransformer.java | 5 ++-- .../java/sklearn2pmml/CustomizationUtil.java | 25 +++---------------- .../java/sklearn2pmml/ensemble/GBDTUtil.java | 2 +- .../expression/ExpressionClassifier.java | 4 +-- .../expression/ExpressionRegressor.java | 4 +-- pom.xml | 14 +++++------ 17 files changed, 37 insertions(+), 55 deletions(-) diff --git a/pmml-sklearn-extension/src/main/java/interpret/glassbox/ebm/ExplainableBoostingUtil.java b/pmml-sklearn-extension/src/main/java/interpret/glassbox/ebm/ExplainableBoostingUtil.java index 61155b594..38315ac61 100644 --- a/pmml-sklearn-extension/src/main/java/interpret/glassbox/ebm/ExplainableBoostingUtil.java +++ b/pmml-sklearn-extension/src/main/java/interpret/glassbox/ebm/ExplainableBoostingUtil.java @@ -42,6 +42,7 @@ import org.jpmml.converter.FieldNameUtil; import org.jpmml.converter.IndexFeature; import org.jpmml.converter.Label; +import org.jpmml.converter.ModelEncoder; import org.jpmml.converter.PMMLEncoder; import org.jpmml.converter.PMMLUtil; import org.jpmml.converter.Schema; @@ -66,7 +67,7 @@ public List encodeExplain ClassDictUtil.checkSize(bins, featureTypesIn); ClassDictUtil.checkSize(termFeatures, termScores); - PMMLEncoder encoder = schema.getEncoder(); + ModelEncoder encoder = schema.getEncoder(); Label label = schema.getLabel(); List features = schema.getFeatures(); @@ -95,7 +96,7 @@ public List encodeExplain } static - private List encodeBinLevelFeatures(Feature feature, List binLevels, String featureType, PMMLEncoder encoder){ + private List encodeBinLevelFeatures(Feature feature, List binLevels, String featureType, ModelEncoder encoder){ List result = new ArrayList<>(); for(int i = 0; i < binLevels.size(); i++){ @@ -121,7 +122,7 @@ private List encodeBinLevelFeatures(Feature feature, List } static - private IndexFeature binContinuous(Feature feature, HasArray binLevel, Integer binLevelIndex, PMMLEncoder encoder){ + private IndexFeature binContinuous(Feature feature, HasArray binLevel, Integer binLevelIndex, ModelEncoder encoder){ ContinuousFeature continuousFeature = feature.toContinuousFeature(); Discretize discretize = new Discretize(continuousFeature.getName()); diff --git a/pmml-sklearn-extension/src/main/java/sktree/tree/ProjectionManager.java b/pmml-sklearn-extension/src/main/java/sktree/tree/ProjectionManager.java index d26bc571d..e94f66abf 100644 --- a/pmml-sklearn-extension/src/main/java/sktree/tree/ProjectionManager.java +++ b/pmml-sklearn-extension/src/main/java/sktree/tree/ProjectionManager.java @@ -134,7 +134,7 @@ private Feature encodeFeature(String name, List key, SkLearnEncoder enco { if(minusExpression != null){ - expression = ExpressionUtil.createApply(PMMLFunctions.MULTIPLY, ExpressionUtil.createConstant(-1d), minusExpression); + expression = ExpressionUtil.toNegative(minusExpression); } else { diff --git a/pmml-sklearn-h2o/src/main/java/h2o/estimators/H2OEstimator.java b/pmml-sklearn-h2o/src/main/java/h2o/estimators/H2OEstimator.java index 485b71232..c4bd5c80b 100644 --- a/pmml-sklearn-h2o/src/main/java/h2o/estimators/H2OEstimator.java +++ b/pmml-sklearn-h2o/src/main/java/h2o/estimators/H2OEstimator.java @@ -39,8 +39,8 @@ import org.jpmml.converter.FeatureList; import org.jpmml.converter.FeatureUtil; import org.jpmml.converter.Label; +import org.jpmml.converter.ModelEncoder; import org.jpmml.converter.OrdinalLabel; -import org.jpmml.converter.PMMLEncoder; import org.jpmml.converter.ScalarLabelUtil; import org.jpmml.converter.Schema; import org.jpmml.converter.TypeUtil; @@ -200,7 +200,7 @@ public Label encodeLabel(List names, SkLearnEncoder encoder){ public Model encodeModel(Schema schema){ Converter converter = createConverter(); - PMMLEncoder encoder = schema.getEncoder(); + ModelEncoder encoder = schema.getEncoder(); Label label = schema.getLabel(); List features = schema.getFeatures(); diff --git a/pmml-sklearn-lightgbm/src/main/java/lightgbm/sklearn/Booster.java b/pmml-sklearn-lightgbm/src/main/java/lightgbm/sklearn/Booster.java index 92739bbb3..0c4b7ccd5 100644 --- a/pmml-sklearn-lightgbm/src/main/java/lightgbm/sklearn/Booster.java +++ b/pmml-sklearn-lightgbm/src/main/java/lightgbm/sklearn/Booster.java @@ -18,6 +18,7 @@ */ package lightgbm.sklearn; +import java.io.Reader; import java.io.StringReader; import java.util.List; @@ -55,7 +56,7 @@ public GBDT getGBDT(){ private GBDT loadGBDT(){ String handle = getHandle(); - try(StringReader reader = new StringReader(handle)){ + try(Reader reader = new StringReader(handle)){ List lines = CharStreams.readLines(reader); return LightGBMUtil.loadGBDT(lines.iterator()); diff --git a/pmml-sklearn-lightgbm/src/main/java/lightgbm/sklearn/BoosterUtil.java b/pmml-sklearn-lightgbm/src/main/java/lightgbm/sklearn/BoosterUtil.java index 8726a10c5..9bb74c16b 100644 --- a/pmml-sklearn-lightgbm/src/main/java/lightgbm/sklearn/BoosterUtil.java +++ b/pmml-sklearn-lightgbm/src/main/java/lightgbm/sklearn/BoosterUtil.java @@ -55,7 +55,7 @@ public ObjectiveFunction getObjectiveFunction public MiningModel encodeModel(E estimator, Schema schema){ GBDT gbdt = getGBDT(estimator); - ModelEncoder encoder = (ModelEncoder)schema.getEncoder(); + ModelEncoder encoder = schema.getEncoder(); Map options = getOptions(gbdt, estimator); diff --git a/pmml-sklearn-statsmodels/src/main/java/sklearn2pmml/statsmodels/StatsModelsUtil.java b/pmml-sklearn-statsmodels/src/main/java/sklearn2pmml/statsmodels/StatsModelsUtil.java index c9e5ce7da..59336baf2 100644 --- a/pmml-sklearn-statsmodels/src/main/java/sklearn2pmml/statsmodels/StatsModelsUtil.java +++ b/pmml-sklearn-statsmodels/src/main/java/sklearn2pmml/statsmodels/StatsModelsUtil.java @@ -24,8 +24,8 @@ import org.dmg.pmml.PMML; import org.jpmml.converter.Feature; import org.jpmml.converter.Label; +import org.jpmml.converter.ModelEncoder; import org.jpmml.converter.Schema; -import org.jpmml.sklearn.SkLearnEncoder; import org.jpmml.statsmodels.InterceptFeature; import org.jpmml.statsmodels.StatsModelsEncoder; import sklearn.Estimator; @@ -47,7 +47,7 @@ public PMML encodePMML(E estimator){ static public Schema addConstant(Schema schema){ - SkLearnEncoder encoder = (SkLearnEncoder)schema.getEncoder(); + ModelEncoder encoder = schema.getEncoder(); Label label = schema.getLabel(); List features = (List)schema.getFeatures(); diff --git a/pmml-sklearn/src/main/java/sklearn/Calibrator.java b/pmml-sklearn/src/main/java/sklearn/Calibrator.java index 593db7893..f63ddd664 100644 --- a/pmml-sklearn/src/main/java/sklearn/Calibrator.java +++ b/pmml-sklearn/src/main/java/sklearn/Calibrator.java @@ -26,7 +26,6 @@ import org.jpmml.converter.Feature; import org.jpmml.converter.FieldNameUtil; import org.jpmml.converter.Label; -import org.jpmml.converter.PMMLEncoder; import org.jpmml.converter.Schema; import org.jpmml.converter.regression.RegressionModelUtil; import org.jpmml.sklearn.SkLearnEncoder; @@ -47,11 +46,11 @@ public Calibrator(String module, String name){ @Override public RegressionModel encodeModel(Schema schema){ - PMMLEncoder encoder = schema.getEncoder(); + SkLearnEncoder encoder = (SkLearnEncoder)schema.getEncoder(); Label label = schema.getLabel(); List features = schema.getFeatures(); - features = encodeFeatures((List)features, (SkLearnEncoder)encoder); + features = encodeFeatures((List)features, encoder); Feature feature = Iterables.getOnlyElement(features); diff --git a/pmml-sklearn/src/main/java/sklearn/Estimator.java b/pmml-sklearn/src/main/java/sklearn/Estimator.java index 41143c04f..b52730d22 100644 --- a/pmml-sklearn/src/main/java/sklearn/Estimator.java +++ b/pmml-sklearn/src/main/java/sklearn/Estimator.java @@ -195,7 +195,7 @@ public void addFeatureImportances(Model model, Schema schema){ featureImportances = getFeatureImportances(); } - ModelEncoder encoder = (ModelEncoder)schema.getEncoder(); + ModelEncoder encoder = schema.getEncoder(); List features = schema.getFeatures(); if(featureImportances != null){ diff --git a/pmml-sklearn/src/main/java/sklearn/calibration/SigmoidCalibration.java b/pmml-sklearn/src/main/java/sklearn/calibration/SigmoidCalibration.java index 539809667..4d3143fb5 100644 --- a/pmml-sklearn/src/main/java/sklearn/calibration/SigmoidCalibration.java +++ b/pmml-sklearn/src/main/java/sklearn/calibration/SigmoidCalibration.java @@ -49,8 +49,7 @@ public List encodeFeatures(List features, SkLearnEncoder encod Feature feature = features.get(0); - Apply apply = ExpressionUtil.createApply(PMMLFunctions.MULTIPLY, - ExpressionUtil.createConstant(-1), + Apply apply = (Apply)ExpressionUtil.toNegative( ExpressionUtil.createApply(PMMLFunctions.ADD, ExpressionUtil.createApply(PMMLFunctions.MULTIPLY, ExpressionUtil.createConstant(a), feature.ref()), ExpressionUtil.createConstant(b) diff --git a/pmml-sklearn/src/main/java/sklearn/ensemble/iforest/IsolationForestUtil.java b/pmml-sklearn/src/main/java/sklearn/ensemble/iforest/IsolationForestUtil.java index b16156941..015effd3e 100644 --- a/pmml-sklearn/src/main/java/sklearn/ensemble/iforest/IsolationForestUtil.java +++ b/pmml-sklearn/src/main/java/sklearn/ensemble/iforest/IsolationForestUtil.java @@ -88,7 +88,7 @@ public boolean isFinalResult(){ public Expression createExpression(FieldRef fieldRef){ Number offset = estimator.getOffset(); - return ExpressionUtil.createApply(PMMLFunctions.SUBTRACT, ExpressionUtil.createConstant(-offset.doubleValue()), ExpressionUtil.createApply(PMMLFunctions.POW, ExpressionUtil.createConstant(2d), ExpressionUtil.createApply(PMMLFunctions.MULTIPLY, ExpressionUtil.createConstant(-1d), fieldRef))); + return ExpressionUtil.createApply(PMMLFunctions.SUBTRACT, ExpressionUtil.createConstant(-offset.doubleValue()), ExpressionUtil.createApply(PMMLFunctions.POW, ExpressionUtil.createConstant(2d), ExpressionUtil.toNegative(fieldRef))); } }; diff --git a/pmml-sklearn/src/main/java/sklearn/linear_model/logistic/LogisticRegression.java b/pmml-sklearn/src/main/java/sklearn/linear_model/logistic/LogisticRegression.java index f757e0272..253e7af3b 100644 --- a/pmml-sklearn/src/main/java/sklearn/linear_model/logistic/LogisticRegression.java +++ b/pmml-sklearn/src/main/java/sklearn/linear_model/logistic/LogisticRegression.java @@ -36,8 +36,8 @@ import org.jpmml.converter.CategoricalLabel; import org.jpmml.converter.ContinuousFeature; import org.jpmml.converter.Feature; +import org.jpmml.converter.ModelEncoder; import org.jpmml.converter.ModelUtil; -import org.jpmml.converter.PMMLEncoder; import org.jpmml.converter.Schema; import org.jpmml.converter.SchemaUtil; import org.jpmml.converter.mining.MiningModelUtil; @@ -109,7 +109,7 @@ private Model encodeMultinomialModel(Schema schema){ List coef = getCoef(); List intercept = getIntercept(); - PMMLEncoder encoder = schema.getEncoder(); + ModelEncoder encoder = schema.getEncoder(); CategoricalLabel categoricalLabel = (CategoricalLabel)schema.getLabel(); List features = schema.getFeatures(); diff --git a/pmml-sklearn/src/main/java/sklearn/preprocessing/PowerTransformer.java b/pmml-sklearn/src/main/java/sklearn/preprocessing/PowerTransformer.java index 867328918..71d337a8d 100644 --- a/pmml-sklearn/src/main/java/sklearn/preprocessing/PowerTransformer.java +++ b/pmml-sklearn/src/main/java/sklearn/preprocessing/PowerTransformer.java @@ -162,10 +162,9 @@ private Apply encodeYeoJohnsonTransform(ContinuousFeature continuousFeature, Num { // "-ln(-$name + 1)" - falseApply = ExpressionUtil.createApply(PMMLFunctions.MULTIPLY, - ExpressionUtil.createConstant(-1d), + falseApply = (Apply)ExpressionUtil.toNegative( ExpressionUtil.createApply(PMMLFunctions.LN1P, - ExpressionUtil.createApply(PMMLFunctions.MULTIPLY, ExpressionUtil.createConstant(-1d), continuousFeature.ref()) + ExpressionUtil.toNegative(continuousFeature.ref()) ) ); } diff --git a/pmml-sklearn/src/main/java/sklearn2pmml/CustomizationUtil.java b/pmml-sklearn/src/main/java/sklearn2pmml/CustomizationUtil.java index b907ccb8e..7d2a27688 100644 --- a/pmml-sklearn/src/main/java/sklearn2pmml/CustomizationUtil.java +++ b/pmml-sklearn/src/main/java/sklearn2pmml/CustomizationUtil.java @@ -45,7 +45,6 @@ import com.google.common.collect.Iterables; import jakarta.xml.bind.Binder; -import jakarta.xml.bind.JAXBContext; import jakarta.xml.bind.JAXBElement; import jakarta.xml.bind.Marshaller; import jakarta.xml.bind.annotation.XmlRootElement; @@ -68,8 +67,6 @@ private CustomizationUtil(){ static public void customize(Model model, List customizations) throws Exception { - JAXBContext jaxbContext = JAXBUtil.getContext(); - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setNamespaceAware(true); @@ -81,7 +78,7 @@ public void customize(Model model, List customizations) NamespaceContext namespaceContext = new DocumentNamespaceContext(document); - Binder binder = jaxbContext.createBinder(Node.class); + Binder binder = JAXBUtil.createBinder(Node.class); binder.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.FALSE); binder.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); @@ -302,28 +299,14 @@ private Field findField(PMMLObject parent, PMMLObject child){ static private void addListElement(Field field, PMMLObject parent, PMMLObject child) throws ReflectiveOperationException { - Class parentClazz = parent.getClass(); - Class childClazz = child.getClass(); + @SuppressWarnings("unused") + List fieldValue = (List)ReflectionUtil.getFieldValue(field, parent); ParameterizedType listType = (ParameterizedType)field.getGenericType(); Class listElementType = (Class)listType.getActualTypeArguments()[0]; - Method getterMethod = ReflectionUtil.getGetterMethod(field); - - String name = getterMethod.getName(); - if(name.startsWith("get")){ - name = "add" + name.substring(3); - } else - - { - throw new IllegalArgumentException(); - } - - // See https://stackoverflow.com/a/1679444 - Class valueArrayClazz = Class.forName("[L" + childClazz.getName() + ";"); - - Method appenderMethod = parentClazz.getMethod(name, valueArrayClazz); + Method appenderMethod = ReflectionUtil.getAppenderMethod(field); // See https://stackoverflow.com/a/36125994 Object[] valueArray = (Object[])Array.newInstance(listElementType, 1); diff --git a/pmml-sklearn/src/main/java/sklearn2pmml/ensemble/GBDTUtil.java b/pmml-sklearn/src/main/java/sklearn2pmml/ensemble/GBDTUtil.java index 575f6e588..3ed212cd2 100644 --- a/pmml-sklearn/src/main/java/sklearn2pmml/ensemble/GBDTUtil.java +++ b/pmml-sklearn/src/main/java/sklearn2pmml/ensemble/GBDTUtil.java @@ -145,7 +145,7 @@ public VisitorAction visit(Node node){ treeModelVisitor.applyTo(treeModel); } - ModelEncoder encoder = (ModelEncoder)schema.getEncoder(); + ModelEncoder encoder = schema.getEncoder(); Label label = schema.getLabel(); ContinuousLabel continuousLabel; diff --git a/pmml-sklearn/src/main/java/sklearn2pmml/expression/ExpressionClassifier.java b/pmml-sklearn/src/main/java/sklearn2pmml/expression/ExpressionClassifier.java index 0a25c757a..49b16f8c1 100644 --- a/pmml-sklearn/src/main/java/sklearn2pmml/expression/ExpressionClassifier.java +++ b/pmml-sklearn/src/main/java/sklearn2pmml/expression/ExpressionClassifier.java @@ -35,8 +35,8 @@ import org.jpmml.converter.CategoricalLabel; import org.jpmml.converter.Feature; import org.jpmml.converter.FieldNameUtil; +import org.jpmml.converter.ModelEncoder; import org.jpmml.converter.ModelUtil; -import org.jpmml.converter.PMMLEncoder; import org.jpmml.converter.Schema; import org.jpmml.converter.regression.RegressionModelUtil; import org.jpmml.python.DataFrameScope; @@ -55,7 +55,7 @@ public RegressionModel encodeModel(Schema schema){ Map classExprs = getClassExprs(); RegressionModel.NormalizationMethod normalizationMethod = parseNormalizationMethod(getNormalizationMethod()); - PMMLEncoder encoder = schema.getEncoder(); + ModelEncoder encoder = schema.getEncoder(); CategoricalLabel categoricalLabel = (CategoricalLabel)schema.getLabel(); List features = schema.getFeatures(); diff --git a/pmml-sklearn/src/main/java/sklearn2pmml/expression/ExpressionRegressor.java b/pmml-sklearn/src/main/java/sklearn2pmml/expression/ExpressionRegressor.java index c653a1117..055324eb3 100644 --- a/pmml-sklearn/src/main/java/sklearn2pmml/expression/ExpressionRegressor.java +++ b/pmml-sklearn/src/main/java/sklearn2pmml/expression/ExpressionRegressor.java @@ -28,8 +28,8 @@ import org.jpmml.converter.ContinuousLabel; import org.jpmml.converter.Feature; import org.jpmml.converter.FieldNameUtil; +import org.jpmml.converter.ModelEncoder; import org.jpmml.converter.ModelUtil; -import org.jpmml.converter.PMMLEncoder; import org.jpmml.converter.Schema; import org.jpmml.converter.regression.RegressionModelUtil; import org.jpmml.python.DataFrameScope; @@ -48,7 +48,7 @@ public RegressionModel encodeModel(Schema schema){ Object expr = getExpr(); RegressionModel.NormalizationMethod normalizationMethod = parseNormalizationMethod(getNormalizationMethod()); - PMMLEncoder encoder = schema.getEncoder(); + ModelEncoder encoder = schema.getEncoder(); ContinuousLabel continuousLabel = (ContinuousLabel)schema.getLabel(); List features = schema.getFeatures(); diff --git a/pom.xml b/pom.xml index 8d0cf9028..3fbc9b8de 100644 --- a/pom.xml +++ b/pom.xml @@ -98,42 +98,42 @@ org.jpmml pmml-evaluator-testing - 1.6.4 + 1.6.5 org.jpmml pmml-h2o - 1.2.12 + 1.2.13 org.jpmml pmml-lightgbm - 1.5.3 + 1.5.4 org.jpmml pmml-python - 1.2.2 + 1.2.4 org.jpmml pmml-python-testing - 1.2.2 + 1.2.4 org.jpmml pmml-statsmodels - 1.1.0 + 1.1.1 org.jpmml pmml-xgboost - 1.8.5 + 1.8.6