diff --git a/AnomalyDetection/Core/pom.xml b/AnomalyDetection/Core/pom.xml index 3b10e0e11..374cdeb6c 100644 --- a/AnomalyDetection/Core/pom.xml +++ b/AnomalyDetection/Core/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-anomaly - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml AnomalyDetection-Core diff --git a/AnomalyDetection/LibLinear/pom.xml b/AnomalyDetection/LibLinear/pom.xml index 3494cc444..12712f101 100644 --- a/AnomalyDetection/LibLinear/pom.xml +++ b/AnomalyDetection/LibLinear/pom.xml @@ -20,7 +20,7 @@ org.tribuo tribuo-anomaly - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml AnomalyDetection-LibLinear diff --git a/AnomalyDetection/LibSVM/pom.xml b/AnomalyDetection/LibSVM/pom.xml index 44f45705f..131af27ab 100644 --- a/AnomalyDetection/LibSVM/pom.xml +++ b/AnomalyDetection/LibSVM/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-anomaly - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml AnomalyDetection-LibSVM diff --git a/AnomalyDetection/pom.xml b/AnomalyDetection/pom.xml index 5eb42a852..8679ed8c1 100644 --- a/AnomalyDetection/pom.xml +++ b/AnomalyDetection/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml tribuo-anomaly diff --git a/Classification/Core/pom.xml b/Classification/Core/pom.xml index dadf3c4ff..d04e19721 100644 --- a/Classification/Core/pom.xml +++ b/Classification/Core/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-classification - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Classification-Core diff --git a/Classification/DecisionTree/pom.xml b/Classification/DecisionTree/pom.xml index 871e7714a..1b8dc5184 100644 --- a/Classification/DecisionTree/pom.xml +++ b/Classification/DecisionTree/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-classification - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Classification-Tree diff --git a/Classification/Experiments/pom.xml b/Classification/Experiments/pom.xml index 462b2d383..95f8d87f7 100644 --- a/Classification/Experiments/pom.xml +++ b/Classification/Experiments/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-classification - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Classification-Experiments diff --git a/Classification/Explanations/pom.xml b/Classification/Explanations/pom.xml index 6fb30cf2f..cd3d3c185 100644 --- a/Classification/Explanations/pom.xml +++ b/Classification/Explanations/pom.xml @@ -20,7 +20,7 @@ org.tribuo tribuo-classification - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Classification-Explanations diff --git a/Classification/LibLinear/pom.xml b/Classification/LibLinear/pom.xml index 6f7b9c254..3e3aaa6f8 100644 --- a/Classification/LibLinear/pom.xml +++ b/Classification/LibLinear/pom.xml @@ -20,7 +20,7 @@ org.tribuo tribuo-classification - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Classification-LibLinear diff --git a/Classification/LibSVM/pom.xml b/Classification/LibSVM/pom.xml index bd98db140..8d828c91f 100644 --- a/Classification/LibSVM/pom.xml +++ b/Classification/LibSVM/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-classification - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Classification-LibSVM diff --git a/Classification/MultinomialNaiveBayes/pom.xml b/Classification/MultinomialNaiveBayes/pom.xml index c918de3f9..67de36e58 100644 --- a/Classification/MultinomialNaiveBayes/pom.xml +++ b/Classification/MultinomialNaiveBayes/pom.xml @@ -22,7 +22,7 @@ org.tribuo tribuo-classification - 4.2.0-SNAPSHOT + 4.2.0 Classification-MultinomialNaiveBayes tribuo-classification-mnnaivebayes diff --git a/Classification/SGD/pom.xml b/Classification/SGD/pom.xml index 79cc4d22f..5c7982c12 100644 --- a/Classification/SGD/pom.xml +++ b/Classification/SGD/pom.xml @@ -20,7 +20,7 @@ org.tribuo tribuo-classification - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Classification-SGD diff --git a/Classification/XGBoost/pom.xml b/Classification/XGBoost/pom.xml index 640ef376f..a99eb6c6e 100644 --- a/Classification/XGBoost/pom.xml +++ b/Classification/XGBoost/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-classification - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Classification-XGBoost diff --git a/Classification/pom.xml b/Classification/pom.xml index 10bc8f8f9..47d5f544f 100644 --- a/Classification/pom.xml +++ b/Classification/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml tribuo-classification diff --git a/Clustering/Core/pom.xml b/Clustering/Core/pom.xml index b9fe82fd0..490e39065 100644 --- a/Clustering/Core/pom.xml +++ b/Clustering/Core/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-clustering - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Clustering-Core diff --git a/Clustering/Hdbscan/pom.xml b/Clustering/Hdbscan/pom.xml index e6caaed43..4116dea84 100644 --- a/Clustering/Hdbscan/pom.xml +++ b/Clustering/Hdbscan/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-clustering - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Clustering-Hdbscan diff --git a/Clustering/KMeans/pom.xml b/Clustering/KMeans/pom.xml index 15f849d8e..155c1a350 100644 --- a/Clustering/KMeans/pom.xml +++ b/Clustering/KMeans/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-clustering - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Clustering-KMeans diff --git a/Clustering/pom.xml b/Clustering/pom.xml index 44bb0e371..bf1bcf32e 100644 --- a/Clustering/pom.xml +++ b/Clustering/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml tribuo-clustering diff --git a/Common/LibLinear/pom.xml b/Common/LibLinear/pom.xml index 5ff8d6252..d67fa2ccf 100644 --- a/Common/LibLinear/pom.xml +++ b/Common/LibLinear/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-common - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Common-LibLinear diff --git a/Common/LibSVM/pom.xml b/Common/LibSVM/pom.xml index 1dc9fc3ea..2dbdaca26 100644 --- a/Common/LibSVM/pom.xml +++ b/Common/LibSVM/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-common - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Common-LibSVM diff --git a/Common/NearestNeighbour/pom.xml b/Common/NearestNeighbour/pom.xml index cf458f45c..868e39e71 100644 --- a/Common/NearestNeighbour/pom.xml +++ b/Common/NearestNeighbour/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-common - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Common-NearestNeighbour diff --git a/Common/SGD/pom.xml b/Common/SGD/pom.xml index a94d2dfae..185f82117 100644 --- a/Common/SGD/pom.xml +++ b/Common/SGD/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-common - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Common-SGD diff --git a/Common/Trees/pom.xml b/Common/Trees/pom.xml index fc929a87f..d3c273237 100644 --- a/Common/Trees/pom.xml +++ b/Common/Trees/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-common - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Common-Tree diff --git a/Common/XGBoost/pom.xml b/Common/XGBoost/pom.xml index 2e6eb4034..693732895 100644 --- a/Common/XGBoost/pom.xml +++ b/Common/XGBoost/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-common - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Common-XGBoost diff --git a/Common/pom.xml b/Common/pom.xml index 252617bef..7f50f0297 100644 --- a/Common/pom.xml +++ b/Common/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml tribuo-common diff --git a/Core/pom.xml b/Core/pom.xml index 875a7d665..9abaaca27 100644 --- a/Core/pom.xml +++ b/Core/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Core diff --git a/Data/pom.xml b/Data/pom.xml index d48a0d2e8..27373b730 100644 --- a/Data/pom.xml +++ b/Data/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Data diff --git a/Interop/Core/pom.xml b/Interop/Core/pom.xml index e481c8461..53ad6fd6b 100644 --- a/Interop/Core/pom.xml +++ b/Interop/Core/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-interop - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Interop-Core diff --git a/Interop/OCI/pom.xml b/Interop/OCI/pom.xml index b479cad6e..6aa4e281e 100644 --- a/Interop/OCI/pom.xml +++ b/Interop/OCI/pom.xml @@ -20,7 +20,7 @@ org.tribuo tribuo-interop - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml OCI diff --git a/Interop/ONNX/pom.xml b/Interop/ONNX/pom.xml index 3c5023369..b89dc5a85 100644 --- a/Interop/ONNX/pom.xml +++ b/Interop/ONNX/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-interop - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Interop-ONNX diff --git a/Interop/Tensorflow/pom.xml b/Interop/Tensorflow/pom.xml index e04fc119d..d5c6fecf7 100644 --- a/Interop/Tensorflow/pom.xml +++ b/Interop/Tensorflow/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-interop - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Interop-Tensorflow diff --git a/Interop/pom.xml b/Interop/pom.xml index 56b0c0252..79e812d08 100644 --- a/Interop/pom.xml +++ b/Interop/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml tribuo-interop diff --git a/Json/pom.xml b/Json/pom.xml index dcf76472d..4c82a4355 100644 --- a/Json/pom.xml +++ b/Json/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo - 4.2.0-SNAPSHOT + 4.2.0 4.0.0 Json diff --git a/Math/pom.xml b/Math/pom.xml index 212fa37ab..af713ae8c 100644 --- a/Math/pom.xml +++ b/Math/pom.xml @@ -20,7 +20,7 @@ org.tribuo tribuo - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Math diff --git a/MultiLabel/Core/pom.xml b/MultiLabel/Core/pom.xml index 8f70b4d8f..1c255d12f 100644 --- a/MultiLabel/Core/pom.xml +++ b/MultiLabel/Core/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-multilabel - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml MultiLabel-Core diff --git a/MultiLabel/SGD/pom.xml b/MultiLabel/SGD/pom.xml index d9b45b398..3fdb28cbd 100644 --- a/MultiLabel/SGD/pom.xml +++ b/MultiLabel/SGD/pom.xml @@ -20,7 +20,7 @@ org.tribuo tribuo-multilabel - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml MultiLabel-SGD diff --git a/MultiLabel/pom.xml b/MultiLabel/pom.xml index e254bb591..074f61827 100644 --- a/MultiLabel/pom.xml +++ b/MultiLabel/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml tribuo-multilabel diff --git a/README.md b/README.md index 398aaf60e..58aecc830 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

Tribuo Logo

-# Tribuo - A Java prediction library (v4.1) +# Tribuo - A Java prediction library (v4.2) [Tribuo](https://tribuo.org) is a machine learning library in Java that provides multi-class classification, regression, clustering, anomaly detection @@ -26,7 +26,8 @@ trainer. In the case of evaluations, this provenance information also includes the specific model used. Provenance information can be extracted as JSON, or serialised directly using Java serialisation. For production deployments, provenance information can be redacted and replaced with a hash to provide -model tracking through an external system. +model tracking through an external system. Many Tribuo models can be exported +in ONNX format for deployment in other languages, platforms or cloud services. Tribuo runs on Java 8+, and we test on LTS versions of Java along with the latest release. Tribuo itself is a pure Java library and is supported on all @@ -44,7 +45,7 @@ deployment. * [Library Architecture](docs/Architecture.md) * [Package Overview](docs/PackageOverview.md) -* Javadoc [4.1](https://tribuo.org/learn/4.1/javadoc/), [4.0](https://tribuo.org/learn/4.0/javadoc/) +* Javadoc [4.2](https://tribuo.org/learn/4.2/javadoc), [4.1](https://tribuo.org/learn/4.1/javadoc/), [4.0](https://tribuo.org/learn/4.0/javadoc/) * [Helper Programs](docs/HelperPrograms.md) * [Developer Documentation](docs/Internals.md) * [Roadmap](docs/Roadmap.md) @@ -54,11 +55,12 @@ deployment. Tutorial notebooks, including examples of Classification, Clustering, Regression, Anomaly Detection, TensorFlow, document classification, columnar -data loading, working with externally trained models, and the configuration -system, can be found in the [tutorials](tutorials). These use the -[IJava](https://github.com/SpencerPark/IJava) Jupyter notebook kernel, and -work with Java 10+. To convert the tutorials' code back to Java 8, in most -cases simply replace the `var` keyword with the appropriate types. +data loading, working with externally trained models, and the configuration +system, can be found in the [tutorials](tutorials). These use the +[IJava](https://github.com/SpencerPark/IJava) Jupyter notebook kernel, and work +with Java 10+, except the reproducibility tutotiral which requires Java 17. To +convert the tutorials' code back to Java 8, in most cases simply replace the +`var` keyword with the appropriate types. ## Algorithms @@ -78,7 +80,7 @@ of prediction tasks: The ensembles and K-NN use a combination function to produce their output. These combiners are prediction task specific, but the ensemble & K-NN implementations are task agnostic. We provide voting and averaging combiners -for classification and regression tasks. +for multi-class classification, multi-label classification and regression tasks. ### Classification @@ -99,9 +101,10 @@ Tribuo has implementations or interfaces for: Tribuo also supplies a linear chain CRF for sequence classification tasks. This CRF is trained via SGD using any of Tribuo's gradient optimizers. -To explain classifier predictions there is an implementation of the LIME algorithm. Tribuo's -implementation allows the mixing of text and tabular data, along with the use of any sparse model -as an explainer (e.g., regression trees, lasso etc), however it does not support images. +To explain classifier predictions there is an implementation of the LIME +algorithm. Tribuo's implementation allows the mixing of text and tabular data, +along with the use of any sparse model as an explainer (e.g., regression trees, +lasso etc), however it does not support images. ### Regression @@ -181,13 +184,13 @@ Maven: org.tribuo tribuo-all - 4.1.0 + 4.2.0 pom ``` or from Gradle: ```groovy -implementation ("org.tribuo:tribuo-all:4.1.0@pom") { +implementation ("org.tribuo:tribuo-all:4.2.0@pom") { transitive = true // for build.gradle (i.e., Groovy) // isTransitive = true // for build.gradle.kts (i.e., Kotlin) } @@ -201,12 +204,12 @@ interfaces link to libraries which use native code. Those interfaces (TensorFlow, ONNX Runtime and XGBoost) only run on supported platforms for the respective published binaries, and Tribuo has no control over which binaries are supplied. If you need support for a specific platform, reach out to the -maintainers of those projects. As of the 4.1 release these native packages -all provide x86\_64 binaries for Windows, macOS and Linux. It is also possible -to compile each package for macOS ARM64 (i.e., Apple Silicon), though there are -no binaries available on Maven Central for that platform. When developing -on an ARM platform you can select the `arm` profile in Tribuo's pom.xml to -disable the native library tests. +maintainers of those projects. As of the 4.1 release these native packages all +provide x86\_64 binaries for Windows, macOS and Linux. It is also possible to +compile each package for macOS ARM64 (i.e., Apple Silicon), though there are no +binaries available on Maven Central for that platform. When developing on an +ARM platform you can select the `arm` profile in Tribuo's pom.xml to disable +the native library tests. Individual jars are published for each Tribuo module. It is preferable to depend only on the modules necessary for the specific project. This prevents @@ -251,10 +254,12 @@ Tribuo is licensed under the [Apache 2.0 License](./LICENSE.txt). ## Release Notes: -- v4.1.0 - Added TensorFlow training support, a BERT feature extractor, ExtraTrees, K-Means++, many linear model & CRF performance improvements, new tutorials on TF and document classification. Many bug fixes & documentation improvements. -- v4.0.2 - Many bug fixes (CSVDataSource, JsonDataSource, RowProcessor, LibSVMTrainer, Evaluations, Regressor serialization). Improved javadoc and documentation. Added two new tutorials (columnar data and external models). -- v4.0.1 - Bugfix for CSVReader to cope with blank lines, added IDXDataSource to allow loading of native MNIST format data. -- v4.0.0 - Initial public release. +- [v4.2.0](https://github.com/oracle/tribuo/blob/main/docs/release-notes/tribuo-v4-2-release-notes.md) - Added factorization machines, classifier chains, HDBSCAN. Added ONNX export and OCI Data Science integration. Added reproducibility framework. Various other small fixes and improvements, including the regression fixes from v4.1.1. Filled out the remaining javadoc, added 4 new tutorials (onnx export, multi-label classification, reproducibility, hdbscan), expanded existing tutorials. +- [v4.1.1](https://github.com/oracle/tribuo/blob/main/docs/release-notes/tribuo-v4-1-1-release-notes.md) - Bug fixes for multi-output regression, multi-label evaluation, KMeans & KNN with SecurityManager, and update TF-Java 0.4.0. +- [v4.1.0](https://github.com/oracle/tribuo/blob/main/docs/release-notes/tribuo-v4-1-release-notes.md) - Added TensorFlow training support, a BERT feature extractor, ExtraTrees, K-Means++, many linear model & CRF performance improvements, new tutorials on TF and document classification. Many bug fixes & documentation improvements. +- [v4.0.2](https://github.com/oracle/tribuo/blob/main/docs/release-notes/tribuo-v4-0-2-release-notes.md) - Many bug fixes (CSVDataSource, JsonDataSource, RowProcessor, LibSVMTrainer, Evaluations, Regressor serialization). Improved javadoc and documentation. Added two new tutorials (columnar data and external models). +- [v4.0.1](https://github.com/oracle/tribuo/blob/main/docs/release-notes/tribuo-v4-0-1-release-notes.md) - Bugfix for CSVReader to cope with blank lines, added IDXDataSource to allow loading of native MNIST format data. +- [v4.0.0](https://github.com/oracle/tribuo/blob/main/docs/release-notes/tribuo-v4-0-release-notes.md) - Initial public release. - v3 - Added provenance system, the external model support and onnx integrations. - v2 - Expanded beyond a classification system, to support regression, clustering and multi-label classification. - v1 - Initial internal release. This release only supported multi-class classification. diff --git a/Regression/Core/pom.xml b/Regression/Core/pom.xml index cbcfa0534..bf0f2a7a3 100644 --- a/Regression/Core/pom.xml +++ b/Regression/Core/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-regression - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Regression-Core diff --git a/Regression/LibLinear/pom.xml b/Regression/LibLinear/pom.xml index 60522800d..ad1b51be8 100644 --- a/Regression/LibLinear/pom.xml +++ b/Regression/LibLinear/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-regression - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Regression-LibLinear diff --git a/Regression/LibSVM/pom.xml b/Regression/LibSVM/pom.xml index b64bd14be..a70121f19 100644 --- a/Regression/LibSVM/pom.xml +++ b/Regression/LibSVM/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-regression - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Regression-LibSVM diff --git a/Regression/RegressionTree/pom.xml b/Regression/RegressionTree/pom.xml index 0138b1bc7..040befb00 100644 --- a/Regression/RegressionTree/pom.xml +++ b/Regression/RegressionTree/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-regression - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Regression-Tree diff --git a/Regression/SGD/pom.xml b/Regression/SGD/pom.xml index 6544746bc..4b8c2a6ae 100644 --- a/Regression/SGD/pom.xml +++ b/Regression/SGD/pom.xml @@ -20,7 +20,7 @@ org.tribuo tribuo-regression - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Regression-SGD diff --git a/Regression/SLM/pom.xml b/Regression/SLM/pom.xml index a0852bfed..96451d4d8 100644 --- a/Regression/SLM/pom.xml +++ b/Regression/SLM/pom.xml @@ -20,7 +20,7 @@ org.tribuo tribuo-regression - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Regression-SLM diff --git a/Regression/XGBoost/pom.xml b/Regression/XGBoost/pom.xml index 292b90ae1..44b7ae1ba 100644 --- a/Regression/XGBoost/pom.xml +++ b/Regression/XGBoost/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-regression - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Regression-XGBoost diff --git a/Regression/pom.xml b/Regression/pom.xml index 9994f5463..d8012f4fb 100644 --- a/Regression/pom.xml +++ b/Regression/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml tribuo-regression diff --git a/Reproducibility/pom.xml b/Reproducibility/pom.xml index ce95e9256..03d4aa78e 100644 --- a/Reproducibility/pom.xml +++ b/Reproducibility/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo - 4.2.0-SNAPSHOT + 4.2.0 4.0.0 Reproducibility diff --git a/THIRD_PARTY_LICENSES.txt b/THIRD_PARTY_LICENSES.txt index d779c402d..359ab25aa 100644 --- a/THIRD_PARTY_LICENSES.txt +++ b/THIRD_PARTY_LICENSES.txt @@ -1943,7 +1943,7 @@ of the input file used when generating it. This code is not standalone and requires a support library to be linked with it. This support library is itself covered by the above license. -oci-java-sdk 2.11.1 - Dual licensed UPL/Apache 2.0 +oci-java-sdk 2.12.0 - Dual licensed UPL/Apache 2.0 Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. diff --git a/Util/InformationTheory/pom.xml b/Util/InformationTheory/pom.xml index 8c5555f26..8e8810785 100644 --- a/Util/InformationTheory/pom.xml +++ b/Util/InformationTheory/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-util - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml InformationTheory diff --git a/Util/ONNXExport/pom.xml b/Util/ONNXExport/pom.xml index 1462c062c..9302597d8 100644 --- a/Util/ONNXExport/pom.xml +++ b/Util/ONNXExport/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-util - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml ONNXExport diff --git a/Util/Tokenization/pom.xml b/Util/Tokenization/pom.xml index 0a4badd6b..c21a59d6a 100644 --- a/Util/Tokenization/pom.xml +++ b/Util/Tokenization/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo-util - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml Tokenization diff --git a/Util/pom.xml b/Util/pom.xml index ec97f0ba1..c68645118 100644 --- a/Util/pom.xml +++ b/Util/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml tribuo-util diff --git a/distribution/pom.xml b/distribution/pom.xml index 146429d9f..4421cb376 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -21,7 +21,7 @@ org.tribuo tribuo - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml diff --git a/docs/Roadmap.md b/docs/Roadmap.md index 85f2cae2a..73dd4790a 100644 --- a/docs/Roadmap.md +++ b/docs/Roadmap.md @@ -96,4 +96,4 @@ in a Tribuo compatible interface, but the codebase isn't quite ready for release - Add more tutorials. - Tribuo 4.0.2 adds tutorials for external model loading and columnar data processing. - Tribuo 4.1 adds tutorials for TensorFlow and document classification. - - Tribuo 4.2 adds tutorials for multi-label classification, ONNX export, and model reproducibility. + - Tribuo 4.2 adds tutorials for multi-label classification, HDBSCAN clustering, ONNX export, and model reproducibility. diff --git a/pom.xml b/pom.xml index aa5b22859..524d52bca 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ 4.0.0 org.tribuo tribuo - 4.2.0-SNAPSHOT + 4.2.0 pom Core @@ -282,7 +282,7 @@ Utility Packages - org.tribuo.util.*:org.tribuo.tests + org.tribuo.util.*:org.tribuo.reproducibility:org.tribuo.tests @@ -339,7 +339,7 @@ Utility Packages - org.tribuo.util.* + org.tribuo.util.*:org.tribuo.reproducibility:org.tribuo.tests diff --git a/tests/pom.xml b/tests/pom.xml index 23ac752e8..56d1f6d15 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -21,7 +21,7 @@ tribuo org.tribuo - 4.2.0-SNAPSHOT + 4.2.0 ../pom.xml 4.0.0 diff --git a/tutorials/README.md b/tutorials/README.md index a51c8334e..becfc2e4b 100644 --- a/tutorials/README.md +++ b/tutorials/README.md @@ -14,7 +14,7 @@ The tutorials cover: - [Intro regression with wine-quality](regression-tribuo-v4.ipynb) - [Configuration files, provenance and feature transformations on MNIST](configuration-tribuo-v4.ipynb) - [Clustering with K-Means](clustering-tribuo-v4.ipynb) -- [Clustering with HDBSCAN*](clustering-hdbscan-tribuo-v4.ipynb) +- [Clustering with HDBSCAN\*](clustering-hdbscan-tribuo-v4.ipynb) - [Anomaly Detection with LibSVM](anomaly-tribuo-v4.ipynb) - [Multi-label classification with Classifier Chains](multi-label-tribuo-v4.ipynb) - [Loading columnar data](columnar-tribuo-v4.ipynb) diff --git a/tutorials/anomaly-tribuo-v4.ipynb b/tutorials/anomaly-tribuo-v4.ipynb index 24fe2e523..38b12d05d 100644 --- a/tutorials/anomaly-tribuo-v4.ipynb +++ b/tutorials/anomaly-tribuo-v4.ipynb @@ -19,7 +19,7 @@ "metadata": {}, "outputs": [], "source": [ - "%jars ./tribuo-anomaly-libsvm-4.2.0-SNAPSHOT-jar-with-dependencies.jar" + "%jars ./tribuo-anomaly-libsvm-4.2.0-jar-with-dependencies.jar" ] }, { @@ -111,7 +111,7 @@ "obj = 289.5926348816893, rho = 3.144570476807895\n", "nSV = 296, nBSV = 114\n", "\n", - "Training took (00:00:00:179)\n" + "Training took (00:00:00:147)\n" ] } ], @@ -210,7 +210,7 @@ "mimetype": "text/x-java-source", "name": "Java", "pygments_lexer": "java", - "version": "17+0" + "version": "17.0.1+12-LTS-39" } }, "nbformat": 4, diff --git a/tutorials/clustering-hdbscan-tribuo-v4.ipynb b/tutorials/clustering-hdbscan-tribuo-v4.ipynb index 5e26406d3..a87c72b7d 100644 --- a/tutorials/clustering-hdbscan-tribuo-v4.ipynb +++ b/tutorials/clustering-hdbscan-tribuo-v4.ipynb @@ -19,7 +19,7 @@ "metadata": {}, "outputs": [], "source": [ - "%jars ./tribuo-clustering-hdbscan-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n", + "%jars ./tribuo-clustering-hdbscan-4.2.0-jar-with-dependencies.jar\n", "%jars ./xchart-3.8.1.jar" ] }, @@ -166,9 +166,9 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPAAAqeklEQVR4Xu3dCXhU5dnG8UkIJEAggCAaEapQRDYBG6yWTQQKWgxgrSLaBmVVpIAsolEDookRgoiALBGCgsiODRA22RMIBJK0fq3f12otrbWLdRcswvs9h5Fk8oQkk2QyZybn/7vey2s87z2Hk5PM3HNmO658AAAczKUXAADgJBQhAMDRKEIAgKNRhAAAR6MIAQCORhECAByNIgQAOBpFCABwNIoQAOBoAV2EM2fOLLg8Z86cmQAAlN/ChQs9ukULmiKUywYAgPLzbJPiKEIAQDVHEQIAHI0iBAA4GkUIAHA0ihAA4GgUIQDA0ShCAICjUYQAgODz1Vfmd78zZ87o5RVAEQIAgsknn5hhw0xIiHG5TM2aZvx48/XXOlMuFCEAoGp9/rn54gu9sGLOnzc9e1oV6Dnuv1/HyoUiBABUlcxM07nz93V1003m+HEdKK+tW3ULusfvfqeT3qMIAQBV4sQJ66lLz7qKiDC//72OlcuMGboC3WPFCp30HkUIAKgSffvqupIxeLCOlcvChXqF7pGerpPeowgBAFWifn1dVzKuvFLHyuWPf7QOK9U6Gzc2n36qk96jCAEAVaJZM91YMtq00bHyWrTIhIUVrrB2bbN5s86UC0UIAKgSI0boFpQxYYKOVcCRI2bcONOnj7W2Sr7oaChCAEAV+eQT06pVkRZs185nn6PwIYoQAFBVvvzSPPWU9cm/3r2tN3x+840OBAKKEADgaBQhAMDRKEIAgKNRhAAAR6MIAQCORhECCEr//KfZtcv8z//o5fChr782WVnWh/YC892evkIRAggyX31lRo4s/GjajTdSh1Vi+XITFfX9Tm7QwLzxhg5UGxQhgCBT/PtKfvCDQPyYdlDbvv37M98WDPnfPXt0rGJ+8xvr+7ibNze9elW2X+WY9dgx65P7lUERAggmf/ubvoN2j1de0UlUxi236D0s49ZbdawCUlL0aqdN0xlvnD5tJk0yoaHfr+SnPzWnTumMl+wpwiVLlsR4mDBhgk54gSIEHEiOVIrfQcsYOVInURl16+o9LKNRIx0rL+mq8HC9WimzvDydLNPYsXo9HTqYb7/VMW/YU4SJiYkRERGxFyUkJOiEFyhCwIF++1t99+ce3Af41nXX6T0so2NHHSuvNWv0Ot1j3jydLN1f/nLpJwbS0nTSG7YVYbNmzfTScqIIAQf67jvr7ljd/dWqZRUkfOjpp/VOlvHcczpWXitX6nW6x4sv6mTptmzRa3CPX/9aJ71hWxE2atToySefTE1Nzc3N1dOlmunBc6H+yQBUU3l5RU50V7OmdYI6+Na335r+/Yt0zMCB5uxZHSuvP/7R1Kih20tGVpZOlk7yxVfiqmhV21OEr7/+emxsbNeuXUNDQ6+77ro9e/bohBcoQsCxPvvMvPSSeegh68AlP1/PwlfWrTPjx1uHWRs36qkKmzpVt9evfqUzZTpzxnqrsFqPPCSqwGuNxq4iLJCUlORyuQYPHqwnvEARAkAwWrDAXH+9VV2tWpnEROvp7go4cMD6dGNBC8qB5pw5OuMlm4tw//79UoSdOnXSE16gCAHAyU6dMk88YT1nK4ethw/rWe/ZU4QZGRnZ2dlyYcqUKVKEw4YN0wkvUIQAgMqzpwjHjBkj/VevXr3Q0NC+fftmZWXphBcoQgBA5dlThOKdd96R48LMzEw94TWKEABQebYVYeVRhACAyqMIAQCORhECAByNIgQAOBpFCABwNIoQAOBoFCEAwNEoQgBAGf7v/6xvOZ82zfoa7sqfgyLQUIQAgNIsWWIiIgq/3rpLF/O3v+lM6U6dMh99pBcGDooQAFCiEyes0xupEx4NGKBjJdmxw1x77ffXat3a7NunA4GAIgQAlGjyZN2C7vGPf+hkcZmZ+jS8tWqZkyd1zHYUIQCgRHfdpSvQPbw5p3yvXvpaMn72Mx2zHUUIACjR00/rJpMRGmo+/1wni4uM1FeU0bSpjtmOIgQAlOgvfzFRUbrMRo/WsUtq0UJfUUa7djpmO4oQAFCad94xV19d2GTDhpmvvtKZSxo3TregjMcf1zHbUYQAgDJ8/bVVh2vWmD/8QU+V4osvTMeORVowJsZ8842O2Y4iBABUlW+/NbNnm9hYM2iQmTcvQD+MTxECZXj3XfPvf+uFAKoNihAo0eLFpmHDwqd0fvtbHQBQDVCEwKWlpuoX+Rs3Nh9/rGMAgh1FCFxa06a6CGVMnqxjAIIdRQhcwocf6gp0j169dBJAsKMIgUv48kv9HYnu8fOf6ySAYEcRApfWt69uQRkrV+oYgGBncxEeOnQoIyPj5MmTavnRo0czPBw4cEAF8ilCVLH33zfNmhVpwaFDdQZANWBnEe7fv/+KK65wuVzbt29XU4mJiS4PgwYNUoF8ihBV77PPTEKC9WX5999v3nxTzwKoHmwrwtzc3K5duzZu3LikImzUqFHqRW+//bYK5FOEAABfsK0I4+LiWrdu/cwzz5RUhNdcc41aqFCEAIDKs6cI58yZExUVtW3btqSkpJKKsGbNmldddVXv3r0XL17sOTXTg+dC/ZMBAOAFG4pw8+bNdevWjY+Pz8jImDZtmhRhWlqaer/MwYMHpSbnzZvXvn37kJAQKU7PWTeKEABQeTYUobv8lPT0dJ27QJbL7M0336wnKEIAgC/YUIS7du0qeBdMXFyc9FxycvKxY8c2bdo0a9asLVu2eIYpQgBAlbKhCD0lJCS4Lr5GOGnSJLk8ffp0uZyUlDRhwoQZM2a0b98+NDR07ty5+poUIQDAF2wuwrfeemvs2LGHDx+WyytXrpTLq1evlstLlizp169fTEzM4MGD09LS9NUuoAgBAJVncxFWBkUIAKg8ihAA4GgUIQDA0SjCYPXtt+bPf9YLAQDlRREGn08/Nb/8pQkPt86HUK+emTHDnD2rMwAAL1GEQebcOdOtmz5J3q9/rWMAAC9RhEFmwwbdgjJCQ82HH+okAMAbFGGQmTZNt6B7SEECACqAIgwySUm6At3jnXd0EgDgDYowyOTmmho1dAtefrn58kudBAB4gyIMPs8+W6QFw8PN22/rDADASxRhUNq50wwbZrp3N2PGmHff1bMAAO9RhAAAR6MIAQCORhECAByNIgQAOBpFCABwNIoQAOBoFCEAwNEoQgCAo1GEAABHowgBAI5GEQIAHI0iBAA4ms1FmJmZmZGRcfLkST3hBYoQAFB5dhbh4cOHmzdv7nK5tm/frue8QBECACrPtiLMy8vr2bNnVFQURQgAsJFtRfjwww+3aNEiPj6eIgQA2MieIlywYEFkZOSmTZuSkpIoQgCAjWwowm3btkVFRaWkpMjlChThTA+eC/VPBgCAF2wowmnTprmKSU9P17myUIQAgMqzoQh37dqVelFcXJy0YHJy8rFjx3SuLBQhAKDybChCTwkJCa5yPjVagCIEAFSezUW4fPny2NjYAwcO6AkvUIQAgMqzuQgrgyIEAFQeRQgAcDSKEADgaBQhAMDRKEIAgKNRhAAAR6MIAQCORhECAByNIgQAOBpFCABwNIoQAOBoFCEAwNEoQgCAo1GEAABHowgBAI5GEQIAHI0iBAA4GkUIAHA0ihAA4GgUIQDA0ShCAICjUYQAAEejCAEAjkYRAgAcjSIEADiabUWYkZGRmpq6du3avLw8PecdihAAUHn2FGH//v0jIyOjo6NDQkJatGixY8cOFUhMTHR5GDRokArkU4QAAF+wpwjT09PdB4Lyz0vPjRo1SgWkCKOiomZdlJaWpgL5FCEAwBfsKcICycnJUoTx8fFquRShHCmqhQpFCACoPHuKMDc3d+zYsUOHDm3UqNGwYcNOnjypAlKEderUiYmJkdmNGzd6Ts304LlQ/2QAAHjBtiKMjY299dZbpe169+69d+9eFdi9e3dqaurjjz/erFmzmjVrLlu2TAXyOSIEAPiCPUVYYNWqVS6Xa8CAAXriovXr10ugR48eeoIiBAD4gs1FePz48dDQ0DZt2sjlnTt3ylGgHAt6Bnbs2CFFGBMT47nQjSIEAFSePUU4bty45OTkZcuWybGg9NzIkSNl4aRJk+Ty9OnT5fKCBQuSkpKWLFnSvXt3WZiQkKBXQRECAHzBniIcPnx4x44do6Oj5b9Tp07Nzc2VhQsXLoyNjZXyk8spKSnuwM033yyVqa9/AUUIAKg8e4rQJyhCAEDlUYQAAEejCAEAjkYRAgAcjSIEADgaRQgAcDSKEADgaBQhAMDRKEIAZVi50vTta1q2NLGx5uBBPQsEO4oQQGnGjzcuV+EIDTVpaToDBDWKEECJsrJMSEiRIpRRv775z390EgheFCHgOH/6k3n9dfPmm+bPf9ZTyrPP6hZ0jx07dBIIXhQh4CxPPmnCwr7vs5o1zfPP64AnCRdvQRmbN+skELwoQsBBUlN1pclYu1bHCmzbpsOuC/X50Uc6CQQvihBwkE6ddKvJ6NZNxzzdcYfOJyToDBDUKELAQcLDdavJaNxYxzydOWMef9w0bWolW7Uyr76qA0CwowgBB2nXTregjB//WMcuSRoRqJYoQsBBXnpJt6CMZct0DPCbjz4yI0ZYD9E6dTJTppgvvtABP6AIgYo7f95s324SE60nDD/8UM8GoHPnzOjRhRUYEmImTtQZb+zbZ5KTzfz55r339BTgvQ8+MJddVuRhWevWNnQhRQhU0CefmF69Cm/AdepY78kMCseOmeeeM0lJJjdXT5Xp9GkzeHDhT13mBzCAUtx5Z5EWdI/Jk3WsqlGEQAUNHapvwNIKOTk6FmgOHjQdOny/wTfeaI4e1YHSyZ1U8Xuubdt0DCjTuXOmXj39tySjc2edrGoUIVARX3xhfetm8dvw+PE6GVCOHy/8NL17RESYd9/VsZKcP28aNtQ/sowhQ3QSKNN//2v9+RX/c2rbVierGkUIVERurr71useAAToZUG67TW+wjEGDdKwk//qXvq57dOyok4A3evbUf0syRo3SsapGEQIV8fXX+tDKPSZN0smAcslnoq68UsdK0aSJvrqMe+7RMcAbJ06YWrWK/C01bmz+/ncdq2oVL8IRI0YsXrxYL/UjihD2GjNG90Ht2uYPf9CxgNKsmd5mGddfr2OlKP413KGh5tAhHQO8JF3Yq5d125FHaYMGlf1F8FWh4kU4derUsLCwvn377ty5U8+V5dVXX7333ntvv/32IUOGzJ8/X097hyKEvb76yvziF4V9cNllPv4q6g8+MCkpZuxY88orlTrtkTy+fuklaz3y3/vv1zUm47HH9FVKcfastaqCczNFRvIxRPjAuXN6iT9VvAjFxo0bb7zxxjp16kyYMOHEiRN6umQPPvigHFDGx8d36NDB5XKlpKTohBcoQgSCvDzrUxNbtphPP9VTlbFhQ5GnMaOjrc88VMA775hGjQrX07ChPijs2NF8+aW+VpnkwHfFCmsjP/5YTwFBp1JF6CYt6CpKJ0q2bNkyyUsp6gkvUISork6dMlFRRepKxg9/aH2Gr1ykm6+8Uq+naVPru0Nvu83062d9mpAvTgMqVYTHjx9/9NFH5YhQyqxJkybRF+lcCbKzs2NjY8PDw1evXq3nvEARorpatEi3l3vs36+TpZMjtuIrkbF+vU4CTlbxIly0aNFVV10lFdi0adPExEQ9Xarc3FzpS7lu3bp1y/sa4UwPngv1TwYELTliK95eMl5/XSdLl5Ki1+Aec+boJOBkFS/Cvn37ysHc6NGj5cBOz3khIyNj6dKlPXv2DAsL4zVCwNOqVbq63KO834i2a5deg3vs3KmTgJNVvAhnzJghZaaXltPRo0dDQ0NvuOEGPeEFihDV1enTpk0b3V63365jZfruO+sUS2o9N91kLQdQoOJFWBkFB5GbNm1yuVxdu3YtOu8VihCB7z//sc5NcffdZsIEc+CAni3Fe++ZmJjC9rrzTutbXSrg1Clz662F6+nVy/zlLzoDOJw9RXj99dd36NChe/fukZGR9evXX7lypU54gSJEgPvtb62PPRSUUEiISUjQmVKcO2d9NmPTJh+c6ki2RNYj/wVQnD1FKAeCiYmJs2bNSklJOXz4sJ72DkWIANeli35aMjTUOvkDqqXz5826ddah/5QpZvduPYtAZk8R+gRFiAr74guTmWn+/W+93Ifef1+3oHsE5peRfvKJtUM++0wvh5e++cb07l3kFx0XZ1UjggJFCGf58ssi3xF6++3mo490xicOH9YV6B5Dh+qkvf7xDxMbW7h5w4ebzz/XGZRJHt8U/10vXqxjCEwUIZxl2DB9b/WjH1nfn+lz0riXPD1FcrJO2ujcOXPLLXoLOblgBVxxhd6NrgtvTUJQoAjhIL//vb6rco9163TSJ6ZP1//Q1VcH1tOP6el6C93jxAmdRCnOnLn0WZqvvVYnEZgoQjhISR9Uf+IJnfQJOdCUNRccF8bEWE0cUOR2U3xvyEhN1UmUrvjnPmXExuoYAhNFCAfZs0ffVbnHyy/rpA999ZU5ciRAP723ZIneFe4hR4ool9df1/uwRg2TlaVjCEwUIRxEOumqq/QdVkSE+eMfddIhPvzQ1K2rd0jTpoH1/G2wmDPH+lty78NGjczatTqAgEURwll27zb16xfe6desaR0VOdnKlaZWrcIdEhlptm3TGXjp00+t73c9fNh6yIUgQhHCceQwKD7eem/kpEnl/hrraul3v7NOUi87ZPp06+OPgNNQhAAAR6MIAQCORhECdsrJsc5Ncd11pl8/s2yZngXgBxQhYJvNm61363i+Y/Ohh3QGQFWjCAF7nD5tLr+8SAu6x65dOgmgSlGEgD2ysnQFusfUqToJoEpRhIA9Svqam3HjdBJAlaIIAXt89lnhF5F4jtWrdRJAlaIIAdskJ+sW7NbNOjUSAH+iCAGfOX3aTJtm2rUzDRtaH4c4elQHinvtNdOypVWBcpVHHrHOYgjAzyhCwDe++87cfHORw7uwMJORoWOXRP8BNqIIAd9YtEg/zymjRQsdAxBoKELAN+65R7ege/zpTzoJIKBQhIBv/OIXugLdw7EnOwSCBUUI+MYrr+gKlNGsmY4BCDS2FWFeXl5GRkZWVpae8BpFiIBy9qyJiSnSgjVqmPR0HasYWbmf+f9fBOxiTxH27NkzLCzM5XKFhIT06dMnMzNTBV566aVoD3FxcSqQTxEi8Hz9tZk40bRqZerVMz17Wmcqr7ylS61zU0itRkdbJ849c0YHfC4nx/ToYX3YX36KO+80f/6zDgDVjD1FGB8fL4eDJ0+eHDt2rNThgw8+qAKJiYmRkZFjL5o3b54K5FOEcAD5u1bPtf7sZzrjW9KCtWoV+RcbNzZ//7uOAdWJPUVYYM2aNVKEAwYMUMulCJs3b64WKhQhqjepH9VJ7rFtm076kBwLFv8XR47UMaA6sbkIH3jgASnC2bNnq+VShPXr14+NjX3sscf27t3rOTXTg+dC/ZMBQW7LFl1I7vHkkzrpK//976W//rRtW50EqhM7i/CFF14IDQ0dPXq0nsjP37p166xZs+Li4ho0aFCvXr21a9fqBEeEqO527NCF5B5V98d+7pyJjNT/nIwuXXQSqE5sK8L4+Pjw8PDS/3mRlpYmh4x9+vTRExQhqrv//MfUr687KSTEZGbqpA/deaf+F12cIhHVXelNVFVF+NRTT0m9vfjii54LMzMzi3+gYs+ePZLs0qWL50I3ihDV3ooVJjS0SCc98ojO+NYHH5jLLivyL153HV+FimrOhiKUbqtRo4YcDsZeJEeHsnzSpEnSedOnT8+/cCC4YsWK9PT0QYMGycKJEyfqtVCEcIb9+62jtGuvNb17m+XL9WxV+Ogj690x7dubzp2tk2nQgqj2bCjC3bt3xxT1yCOPyPLk5GS5PHfuXLk8Y8aMpk2bSgW2bNlSWjA3N1evhSIEAPiCDUXoKxQhAKDyKEIAgKNRhAAAR6MIAQCORhECAByNIgQAOBpFCABwNIoQAOBoFCEAwNEoQgCAo1GEAABHowgBAI5GEQIAHI0iBAA4GkUIAHA0ihAA4GgUIQDA0ShCAICjUYQAAEejCAEAjkYRAgAcjSIEADgaRRiIli0zXbuaJk1M9+5mwwY9CwDwIYow4Iwfb1yuIuOFF3QGAOArdhZhTk6OXlQe1bIIc3JMSIguwvBwc+qUTgIAfMKeIhwwYEDt2rVdLld4eHhsbGx2drZOeKFaFuGcOboF3WPNGp0EAPiEPUU4ceLEDRs27NmzJy4uTupw1KhROuGFalmEL76oK9A9Vq/WSQCAT9hThAXWrFkjRdi/f3894YVqWYRHjugKlBEWZj74QCcBAD5hcxGOGDFCivC5557TE16olkUoHnpIF+HTT+sMAMBX7CzC+fPn16hR47777tMTpZrpwXOh/smC1rlz1iuF7dtbB4KdOpnly3UAAOBDthVhUlJSeHj4lClT9ITXqmsRAgD8yZ4iTExMDA0NTUhI0BPlQRECACrPhiLcu3dvrVq16tSpM/ailJQUHfICRQgAfvbpp2bJEjNpkpk/33z8sZ4NUjYUYUZGRnRR5X2Z0I0iBAB/ys42zZoVvo+vYUOTkaEzwciGIvQVihAA/Oabb0yrVvo97Y0bm3/+UyeDDkUIACjb7t26Bd1jxQqdDDoUIQCgbEuX6gp0j2ee0cmgQxECAMqWlaUr0D3WrdPJoEMRAgDKdv686dlTt+D115vTp3Uy6FCEAACv/O1v5rbbClvwxhvNe+/pTDCiCAEA3pLjwtxc63w4OTnm7Fk9G6QoQgCAo1GEAABHowgBAI5GEQIAHI0iBAA4GkUIAHA0ihAA4GgUIQDA0ShCAICjUYQAAEejCAEAjkYRAgAcjSIEADgaRQgAcDSKEADgaBQhAMDRKEIAgKNRhAAAR6MIAQCOZk8RZmZmJicn33333T/4wQ82b96sp/PzlyxZEuNhwoQJOkERAgB8wZ4iXLx4ca9evdq3b+9yuS5ZhImJiREREbEXJSQk6ARFCADwBXuK0G3o0KGlFOHVV1+tlxZFEQIAKi9wi7BRo0Zjx4598cUXjx075jk104PnQv2T+c7775vly828eebYMT0FAAh2AVqE69evlxbs379/rVq1oqOjt27dqhP+OiKU/gsPNy7X9+P++8233+oMACB4BWgRFnjllVckc8cdd+gJvxTh7t0mJKSwBd3jySd1DAAQvAK9CPft2yeZzp076wm/FOHdd+sWlHHZZToGAAhe9hRhdnZ2RkbGwIEDpeSWLl26a9cuWThp0iT53+nTp8vlTZs2SeD48eMjR46UhSNGjNCr8EsRduyoW9A9/vUvnQQABCl7inDx4sXRHjp27CgLn376abk8a9YsuTx58uSQkBCpwNq1a997773SiHoVfilCjggBoNqzpwi9kZeX5z5SLIkfinDPnku8Rhgfr2MAgOAVuEVYJj8UoZg/30REFLbgAw/wrlEAqFYowrJ98IFJSzMvv2xycvQUACDYUYQAAEejCAEAjkYRAgAcjSIEADgaRQgAcDSK0H8OHzZTpphRo8yiReb0aT3rjR07zMSJ5uGHzYoV5rvv9CwAoAIoQj954okin81v08b89a86U7q4uCKf6+/a1Xz2mc5AOXPGHD9u8vLMuXN6CgDcKEJ/yMjQX08j4/bbdawUqan66jJGjtQxeFqyxNSr9/2+io4227bpAAAYitA/hg/XHSYjNNR8/rlOlqRfP311GQ0amPPndRJu69bp3VWzpjlxQscAgCL0h7599Z2ye/z+9zpZknbt9HVlhISUo0qd5pJ77Oc/1zEAoAj9YcoUfY8so25dc/asTpbkvvv01WVce62Owe3MGVOjht5dMlq21EkAoAj94dQpExWl75Sfe07HSpGXZ2rV0mtYvlzHUKBJE727ZPTooWMAQBH6SWamadXq+7vjsDDrXE7l/fzDtm3WOz7ca6hd26Sk6AA8PfywbkEZL7+sYwBAEfrPuXPWgd3+/RX/2MN//2u93ePQIfPll3oKyhdfmJtuKtKCd93FhygAXAJFiGpLjrlTU82DD5px48zGjXoWANwowmro7FkzY4bp0MF6P84tt5jt23UAAFCAIqyGBg7Ur4299prOAADcKMLqZvNm3YIy6tfnZUUAuDSKsLqZOFG3oHscOKCTAABDEVY/FCEAlAtFWN1s2aIr0MVTowBQMoqwGrrzTl2EfAcNAJTEniLMzs5euHDh8OHD27dvn56erqe948Mi/Ppr65nDt94y772np3zi3/82b79tHav94x96qiqcPWtmzTIdO1onIerWzToJFACgJPYU4aJFi370ox+1bt3a5XJt3rxZT3vHV0W4f79p3rzw4On++81XX+lMZSxYYOrU+X7l4eHmxRd1AABgI3uK0G3o0KG2F+Ff/2qd1U89kTh6tI5VWHq6XrmMN9/UMQCAXZxehAkJuqVcF87zV+GvA1V69dIrl9Gli44BAOwSfEU404PnQv2Teefuu3VLuUdmpk5WTOPGes0yIiLKd2b5U6dMXJxp3dp62W/CBE7GCwC+FHxFWMAnRXjJU+bK+PvfdbJiYmL0mmW0aaNjpfjTn0zDhkWu3qqVdWoFAIBPOL0IT540NWvqourXT8cqbP58vXIZzz+vY6W44w59dRmTJ+sYAKBi7CnC7OzsjIyMgQMHShEuXbp0165dOuEFnxShWLLEejNnQcd06mQ9Fekr589bpwHy7LB77inHKXklWbeubkEZnTvrJACgYuwpwsWLF0d76Nixo054wVdFKP73f83cudZh1ptvWie/9bn9+2VH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", "text/plain": [ - "BufferedImage@82b341e: type = 1 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 IntegerInterleavedRaster: width = 600 height = 400 #Bands = 3 xOff = 0 yOff = 0 dataOffset[0] 0" + "BufferedImage@5c4722f0: type = 1 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 IntegerInterleavedRaster: width = 600 height = 400 #Bands = 3 xOff = 0 yOff = 0 dataOffset[0] 0" ] }, "execution_count": 8, @@ -269,9 +269,9 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "BufferedImage@65e69c81: type = 1 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 IntegerInterleavedRaster: width = 600 height = 400 #Bands = 3 xOff = 0 yOff = 0 dataOffset[0] 0" + "BufferedImage@4d071d36: type = 1 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 IntegerInterleavedRaster: width = 600 height = 400 #Bands = 3 xOff = 0 yOff = 0 dataOffset[0] 0" ] }, "execution_count": 12, @@ -372,9 +372,9 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "BufferedImage@2aa283b8: type = 1 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 IntegerInterleavedRaster: width = 600 height = 400 #Bands = 3 xOff = 0 yOff = 0 dataOffset[0] 0" + "BufferedImage@1535978a: type = 1 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 IntegerInterleavedRaster: width = 600 height = 400 #Bands = 3 xOff = 0 yOff = 0 dataOffset[0] 0" ] }, "execution_count": 16, @@ -446,9 +446,9 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "BufferedImage@4c2e1b64: type = 1 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 IntegerInterleavedRaster: width = 600 height = 400 #Bands = 3 xOff = 0 yOff = 0 dataOffset[0] 0" + "BufferedImage@b571c2a: type = 1 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 IntegerInterleavedRaster: width = 600 height = 400 #Bands = 3 xOff = 0 yOff = 0 dataOffset[0] 0" ] }, "execution_count": 19, @@ -536,7 +536,7 @@ "mimetype": "text/x-java-source", "name": "Java", "pygments_lexer": "java", - "version": "11.0.12+8-LTS-237" + "version": "17.0.1+12-LTS-39" } }, "nbformat": 4, diff --git a/tutorials/clustering-tribuo-v4.ipynb b/tutorials/clustering-tribuo-v4.ipynb index 1d02b1e74..430bd36e9 100644 --- a/tutorials/clustering-tribuo-v4.ipynb +++ b/tutorials/clustering-tribuo-v4.ipynb @@ -4,9 +4,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Clustering Tutorial\n", + "# K-Means Clustering Tutorial\n", "\n", - "This guide will show how to use Tribuo’s clustering models to find clusters in a toy dataset drawn from a mixture of Gaussians. We'll look at Tribuo's K-Means implementation and also discuss how evaluation works for clustering tasks.\n", + "This guide will show how to use one of Tribuo’s clustering models to find clusters in a toy dataset drawn from a mixture of Gaussians. We'll look at Tribuo's K-Means implementation and also discuss how evaluation works for clustering tasks.\n", "\n", "## Setup\n", "\n", @@ -19,7 +19,7 @@ "metadata": {}, "outputs": [], "source": [ - "%jars ./tribuo-clustering-kmeans-4.2.0-SNAPSHOT-jar-with-dependencies.jar" + "%jars ./tribuo-clustering-kmeans-4.2.0-jar-with-dependencies.jar" ] }, { @@ -98,7 +98,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training with 5 clusters took (00:00:00:048)\n" + "Training with 5 clusters took (00:00:00:054)\n" ] } ], @@ -180,7 +180,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training with 5 clusters took (00:00:00:023)\n" + "Training with 5 clusters took (00:00:00:039)\n" ] } ], @@ -282,8 +282,8 @@ "data": { "text/plain": [ "Clustering Evaluation\n", - "Normalized MI = 0.8154291916732409\n", - "Adjusted MI = 0.8139169342020223" + "Normalized MI = 0.8154291916732408\n", + "Adjusted MI = 0.8139169342020222" ] }, "execution_count": 10, @@ -352,7 +352,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training with 5 clusters on 4 threads took (00:00:00:035)\n" + "Training with 5 clusters on 4 threads took (00:00:00:055)\n" ] } ], @@ -381,7 +381,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training with 20 clusters on 4 threads took (00:00:00:027)\n" + "Training with 20 clusters on 4 threads took (00:00:00:049)\n" ] } ], @@ -409,8 +409,8 @@ "data": { "text/plain": [ "Clustering Evaluation\n", - "Normalized MI = 0.8104463467727059\n", - "Adjusted MI = 0.8088941747451209" + "Normalized MI = 0.8104463467727057\n", + "Adjusted MI = 0.8088941747451207" ] }, "execution_count": 14, @@ -457,7 +457,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We see that the multi-threaded versions run in less time than the single threaded trainer, despite having 4 times the training data. The 20 centroid model has a tighter fit of the test data, though it is overparameterised. This is common in clustering tasks where it's hard to balance the model fitting with complexity. We'll look at adding more performance metrics so users can diagnose such issues in future releases. " + "We see that the multi-threaded versions run in about the same time as the single threaded trainer, but have 4 times the training data. The 20 centroid model has a tighter fit of the test data, though it is overparameterised. This is common in clustering tasks where it's hard to balance the model fitting with complexity. We'll look at adding more performance metrics so users can diagnose such issues in future releases. " ] }, { @@ -467,7 +467,7 @@ "## Conclusion\n", "We looked at clustering using Tribuo's K-Means implementation, experimented with different initialisations, and compared both the single-threaded and multi-threaded versions. Then we looked at the performance metrics available when there are ground truth clusterings.\n", "\n", - "We plan to further expand Tribuo's clustering functionality to incorporate other algorithms in the future. If you want to help, or have specific algorithmic requirements, file an issue on our [github page](https://github.com/oracle/tribuo)." + "We plan to further expand Tribuo's clustering functionality to incorporate other algorithms in the future, and added HDBSCAN in Tribuo v4.2. If you want to help, or have specific algorithmic requirements, file an issue on our [github page](https://github.com/oracle/tribuo)." ] } ], @@ -483,7 +483,7 @@ "mimetype": "text/x-java-source", "name": "Java", "pygments_lexer": "java", - "version": "17+0" + "version": "17.0.1+12-LTS-39" } }, "nbformat": 4, diff --git a/tutorials/columnar-tribuo-v4.ipynb b/tutorials/columnar-tribuo-v4.ipynb index e81068fde..36782fff7 100644 --- a/tutorials/columnar-tribuo-v4.ipynb +++ b/tutorials/columnar-tribuo-v4.ipynb @@ -38,8 +38,8 @@ "metadata": {}, "outputs": [], "source": [ - "%jars ./tribuo-classification-experiments-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n", - "%jars ./tribuo-json-4.2.0-SNAPSHOT-jar-with-dependencies.jar" + "%jars ./tribuo-classification-experiments-4.2.0-jar-with-dependencies.jar\n", + "%jars ./tribuo-json-4.2.0-jar-with-dependencies.jar" ] }, { @@ -568,7 +568,7 @@ "mimetype": "text/x-java-source", "name": "Java", "pygments_lexer": "java", - "version": "17-ea+22-1964" + "version": "17.0.1+12-LTS-39" } }, "nbformat": 4, diff --git a/tutorials/configuration-tribuo-v4.ipynb b/tutorials/configuration-tribuo-v4.ipynb index 0ab70c3d5..7ba4be122 100644 --- a/tutorials/configuration-tribuo-v4.ipynb +++ b/tutorials/configuration-tribuo-v4.ipynb @@ -32,8 +32,8 @@ "metadata": {}, "outputs": [], "source": [ - "%jars ./tribuo-classification-experiments-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n", - "%jars ./tribuo-json-4.2.0-SNAPSHOT-jar-with-dependencies.jar" + "%jars ./tribuo-classification-experiments-4.2.0-jar-with-dependencies.jar\n", + "%jars ./tribuo-json-4.2.0-jar-with-dependencies.jar" ] }, { @@ -487,7 +487,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training logistic regression took (00:00:03:669)\n" + "Training logistic regression took (00:00:03:494)\n" ] } ], @@ -807,7 +807,7 @@ "\t\t\t\t\t\t\tfeaturesPath = /Users/apocock/Development/Tribuo/tutorials/train-images-idx3-ubyte.gz\n", "\t\t\t\t\t\t\tfeatures-file-modified-time = 2000-07-21T14:20:24-04:00\n", "\t\t\t\t\t\t\toutput-resource-hash = 3552534A0A558BBED6AED32B30C495CCA23D567EC52CAC8BE1A0730E8010255C\n", - "\t\t\t\t\t\t\tdatasource-creation-time = 2021-05-24T12:24:14.958637-04:00\n", + "\t\t\t\t\t\t\tdatasource-creation-time = 2021-12-18T20:07:51.388837-05:00\n", "\t\t\t\t\t\t\toutput-file-modified-time = 2000-07-21T14:20:27-04:00\n", "\t\t\t\t\t\t\tidx-feature-type = UBYTE\n", "\t\t\t\t\t\t\tfeatures-resource-hash = 440FCABF73CC546FA21475E81EA370265605F56BE210A4024D2CA8F203523609\n", @@ -819,7 +819,7 @@ "\t\t\t\t\tnum-examples = 60000\n", "\t\t\t\t\tnum-features = 717\n", "\t\t\t\t\tnum-outputs = 10\n", - "\t\t\t\t\ttribuo-version = 4.1.0\n", + "\t\t\t\t\ttribuo-version = 4.2.0\n", "\t\t\t\t)\n", "\t\t\ttrainer = LinearSGDTrainer(\n", "\t\t\t\t\tclass-name = org.tribuo.classification.sgd.linear.LinearSGDTrainer\n", @@ -839,17 +839,17 @@ "\t\t\t\t\t\t\tclass-name = org.tribuo.classification.sgd.objectives.LogMulticlass\n", "\t\t\t\t\t\t\thost-short-name = LabelObjective\n", "\t\t\t\t\t\t)\n", - "\t\t\t\t\ttribuo-version = 4.1.0\n", + "\t\t\t\t\ttribuo-version = 4.2.0\n", "\t\t\t\t\ttrain-invocation-count = 0\n", "\t\t\t\t\tis-sequence = false\n", "\t\t\t\t\thost-short-name = Trainer\n", "\t\t\t\t)\n", - "\t\t\ttrained-at = 2021-05-24T12:24:19.604718-04:00\n", + "\t\t\ttrained-at = 2021-12-18T20:07:55.508414-05:00\n", "\t\t\tinstance-values = Map{\n", "\t\t\t\treconfigured-model=true\n", "\t\t\t}\n", - "\t\t\ttribuo-version = 4.1.0\n", - "\t\t\tjava-version = 17-ea\n", + "\t\t\ttribuo-version = 4.2.0\n", + "\t\t\tjava-version = 17.0.1\n", "\t\t\tos-name = Mac OS X\n", "\t\t\tos-arch = x86_64\n", "\t\t)\n", @@ -864,7 +864,7 @@ "\t\t\t\t\tfeaturesPath = /Users/apocock/Development/Tribuo/tutorials/t10k-images-idx3-ubyte.gz\n", "\t\t\t\t\tfeatures-file-modified-time = 2000-07-21T14:19:56-04:00\n", "\t\t\t\t\toutput-resource-hash = F7AE60F92E00EC6DEBD23A6088C31DBD2371ECA3FFA0DEFAEFB259924204AEC6\n", - "\t\t\t\t\tdatasource-creation-time = 2021-05-24T12:24:03.396403-04:00\n", + "\t\t\t\t\tdatasource-creation-time = 2021-12-18T20:07:41.373899-05:00\n", "\t\t\t\t\toutput-file-modified-time = 2000-07-21T14:20:05-04:00\n", "\t\t\t\t\tidx-feature-type = UBYTE\n", "\t\t\t\t\tfeatures-resource-hash = 8D422C7B0A1C1C79245A5BCF07FE86E33EEAFEE792B84584AEC276F5A2DBC4E6\n", @@ -876,9 +876,9 @@ "\t\t\tnum-examples = 10000\n", "\t\t\tnum-features = 668\n", "\t\t\tnum-outputs = 10\n", - "\t\t\ttribuo-version = 4.1.0\n", + "\t\t\ttribuo-version = 4.2.0\n", "\t\t)\n", - "\ttribuo-version = 4.1.0\n", + "\ttribuo-version = 4.2.0\n", ")\n" ] } @@ -906,7 +906,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training transformed logistic regression took (00:00:05:252)\n" + "Training transformed logistic regression took (00:00:04:707)\n" ] } ], @@ -1113,7 +1113,7 @@ "mimetype": "text/x-java-source", "name": "Java", "pygments_lexer": "java", - "version": "17-ea+22-1964" + "version": "17.0.1+12-LTS-39" } }, "nbformat": 4, diff --git a/tutorials/document-classification-tribuo-v4.ipynb b/tutorials/document-classification-tribuo-v4.ipynb index 6bbf85e6c..ca1ffcfc6 100644 --- a/tutorials/document-classification-tribuo-v4.ipynb +++ b/tutorials/document-classification-tribuo-v4.ipynb @@ -49,8 +49,8 @@ "metadata": {}, "outputs": [], "source": [ - "%jars ./tribuo-classification-experiments-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n", - "%jars ./tribuo-onnx-4.2.0-SNAPSHOT-jar-with-dependencies.jar" + "%jars ./tribuo-classification-experiments-4.2.0-jar-with-dependencies.jar\n", + "%jars ./tribuo-onnx-4.2.0-jar-with-dependencies.jar" ] }, { @@ -198,7 +198,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training the model on BoW features took (00:00:09:659)\n", + "Training the model on BoW features took (00:00:09:601)\n", "\n", "Class n tp fn fp recall prec f1\n", "soc.religion.christian 398 352 46 110 0.884 0.762 0.819\n", @@ -244,7 +244,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We got a macro F1 score of 79.1%, which is a fairly good starting point and it's roughly what other linear models get on this task (e.g., scikit-learn's text classification tutorial gets 76.9% macro F1 when using a similar multinomial Naive Bayes model)." + "We got a macro F1 score of 79.6%, which is a fairly good starting point and it's roughly what other linear models get on this task (e.g., scikit-learn's text classification tutorial gets 76.9% macro F1 when using a similar multinomial Naive Bayes model)." ] }, { @@ -291,7 +291,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training the model on Unigram features took (00:00:10:529)\n", + "Training the model on Unigram features took (00:00:09:146)\n", "\n", "Class n tp fn fp recall prec f1\n", "soc.religion.christian 398 362 36 88 0.910 0.804 0.854\n", @@ -381,7 +381,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training the model on Bigram features took (00:00:41:981)\n", + "Training the model on Bigram features took (00:00:43:790)\n", "\n", "Class n tp fn fp recall prec f1\n", "soc.religion.christian 398 331 67 57 0.832 0.853 0.842\n", @@ -480,7 +480,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training the model on TF-IDF features took (00:00:42:471)\n", + "Training the model on TF-IDF features took (00:00:45:063)\n", "\n", "Class n tp fn fp recall prec f1\n", "soc.religion.christian 398 350 48 183 0.879 0.657 0.752\n", @@ -570,7 +570,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training the model on hashed features took (00:00:24:289)\n", + "Training the model on hashed features took (00:00:23:354)\n", "\n", "Class n tp fn fp recall prec f1\n", "soc.religion.christian 398 306 92 125 0.769 0.710 0.738\n", @@ -662,7 +662,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training the model on trimmed TF-IDF features took (00:00:19:049)\n", + "Training the model on trimmed TF-IDF features took (00:00:19:928)\n", "\n", "Class n tp fn fp recall prec f1\n", "soc.religion.christian 398 337 61 93 0.847 0.784 0.814\n", @@ -707,7 +707,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As with the feature hashing above, this model trains more quickly because there is less data to process, but the speed improvement is more stubstantial as the number of features in each example is lower (because the hashing produces a denser example than trimming out infrequent features). Performance dropped slightly as compared to the TF-IDF model, but again it is around 10% of the parameters, with a corresponding reduction in memory and runtime in inference and training. Performance is improved over the hashing as we're not colliding features at random, we're simply removing ones which are infrequent. If a feature is infrequent we probably can't estimate the weight for it very well so it helps remove some of the noise.\n", + "As with the feature hashing above, this model trains more quickly because there is less data to process, but the speed improvement is more substantial as the number of features in each example is lower (because the hashing produces a denser example than trimming out infrequent features). Performance dropped slightly as compared to the TF-IDF model, but again it is around 10% of the parameters, with a corresponding reduction in memory and runtime in inference and training. Performance is improved over the hashing as we're not colliding features at random, we're simply removing ones which are infrequent. If a feature is infrequent we probably can't estimate the weight for it very well so it helps remove some of the noise.\n", "\n", "Choosing which one of feature hashing and trimming out infrequent features to apply is problem dependent. Feature hashing can work in denser feature spaces than trimming infrequent features, but both still require some amount of sparsity in the problem to have any useful effect. With text datasets then trimming the infrequent words/features is usually helpful." ] @@ -750,7 +750,7 @@ "text": [ "bert training data size = 11314, number of features = 768, number of classes = 20\n", "bert testing data size = 7532, number of features = 768, number of classes = 20\n", - "Extracting features with BERT took (01:06:52:756)\n" + "Extracting features with BERT took (00:38:37:476)\n" ] } ], @@ -789,7 +789,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training a LR on BERT features took (00:00:08:960)\n", + "Training a LR on BERT features took (00:00:06:082)\n", "Class n tp fn fp recall prec f1\n", "soc.religion.christian 398 353 45 111 0.887 0.761 0.819\n", "rec.autos 396 332 64 99 0.838 0.770 0.803\n", @@ -880,7 +880,7 @@ "\t\t\tclass-name = org.tribuo.classification.LabelFactory\n", "\t\t)\n", "\tfile-modified-time = 2003-03-18T07:24:55-05:00\n", - "\tdatasource-creation-time = 2021-05-24T12:46:58.801385-04:00\n", + "\tdatasource-creation-time = 2021-12-18T20:50:57.169758-05:00\n", ")\n" ] } @@ -918,7 +918,7 @@ "mimetype": "text/x-java-source", "name": "Java", "pygments_lexer": "java", - "version": "17-ea+22-1964" + "version": "17.0.1+12-LTS-39" } }, "nbformat": 4, diff --git a/tutorials/external-models-tribuo-v4.ipynb b/tutorials/external-models-tribuo-v4.ipynb index f9cf61689..72d17fc4d 100644 --- a/tutorials/external-models-tribuo-v4.ipynb +++ b/tutorials/external-models-tribuo-v4.ipynb @@ -24,8 +24,8 @@ "metadata": {}, "outputs": [], "source": [ - "%jars tribuo-classification-experiments-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n", - "%jars tribuo-onnx-4.2.0-SNAPSHOT-jar-with-dependencies.jar" + "%jars tribuo-classification-experiments-4.2.0-jar-with-dependencies.jar\n", + "%jars tribuo-onnx-4.2.0-jar-with-dependencies.jar" ] }, { @@ -469,7 +469,7 @@ "mimetype": "text/x-java-source", "name": "Java", "pygments_lexer": "java", - "version": "17+35-LTS-2724" + "version": "17.0.1+12-LTS-39" } }, "nbformat": 4, diff --git a/tutorials/irises-tribuo-v4.ipynb b/tutorials/irises-tribuo-v4.ipynb index fa10fe888..8cf09625f 100644 --- a/tutorials/irises-tribuo-v4.ipynb +++ b/tutorials/irises-tribuo-v4.ipynb @@ -27,8 +27,8 @@ "metadata": {}, "outputs": [], "source": [ - "%jars ./tribuo-classification-experiments-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n", - "%jars ./tribuo-json-4.2.0-SNAPSHOT-jar-with-dependencies.jar" + "%jars ./tribuo-classification-experiments-4.2.0-jar-with-dependencies.jar\n", + "%jars ./tribuo-json-4.2.0-jar-with-dependencies.jar" ] }, { @@ -410,7 +410,7 @@ "\t\t\tdataPath = /Users/apocock/Development/Tribuo/tutorials/bezdekIris.data\n", "\t\t\tresource-hash = 0FED2A99DB77EC533A62DC66894D3EC6DF3B58B6A8F3CF4A6B47E4086B7F97DC\n", "\t\t\tfile-modified-time = 1999-12-14T15:12:39-05:00\n", - "\t\t\tdatasource-creation-time = 2021-11-01T12:52:18.814629-04:00\n", + "\t\t\tdatasource-creation-time = 2021-12-18T20:31:02.286464-05:00\n", "\t\t\thost-short-name = DataSource\n", "\t\t)\n", "\ttrain-proportion = 0.7\n", @@ -462,7 +462,7 @@ "\t\t\tclass-name = org.tribuo.classification.sgd.objectives.LogMulticlass\n", "\t\t\thost-short-name = LabelObjective\n", "\t\t)\n", - "\ttribuo-version = 4.2.0-SNAPSHOT\n", + "\ttribuo-version = 4.2.0\n", "\ttrain-invocation-count = 0\n", "\tis-sequence = false\n", "\thost-short-name = Trainer\n", @@ -523,7 +523,7 @@ " \"tribuo-version\" : {\n", " \"marshalled-class\" : \"com.oracle.labs.mlrg.olcut.provenance.io.SimpleMarshalledProvenance\",\n", " \"key\" : \"tribuo-version\",\n", - " \"value\" : \"4.2.0-SNAPSHOT\",\n", + " \"value\" : \"4.2.0\",\n", " \"provenance-class\" : \"com.oracle.labs.mlrg.olcut.provenance.primitives.StringProvenance\",\n", " \"additional\" : \"\",\n", " \"is-reference\" : false\n", @@ -531,7 +531,7 @@ " \"java-version\" : {\n", " \"marshalled-class\" : \"com.oracle.labs.mlrg.olcut.provenance.io.SimpleMarshalledProvenance\",\n", " \"key\" : \"java-version\",\n", - " \"value\" : \"17\",\n", + " \"value\" : \"17.0.1\",\n", " \"provenance-class\" : \"com.oracle.labs.mlrg.olcut.provenance.primitives.StringProvenance\",\n", " \"additional\" : \"\",\n", " \"is-reference\" : false\n", @@ -555,7 +555,7 @@ " \"trained-at\" : {\n", " \"marshalled-class\" : \"com.oracle.labs.mlrg.olcut.provenance.io.SimpleMarshalledProvenance\",\n", " \"key\" : \"trained-at\",\n", - " \"value\" : \"2021-11-01T12:52:19.228195-04:00\",\n", + " \"value\" : \"2021-12-18T20:31:02.707624-05:00\",\n", " \"provenance-class\" : \"com.oracle.labs.mlrg.olcut.provenance.primitives.DateTimeProvenance\",\n", " \"additional\" : \"\",\n", " \"is-reference\" : false\n", @@ -618,7 +618,7 @@ " \"tribuo-version\" : {\n", " \"marshalled-class\" : \"com.oracle.labs.mlrg.olcut.provenance.io.SimpleMarshalledProvenance\",\n", " \"key\" : \"tribuo-version\",\n", - " \"value\" : \"4.2.0-SNAPSHOT\",\n", + " \"value\" : \"4.2.0\",\n", " \"provenance-class\" : \"com.oracle.labs.mlrg.olcut.provenance.primitives.StringProvenance\",\n", " \"additional\" : \"\",\n", " \"is-reference\" : false\n", @@ -677,7 +677,7 @@ " \"tribuo-version\" : {\n", " \"marshalled-class\" : \"com.oracle.labs.mlrg.olcut.provenance.io.SimpleMarshalledProvenance\",\n", " \"key\" : \"tribuo-version\",\n", - " \"value\" : \"4.2.0-SNAPSHOT\",\n", + " \"value\" : \"4.2.0\",\n", " \"provenance-class\" : \"com.oracle.labs.mlrg.olcut.provenance.primitives.StringProvenance\",\n", " \"additional\" : \"\",\n", " \"is-reference\" : false\n", @@ -982,7 +982,7 @@ " \"datasource-creation-time\" : {\n", " \"marshalled-class\" : \"com.oracle.labs.mlrg.olcut.provenance.io.SimpleMarshalledProvenance\",\n", " \"key\" : \"datasource-creation-time\",\n", - " \"value\" : \"2021-11-01T12:52:18.814629-04:00\",\n", + " \"value\" : \"2021-12-18T20:31:02.286464-05:00\",\n", " \"provenance-class\" : \"com.oracle.labs.mlrg.olcut.provenance.primitives.DateTimeProvenance\",\n", " \"additional\" : \"\",\n", " \"is-reference\" : false\n", @@ -1443,7 +1443,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "linear-sgd-model - Model(class-name=org.tribuo.classification.sgd.linear.LinearSGDModel,dataset=Dataset(class-name=org.tribuo.MutableDataset,datasource=SplitDataSourceProvenance(className=org.tribuo.evaluation.TrainTestSplitter,innerSourceProvenance=DataSource(class-name=org.tribuo.data.csv.CSVDataSource,headers=[sepalLength, sepalWidth, petalLength, petalWidth, species],rowProcessor=RowProcessor(class-name=org.tribuo.data.columnar.RowProcessor,metadataExtractors=[],fieldProcessorList=[FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=petalLength,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=petalWidth,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=sepalWidth,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=sepalLength,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor)],featureProcessors=[],responseProcessor=ResponseProcessor(class-name=org.tribuo.data.columnar.processors.response.FieldResponseProcessor,uppercase=false,fieldNames=[species],defaultValues=[],displayField=false,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),host-short-name=ResponseProcessor),weightExtractor=null,replaceNewlinesWithSpaces=true,regexMappingProcessors={},host-short-name=RowProcessor),quote=\",outputRequired=true,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),separator=,,dataPath=/Users/apocock/Development/Tribuo/tutorials/bezdekIris.data,resource-hash=SHA-256[0FED2A99DB77EC533A62DC66894D3EC6DF3B58B6A8F3CF4A6B47E4086B7F97DC],file-modified-time=1999-12-14T15:12:39-05:00,datasource-creation-time=2021-11-01T12:52:18.814629-04:00,host-short-name=DataSource),trainProportion=0.7,seed=1,size=150,isTrain=true),transformations=[],is-sequence=false,is-dense=true,num-examples=105,num-features=4,num-outputs=3,tribuo-version=4.2.0-SNAPSHOT),trainer=Trainer(class-name=org.tribuo.classification.sgd.linear.LogisticRegressionTrainer,seed=12345,minibatchSize=1,shuffle=true,epochs=5,optimiser=StochasticGradientOptimiser(class-name=org.tribuo.math.optimisers.AdaGrad,epsilon=0.1,initialLearningRate=1.0,initialValue=0.0,host-short-name=StochasticGradientOptimiser),loggingInterval=1000,objective=LabelObjective(class-name=org.tribuo.classification.sgd.objectives.LogMulticlass,host-short-name=LabelObjective),tribuo-version=4.2.0-SNAPSHOT,train-invocation-count=0,is-sequence=false,host-short-name=Trainer),trained-at=2021-11-01T12:52:19.228195-04:00,instance-values={},tribuo-version=4.2.0-SNAPSHOT,java-version=17,os-name=Mac OS X,os-arch=x86_64)\n" + "linear-sgd-model - Model(class-name=org.tribuo.classification.sgd.linear.LinearSGDModel,dataset=Dataset(class-name=org.tribuo.MutableDataset,datasource=SplitDataSourceProvenance(className=org.tribuo.evaluation.TrainTestSplitter,innerSourceProvenance=DataSource(class-name=org.tribuo.data.csv.CSVDataSource,headers=[sepalLength, sepalWidth, petalLength, petalWidth, species],rowProcessor=RowProcessor(class-name=org.tribuo.data.columnar.RowProcessor,metadataExtractors=[],fieldProcessorList=[FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=petalLength,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=petalWidth,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=sepalWidth,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=sepalLength,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor)],featureProcessors=[],responseProcessor=ResponseProcessor(class-name=org.tribuo.data.columnar.processors.response.FieldResponseProcessor,uppercase=false,fieldNames=[species],defaultValues=[],displayField=false,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),host-short-name=ResponseProcessor),weightExtractor=null,replaceNewlinesWithSpaces=true,regexMappingProcessors={},host-short-name=RowProcessor),quote=\",outputRequired=true,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),separator=,,dataPath=/Users/apocock/Development/Tribuo/tutorials/bezdekIris.data,resource-hash=SHA-256[0FED2A99DB77EC533A62DC66894D3EC6DF3B58B6A8F3CF4A6B47E4086B7F97DC],file-modified-time=1999-12-14T15:12:39-05:00,datasource-creation-time=2021-12-18T20:31:02.286464-05:00,host-short-name=DataSource),trainProportion=0.7,seed=1,size=150,isTrain=true),transformations=[],is-sequence=false,is-dense=true,num-examples=105,num-features=4,num-outputs=3,tribuo-version=4.2.0),trainer=Trainer(class-name=org.tribuo.classification.sgd.linear.LogisticRegressionTrainer,seed=12345,minibatchSize=1,shuffle=true,epochs=5,optimiser=StochasticGradientOptimiser(class-name=org.tribuo.math.optimisers.AdaGrad,epsilon=0.1,initialLearningRate=1.0,initialValue=0.0,host-short-name=StochasticGradientOptimiser),loggingInterval=1000,objective=LabelObjective(class-name=org.tribuo.classification.sgd.objectives.LogMulticlass,host-short-name=LabelObjective),tribuo-version=4.2.0,train-invocation-count=0,is-sequence=false,host-short-name=Trainer),trained-at=2021-12-18T20:31:02.707624-05:00,instance-values={},tribuo-version=4.2.0,java-version=17.0.1,os-name=Mac OS X,os-arch=x86_64)\n" ] } ], @@ -1468,12 +1468,12 @@ "output_type": "stream", "text": [ "{\n", - " \"tribuo-version\" : \"4.2.0-SNAPSHOT\",\n", + " \"tribuo-version\" : \"4.2.0\",\n", " \"dataset-provenance\" : {\n", " \"num-features\" : \"4\",\n", " \"num-examples\" : \"45\",\n", " \"num-outputs\" : \"3\",\n", - " \"tribuo-version\" : \"4.2.0-SNAPSHOT\",\n", + " \"tribuo-version\" : \"4.2.0\",\n", " \"datasource\" : {\n", " \"train-proportion\" : \"0.7\",\n", " \"seed\" : \"1\",\n", @@ -1531,7 +1531,7 @@ " \"file-modified-time\" : \"1999-12-14T15:12:39-05:00\",\n", " \"quote\" : \"\\\"\",\n", " \"outputRequired\" : \"true\",\n", - " \"datasource-creation-time\" : \"2021-11-01T12:52:18.814629-04:00\",\n", + " \"datasource-creation-time\" : \"2021-12-18T20:31:02.286464-05:00\",\n", " \"outputFactory\" : {\n", " \"class-name\" : \"org.tribuo.classification.LabelFactory\"\n", " },\n", @@ -1551,11 +1551,11 @@ " \"class-name\" : \"org.tribuo.provenance.EvaluationProvenance\",\n", " \"model-provenance\" : {\n", " \"instance-values\" : { },\n", - " \"tribuo-version\" : \"4.2.0-SNAPSHOT\",\n", - " \"java-version\" : \"17\",\n", + " \"tribuo-version\" : \"4.2.0\",\n", + " \"java-version\" : \"17.0.1\",\n", " \"trainer\" : {\n", " \"seed\" : \"12345\",\n", - " \"tribuo-version\" : \"4.2.0-SNAPSHOT\",\n", + " \"tribuo-version\" : \"4.2.0\",\n", " \"minibatchSize\" : \"1\",\n", " \"train-invocation-count\" : \"0\",\n", " \"is-sequence\" : \"false\",\n", @@ -1577,13 +1577,13 @@ " }\n", " },\n", " \"os-arch\" : \"x86_64\",\n", - " \"trained-at\" : \"2021-11-01T12:52:19.228195-04:00\",\n", + " \"trained-at\" : \"2021-12-18T20:31:02.707624-05:00\",\n", " \"os-name\" : \"Mac OS X\",\n", " \"dataset\" : {\n", " \"num-features\" : \"4\",\n", " \"num-examples\" : \"105\",\n", " \"num-outputs\" : \"3\",\n", - " \"tribuo-version\" : \"4.2.0-SNAPSHOT\",\n", + " \"tribuo-version\" : \"4.2.0\",\n", " \"datasource\" : {\n", " \"train-proportion\" : \"0.7\",\n", " \"seed\" : \"1\",\n", @@ -1641,7 +1641,7 @@ " \"file-modified-time\" : \"1999-12-14T15:12:39-05:00\",\n", " \"quote\" : \"\\\"\",\n", " \"outputRequired\" : \"true\",\n", - " \"datasource-creation-time\" : \"2021-11-01T12:52:18.814629-04:00\",\n", + " \"datasource-creation-time\" : \"2021-12-18T20:31:02.286464-05:00\",\n", " \"outputFactory\" : {\n", " \"class-name\" : \"org.tribuo.classification.LabelFactory\"\n", " },\n", @@ -1802,7 +1802,7 @@ "mimetype": "text/x-java-source", "name": "Java", "pygments_lexer": "java", - "version": "17+35-LTS-2724" + "version": "17.0.1+12-LTS-39" } }, "nbformat": 4, diff --git a/tutorials/multi-label-tribuo-v4.ipynb b/tutorials/multi-label-tribuo-v4.ipynb index df14d7b7e..637cc1ea2 100644 --- a/tutorials/multi-label-tribuo-v4.ipynb +++ b/tutorials/multi-label-tribuo-v4.ipynb @@ -32,8 +32,8 @@ "metadata": {}, "outputs": [], "source": [ - "%jars ./tribuo-multilabel-sgd-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n", - "%jars ./tribuo-classification-experiments-4.2.0-SNAPSHOT-jar-with-dependencies.jar" + "%jars ./tribuo-multilabel-sgd-4.2.0-jar-with-dependencies.jar\n", + "%jars ./tribuo-classification-experiments-4.2.0-jar-with-dependencies.jar" ] }, { @@ -172,7 +172,7 @@ "output_type": "stream", "text": [ "\n", - "Linear model training took (00:00:00:206)\n" + "Linear model training took (00:00:00:245)\n" ] } ], @@ -201,7 +201,7 @@ "output_type": "stream", "text": [ "\n", - "Tree model training took (00:00:03:805)\n" + "Tree model training took (00:00:03:499)\n" ] } ], @@ -256,7 +256,7 @@ "output_type": "stream", "text": [ "\n", - "Linear model evaluation took (00:00:00:068)\n", + "Linear model evaluation took (00:00:00:073)\n", "Class n tp fn fp recall prec f1\n", "(LabelSet={12}) 683 677 6 230 0.991 0.746 0.852\n", "(LabelSet={13}) 13 0 13 0 0.000 0.000 0.000\n", @@ -307,7 +307,7 @@ "output_type": "stream", "text": [ "\n", - "Tree model evaluation took (00:00:00:086)\n", + "Tree model evaluation took (00:00:00:085)\n", "Class n tp fn fp recall prec f1\n", "(LabelSet={12}) 683 607 76 201 0.889 0.751 0.814\n", "(LabelSet={13}) 13 0 13 2 0.000 0.000 0.000\n", @@ -387,8 +387,8 @@ "output_type": "stream", "text": [ "\n", - "Classifier Chain model training took (00:00:03:344)\n", - "Classifier Chain model evaluation took (00:00:00:152)\n", + "Classifier Chain model training took (00:00:03:195)\n", + "Classifier Chain model evaluation took (00:00:00:146)\n", "Class n tp fn fp recall prec f1\n", "(LabelSet={12}) 683 616 67 203 0.902 0.752 0.820\n", "(LabelSet={13}) 13 0 13 2 0.000 0.000 0.000\n", @@ -448,8 +448,8 @@ "output_type": "stream", "text": [ "\n", - "Classifier Chain Ensemble model training took (00:01:05:893)\n", - "Classifier Chain Ensemble model evaluation took (00:00:02:475)\n", + "Classifier Chain Ensemble model training took (00:01:04:418)\n", + "Classifier Chain Ensemble model evaluation took (00:00:02:474)\n", "Class n tp fn fp recall prec f1\n", "(LabelSet={12}) 683 629 54 216 0.921 0.744 0.823\n", "(LabelSet={13}) 13 0 13 1 0.000 0.000 0.000\n", @@ -494,7 +494,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As expected the classifier chain ensemble outperformed the binary relevance model and the single classifier chain when using trees as the base learner, at the cost of the greatest runtime. It did this by significantly decreasing the number of false positives, at the cost of a small increase in false negatives. We didn't quite beat the performance of the linear model in terms of Jaccard score, but in general classifier chains are a powerful multi-label approach, and we could always use a the linear model as a base learner (and if you do, then you do improve the Jaccard score above 0.497). We leave the implementation of that as an exercise for the reader.\n", + "As expected the classifier chain ensemble outperformed the binary relevance model and the single classifier chain when using trees as the base learner, at the cost of the greatest runtime. It did this by significantly decreasing the number of false positives, at the cost of a small increase in false negatives. We didn't quite beat the performance of the linear model in terms of Jaccard score, but in general classifier chains are a powerful multi-label approach, and we could always use the linear model as a base learner (and if you do, then you do improve the Jaccard score above 0.497). We leave the implementation of that as an exercise for the reader.\n", "\n", "## Conclusion\n", "\n", @@ -514,7 +514,7 @@ "mimetype": "text/x-java-source", "name": "Java", "pygments_lexer": "java", - "version": "11.0.10+8-LTS-162" + "version": "17.0.1+12-LTS-39" } }, "nbformat": 4, diff --git a/tutorials/onnx-export-tribuo-v4.ipynb b/tutorials/onnx-export-tribuo-v4.ipynb index 77e25c14b..29fee8df0 100644 --- a/tutorials/onnx-export-tribuo-v4.ipynb +++ b/tutorials/onnx-export-tribuo-v4.ipynb @@ -37,10 +37,10 @@ "metadata": {}, "outputs": [], "source": [ - "%jars ./tribuo-classification-experiments-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n", - "%jars ./tribuo-oci-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n", - "%jars ./tribuo-onnx-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n", - "%jars ./tribuo-json-4.2.0-SNAPSHOT-jar-with-dependencies.jar" + "%jars ./tribuo-classification-experiments-4.2.0-jar-with-dependencies.jar\n", + "%jars ./tribuo-oci-4.2.0-jar-with-dependencies.jar\n", + "%jars ./tribuo-onnx-4.2.0-jar-with-dependencies.jar\n", + "%jars ./tribuo-json-4.2.0-jar-with-dependencies.jar" ] }, { @@ -150,7 +150,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training factorization machine took (00:00:18:816)\n" + "Training factorization machine took (00:00:11:305)\n" ] } ], @@ -177,7 +177,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Scoring factorization machine took (00:00:00:475)\n", + "Scoring factorization machine took (00:00:00:412)\n", "Class n tp fn fp recall prec f1\n", "0 980 959 21 31 0.979 0.969 0.974\n", "1 1,135 1,120 15 22 0.987 0.981 0.984\n", @@ -352,7 +352,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Scoring ONNX factorization machine took (00:00:01:578)\n", + "Scoring ONNX factorization machine took (00:00:00:810)\n", "Class n tp fn fp recall prec f1\n", "0 980 959 21 31 0.979 0.969 0.974\n", "1 1,135 1,120 15 22 0.987 0.981 0.984\n", @@ -422,7 +422,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "An important part of a Tribuo model is the provenance. We don't want to lose that information when exporting models to ONNX format, so we encode the provenance in the ONNX protobuf. It uses the marshalled provenance format from OLCUT, and the protos are available in OLCUT so they could be parsed in other systems. As a result when loading in a Tribuo-exported ONNX model the `ONNXExternalModel` class has two provenance objects, one for the `ONNXExternalModel` itself, and one for the original Model object.\n", + "An important part of a Tribuo model is the provenance. We don't want to lose that information when exporting models to ONNX format, so we encode the provenance in the ONNX protobuf. It uses the marshalled provenance format from OLCUT, and the protos are available in OLCUT so they could be parsed in other systems. As a result when loading in a Tribuo-exported ONNX model the `ONNXExternalModel` class has two provenance objects, one for the `ONNXExternalModel` itself, and one for the original `Model` object.\n", "\n", "Let's examine both of these provenances. First the one for the `ONNXExternalModel`:" ] @@ -446,7 +446,7 @@ "\t\t\t\t\toutputFactory = LabelFactory(\n", "\t\t\t\t\t\t\tclass-name = org.tribuo.classification.LabelFactory\n", "\t\t\t\t\t\t)\n", - "\t\t\t\t\tdatasource-creation-time = 2021-12-14T15:03:45.571121-05:00\n", + "\t\t\t\t\tdatasource-creation-time = 2021-12-18T20:36:37.266127-05:00\n", "\t\t\t\t)\n", "\t\t\ttransformations = List[]\n", "\t\t\tis-sequence = false\n", @@ -454,25 +454,25 @@ "\t\t\tnum-examples = -1\n", "\t\t\tnum-features = 717\n", "\t\t\tnum-outputs = 10\n", - "\t\t\ttribuo-version = 4.2.0-SNAPSHOT\n", + "\t\t\ttribuo-version = 4.2.0\n", "\t\t)\n", "\ttrainer = Trainer(\n", "\t\t\tclass-name = org.tribuo.Trainer\n", - "\t\t\tfileModifiedTime = 2021-12-14T15:03:44.423-05:00\n", - "\t\t\tmodelHash = 5934A79EA0B7A569DF2A42F08BE2DBED1C3E7D25A90C33D811D77502AEEFA431\n", + "\t\t\tfileModifiedTime = 2021-12-18T20:36:36.445-05:00\n", + "\t\t\tmodelHash = 06071247AEDE7539B899A2D530508D8E2B43304B8A7884A257368AA2CF1C18ED\n", "\t\t\tlocation = file:/Users/apocock/Development/Tribuo/tutorials/./fm-mnist.onnx\n", "\t\t)\n", - "\ttrained-at = 2021-12-14T15:03:45.568284-05:00\n", + "\ttrained-at = 2021-12-18T20:36:37.263832-05:00\n", "\tinstance-values = Map{\n", "\t\tmodel-domain=org.tribuo.tutorials.onnxexport.fm\n", "\t\tmodel-graphname=FMClassificationModel\n", - "\t\tmodel-description=factorization-machine-model - Model(class-name=org.tribuo.classification.sgd.fm.FMClassificationModel,dataset=Dataset(class-name=org.tribuo.MutableDataset,datasource=DataSource(class-name=org.tribuo.datasource.IDXDataSource,outputPath=/Users/apocock/Development/Tribuo/tutorials/train-labels-idx1-ubyte.gz,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),featuresPath=/Users/apocock/Development/Tribuo/tutorials/train-images-idx3-ubyte.gz,features-file-modified-time=2000-07-21T14:20:24-04:00,output-resource-hash=SHA-256[3552534A0A558BBED6AED32B30C495CCA23D567EC52CAC8BE1A0730E8010255C],datasource-creation-time=2021-12-14T15:03:23.159717-05:00,output-file-modified-time=2000-07-21T14:20:27-04:00,idx-feature-type=UBYTE,features-resource-hash=SHA-256[440FCABF73CC546FA21475E81EA370265605F56BE210A4024D2CA8F203523609],host-short-name=DataSource),transformations=[],is-sequence=false,is-dense=false,num-examples=60000,num-features=717,num-outputs=10,tribuo-version=4.2.0-SNAPSHOT),trainer=Trainer(class-name=org.tribuo.classification.sgd.fm.FMClassificationTrainer,seed=12345,variance=0.1,minibatchSize=1,factorizedDimSize=6,shuffle=true,epochs=5,optimiser=StochasticGradientOptimiser(class-name=org.tribuo.math.optimisers.AdaGrad,epsilon=0.1,initialLearningRate=0.1,initialValue=0.0,host-short-name=StochasticGradientOptimiser),loggingInterval=30000,objective=LabelObjective(class-name=org.tribuo.classification.sgd.objectives.LogMulticlass,host-short-name=LabelObjective),tribuo-version=4.2.0-SNAPSHOT,train-invocation-count=0,is-sequence=false,host-short-name=Trainer),trained-at=2021-12-14T15:03:43.488204-05:00,instance-values={},tribuo-version=4.2.0-SNAPSHOT,java-version=11.0.10,os-name=Mac OS X,os-arch=x86_64)\n", + "\t\tmodel-description=factorization-machine-model - Model(class-name=org.tribuo.classification.sgd.fm.FMClassificationModel,dataset=Dataset(class-name=org.tribuo.MutableDataset,datasource=DataSource(class-name=org.tribuo.datasource.IDXDataSource,outputPath=/Users/apocock/Development/Tribuo/tutorials/train-labels-idx1-ubyte.gz,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),featuresPath=/Users/apocock/Development/Tribuo/tutorials/train-images-idx3-ubyte.gz,features-file-modified-time=2000-07-21T14:20:24-04:00,output-resource-hash=SHA-256[3552534A0A558BBED6AED32B30C495CCA23D567EC52CAC8BE1A0730E8010255C],datasource-creation-time=2021-12-18T20:36:23.109293-05:00,output-file-modified-time=2000-07-21T14:20:27-04:00,idx-feature-type=UBYTE,features-resource-hash=SHA-256[440FCABF73CC546FA21475E81EA370265605F56BE210A4024D2CA8F203523609],host-short-name=DataSource),transformations=[],is-sequence=false,is-dense=false,num-examples=60000,num-features=717,num-outputs=10,tribuo-version=4.2.0),trainer=Trainer(class-name=org.tribuo.classification.sgd.fm.FMClassificationTrainer,seed=12345,variance=0.1,minibatchSize=1,factorizedDimSize=6,shuffle=true,epochs=5,optimiser=StochasticGradientOptimiser(class-name=org.tribuo.math.optimisers.AdaGrad,epsilon=0.1,initialLearningRate=0.1,initialValue=0.0,host-short-name=StochasticGradientOptimiser),loggingInterval=30000,objective=LabelObjective(class-name=org.tribuo.classification.sgd.objectives.LogMulticlass,host-short-name=LabelObjective),tribuo-version=4.2.0,train-invocation-count=0,is-sequence=false,host-short-name=Trainer),trained-at=2021-12-18T20:36:35.640663-05:00,instance-values={},tribuo-version=4.2.0,java-version=17.0.1,os-name=Mac OS X,os-arch=x86_64)\n", "\t\tmodel-producer=Tribuo\n", "\t\tmodel-version=0\n", "\t\tinput-name=input\n", "\t}\n", - "\ttribuo-version = 4.2.0-SNAPSHOT\n", - "\tjava-version = 11.0.10\n", + "\ttribuo-version = 4.2.0\n", + "\tjava-version = 17.0.1\n", "\tos-name = Mac OS X\n", "\tos-arch = x86_64\n", ")\n" @@ -515,7 +515,7 @@ "\t\t\t\t\tfeaturesPath = /Users/apocock/Development/Tribuo/tutorials/train-images-idx3-ubyte.gz\n", "\t\t\t\t\tfeatures-file-modified-time = 2000-07-21T14:20:24-04:00\n", "\t\t\t\t\toutput-resource-hash = 3552534A0A558BBED6AED32B30C495CCA23D567EC52CAC8BE1A0730E8010255C\n", - "\t\t\t\t\tdatasource-creation-time = 2021-12-14T15:03:23.159717-05:00\n", + "\t\t\t\t\tdatasource-creation-time = 2021-12-18T20:36:23.109293-05:00\n", "\t\t\t\t\toutput-file-modified-time = 2000-07-21T14:20:27-04:00\n", "\t\t\t\t\tidx-feature-type = UBYTE\n", "\t\t\t\t\tfeatures-resource-hash = 440FCABF73CC546FA21475E81EA370265605F56BE210A4024D2CA8F203523609\n", @@ -527,7 +527,7 @@ "\t\t\tnum-examples = 60000\n", "\t\t\tnum-features = 717\n", "\t\t\tnum-outputs = 10\n", - "\t\t\ttribuo-version = 4.2.0-SNAPSHOT\n", + "\t\t\ttribuo-version = 4.2.0\n", "\t\t)\n", "\ttrainer = FMClassificationTrainer(\n", "\t\t\tclass-name = org.tribuo.classification.sgd.fm.FMClassificationTrainer\n", @@ -549,15 +549,15 @@ "\t\t\t\t\tclass-name = org.tribuo.classification.sgd.objectives.LogMulticlass\n", "\t\t\t\t\thost-short-name = LabelObjective\n", "\t\t\t\t)\n", - "\t\t\ttribuo-version = 4.2.0-SNAPSHOT\n", + "\t\t\ttribuo-version = 4.2.0\n", "\t\t\ttrain-invocation-count = 0\n", "\t\t\tis-sequence = false\n", "\t\t\thost-short-name = Trainer\n", "\t\t)\n", - "\ttrained-at = 2021-12-14T15:03:43.488204-05:00\n", + "\ttrained-at = 2021-12-18T20:36:35.640663-05:00\n", "\tinstance-values = Map{}\n", - "\ttribuo-version = 4.2.0-SNAPSHOT\n", - "\tjava-version = 11.0.10\n", + "\ttribuo-version = 4.2.0\n", + "\tjava-version = 17.0.1\n", "\tos-name = Mac OS X\n", "\tos-arch = x86_64\n", ")\n" @@ -648,7 +648,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Scoring ensemble took (00:00:00:880)\n", + "Scoring ensemble took (00:00:00:675)\n", "Class n tp fn fp recall prec f1\n", "0 980 965 15 43 0.985 0.957 0.971\n", "1 1,135 1,119 16 34 0.986 0.971 0.978\n", @@ -725,7 +725,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Scoring ONNX ensemble took (00:00:01:901)\n", + "Scoring ONNX ensemble took (00:00:01:021)\n", "Predictions are equal - true\n" ] } @@ -762,7 +762,7 @@ "source": [ "// Set these variables appropriately for your OCI account\n", "var compartmentID = \"your-oci-compartment-id\";\n", - "var projectID = \"your-oci-ds-project-id\";\n" + "var projectID = \"your-oci-ds-project-id\";" ] }, { @@ -944,7 +944,7 @@ "mimetype": "text/x-java-source", "name": "Java", "pygments_lexer": "java", - "version": "11.0.10+8-LTS-162" + "version": "17.0.1+12-LTS-39" } }, "nbformat": 4, diff --git a/tutorials/regression-tribuo-v4.ipynb b/tutorials/regression-tribuo-v4.ipynb index 292c6568c..02e8611eb 100644 --- a/tutorials/regression-tribuo-v4.ipynb +++ b/tutorials/regression-tribuo-v4.ipynb @@ -23,10 +23,10 @@ "metadata": {}, "outputs": [], "source": [ - "%jars ./tribuo-json-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n", - "%jars ./tribuo-regression-sgd-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n", - "%jars ./tribuo-regression-xgboost-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n", - "%jars ./tribuo-regression-tree-4.2.0-SNAPSHOT-jar-with-dependencies.jar" + "%jars ./tribuo-json-4.2.0-jar-with-dependencies.jar\n", + "%jars ./tribuo-regression-sgd-4.2.0-jar-with-dependencies.jar\n", + "%jars ./tribuo-regression-xgboost-4.2.0-jar-with-dependencies.jar\n", + "%jars ./tribuo-regression-tree-4.2.0-jar-with-dependencies.jar" ] }, { @@ -264,7 +264,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training Linear Regression (SGD) took (00:00:00:123)\n", + "Training Linear Regression (SGD) took (00:00:00:070)\n", "Evaluation (train):\n", " RMSE 0.979522\n", " MAE 0.741870\n", @@ -357,7 +357,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training Linear Regression (AdaGrad) took (00:00:00:091)\n", + "Training Linear Regression (AdaGrad) took (00:00:00:041)\n", "Evaluation (train):\n", " RMSE 0.735311\n", " MAE 0.575096\n", @@ -403,7 +403,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training CART took (00:00:00:060)\n", + "Training CART took (00:00:00:071)\n", "Evaluation (train):\n", " RMSE 0.544516\n", " MAE 0.405062\n", @@ -436,7 +436,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training XGBoost took (00:00:00:320)\n", + "Training XGBoost took (00:00:00:263)\n", "Evaluation (train):\n", " RMSE 0.143871\n", " MAE 0.097167\n", @@ -477,7 +477,7 @@ "mimetype": "text/x-java-source", "name": "Java", "pygments_lexer": "java", - "version": "17-ea+22-1964" + "version": "17.0.1+12-LTS-39" } }, "nbformat": 4, diff --git a/tutorials/reproducibility-tribuo-v4.ipynb b/tutorials/reproducibility-tribuo-v4.ipynb index a5c6a8565..2f90f645b 100644 --- a/tutorials/reproducibility-tribuo-v4.ipynb +++ b/tutorials/reproducibility-tribuo-v4.ipynb @@ -21,10 +21,10 @@ "metadata": {}, "outputs": [], "source": [ - "%jars ./tribuo-classification-experiments-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n", - "%jars ./tribuo-onnx-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n", - "%jars ./tribuo-json-4.2.0-SNAPSHOT-jar-with-dependencies.jar\n", - "%jars ./tribuo-reproducibility-4.2.0-SNAPSHOT.jar" + "%jars ./tribuo-classification-experiments-4.2.0-jar-with-dependencies.jar\n", + "%jars ./tribuo-onnx-4.2.0-jar-with-dependencies.jar\n", + "%jars ./tribuo-json-4.2.0-jar-with-dependencies.jar\n", + "%jars ./tribuo-reproducibility-4.2.0-jar-with-dependencies.jar" ] }, { @@ -68,7 +68,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "linear-sgd-model - Model(class-name=org.tribuo.classification.sgd.linear.LinearSGDModel,dataset=Dataset(class-name=org.tribuo.MutableDataset,datasource=SplitDataSourceProvenance(className=org.tribuo.evaluation.TrainTestSplitter,innerSourceProvenance=DataSource(class-name=org.tribuo.data.csv.CSVDataSource,headers=[sepalLength, sepalWidth, petalLength, petalWidth, species],rowProcessor=RowProcessor(class-name=org.tribuo.data.columnar.RowProcessor,metadataExtractors=[],fieldProcessorList=[FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=petalLength,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=petalWidth,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=sepalWidth,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=sepalLength,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor)],featureProcessors=[],responseProcessor=ResponseProcessor(class-name=org.tribuo.data.columnar.processors.response.FieldResponseProcessor,uppercase=false,fieldNames=[species],defaultValues=[],displayField=false,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),host-short-name=ResponseProcessor),weightExtractor=null,replaceNewlinesWithSpaces=true,regexMappingProcessors={},host-short-name=RowProcessor),quote=\",outputRequired=true,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),separator=,,dataPath=/Users/apocock/Development/Tribuo/tutorials/bezdekIris.data,resource-hash=SHA-256[0FED2A99DB77EC533A62DC66894D3EC6DF3B58B6A8F3CF4A6B47E4086B7F97DC],file-modified-time=1999-12-14T15:12:39-05:00,datasource-creation-time=2021-11-01T12:52:18.814629-04:00,host-short-name=DataSource),trainProportion=0.7,seed=1,size=150,isTrain=true),transformations=[],is-sequence=false,is-dense=true,num-examples=105,num-features=4,num-outputs=3,tribuo-version=4.2.0-SNAPSHOT),trainer=Trainer(class-name=org.tribuo.classification.sgd.linear.LogisticRegressionTrainer,seed=12345,minibatchSize=1,shuffle=true,epochs=5,optimiser=StochasticGradientOptimiser(class-name=org.tribuo.math.optimisers.AdaGrad,epsilon=0.1,initialLearningRate=1.0,initialValue=0.0,host-short-name=StochasticGradientOptimiser),loggingInterval=1000,objective=LabelObjective(class-name=org.tribuo.classification.sgd.objectives.LogMulticlass,host-short-name=LabelObjective),tribuo-version=4.2.0-SNAPSHOT,train-invocation-count=0,is-sequence=false,host-short-name=Trainer),trained-at=2021-11-01T12:52:19.228195-04:00,instance-values={},tribuo-version=4.2.0-SNAPSHOT,java-version=17,os-name=Mac OS X,os-arch=x86_64)\n" + "linear-sgd-model - Model(class-name=org.tribuo.classification.sgd.linear.LinearSGDModel,dataset=Dataset(class-name=org.tribuo.MutableDataset,datasource=SplitDataSourceProvenance(className=org.tribuo.evaluation.TrainTestSplitter,innerSourceProvenance=DataSource(class-name=org.tribuo.data.csv.CSVDataSource,headers=[sepalLength, sepalWidth, petalLength, petalWidth, species],rowProcessor=RowProcessor(class-name=org.tribuo.data.columnar.RowProcessor,metadataExtractors=[],fieldProcessorList=[FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=petalLength,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=petalWidth,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=sepalWidth,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor), FieldProcessor(class-name=org.tribuo.data.columnar.processors.field.DoubleFieldProcessor,fieldName=sepalLength,onlyFieldName=true,throwOnInvalid=true,host-short-name=FieldProcessor)],featureProcessors=[],responseProcessor=ResponseProcessor(class-name=org.tribuo.data.columnar.processors.response.FieldResponseProcessor,uppercase=false,fieldNames=[species],defaultValues=[],displayField=false,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),host-short-name=ResponseProcessor),weightExtractor=null,replaceNewlinesWithSpaces=true,regexMappingProcessors={},host-short-name=RowProcessor),quote=\",outputRequired=true,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),separator=,,dataPath=/Users/apocock/Development/Tribuo/tutorials/bezdekIris.data,resource-hash=SHA-256[0FED2A99DB77EC533A62DC66894D3EC6DF3B58B6A8F3CF4A6B47E4086B7F97DC],file-modified-time=1999-12-14T15:12:39-05:00,datasource-creation-time=2021-12-18T20:31:02.286464-05:00,host-short-name=DataSource),trainProportion=0.7,seed=1,size=150,isTrain=true),transformations=[],is-sequence=false,is-dense=true,num-examples=105,num-features=4,num-outputs=3,tribuo-version=4.2.0),trainer=Trainer(class-name=org.tribuo.classification.sgd.linear.LogisticRegressionTrainer,seed=12345,minibatchSize=1,shuffle=true,epochs=5,optimiser=StochasticGradientOptimiser(class-name=org.tribuo.math.optimisers.AdaGrad,epsilon=0.1,initialLearningRate=1.0,initialValue=0.0,host-short-name=StochasticGradientOptimiser),loggingInterval=1000,objective=LabelObjective(class-name=org.tribuo.classification.sgd.objectives.LogMulticlass,host-short-name=LabelObjective),tribuo-version=4.2.0,train-invocation-count=0,is-sequence=false,host-short-name=Trainer),trained-at=2021-12-18T20:31:02.707624-05:00,instance-values={},tribuo-version=4.2.0,java-version=17.0.1,os-name=Mac OS X,os-arch=x86_64)\n" ] } ], @@ -195,7 +195,7 @@ "\t\t\t\t\tdataPath = /Users/apocock/Development/Tribuo/tutorials/bezdekIris.data\n", "\t\t\t\t\tresource-hash = 0FED2A99DB77EC533A62DC66894D3EC6DF3B58B6A8F3CF4A6B47E4086B7F97DC\n", "\t\t\t\t\tfile-modified-time = 1999-12-14T15:12:39-05:00\n", - "\t\t\t\t\tdatasource-creation-time = 2021-11-03T09:51:39.561821-04:00\n", + "\t\t\t\t\tdatasource-creation-time = 2021-12-18T20:38:43.398834-05:00\n", "\t\t\t\t\thost-short-name = DataSource\n", "\t\t\t\t)\n", "\t\t\ttrain-proportion = 0.7\n", @@ -209,7 +209,7 @@ "\tnum-examples = 105\n", "\tnum-features = 4\n", "\tnum-outputs = 3\n", - "\ttribuo-version = 4.2.0-SNAPSHOT\n", + "\ttribuo-version = 4.2.0\n", ")\n" ] } @@ -254,7 +254,7 @@ "\t\t\tclass-name = org.tribuo.classification.sgd.objectives.LogMulticlass\n", "\t\t\thost-short-name = LabelObjective\n", "\t\t)\n", - "\ttribuo-version = 4.2.0-SNAPSHOT\n", + "\ttribuo-version = 4.2.0\n", "\ttrain-invocation-count = 0\n", "\tis-sequence = false\n", "\thost-short-name = Trainer\n", @@ -305,15 +305,15 @@ " \"datasource\" : {\n", " \"source\" : {\n", " \"datasource-creation-time\" : {\n", - " \"original\" : \"2021-11-01T12:52:18.814629-04:00\",\n", - " \"reproduced\" : \"2021-11-03T09:51:39.561821-04:00\"\n", + " \"original\" : \"2021-12-18T20:31:02.286464-05:00\",\n", + " \"reproduced\" : \"2021-12-18T20:38:43.398834-05:00\"\n", " }\n", " }\n", " }\n", " },\n", " \"trained-at\" : {\n", - " \"original\" : \"2021-11-01T12:52:19.228195-04:00\",\n", - " \"reproduced\" : \"2021-11-03T09:51:39.842601-04:00\"\n", + " \"original\" : \"2021-12-18T20:31:02.707624-05:00\",\n", + " \"reproduced\" : \"2021-12-18T20:38:43.655448-05:00\"\n", " }\n", "}\n" ] @@ -433,7 +433,7 @@ "\t\t\t\t\toutputFactory = LabelFactory(\n", "\t\t\t\t\t\t\tclass-name = org.tribuo.classification.LabelFactory\n", "\t\t\t\t\t\t)\n", - "\t\t\t\t\tdatasource-creation-time = 2021-11-03T09:51:50.151668-04:00\n", + "\t\t\t\t\tdatasource-creation-time = 2021-12-18T20:38:52.702297-05:00\n", "\t\t\t\t)\n", "\t\t\ttransformations = List[]\n", "\t\t\tis-sequence = false\n", @@ -441,25 +441,25 @@ "\t\t\tnum-examples = -1\n", "\t\t\tnum-features = 717\n", "\t\t\tnum-outputs = 10\n", - "\t\t\ttribuo-version = 4.2.0-SNAPSHOT\n", + "\t\t\ttribuo-version = 4.2.0\n", "\t\t)\n", "\ttrainer = Trainer(\n", "\t\t\tclass-name = org.tribuo.Trainer\n", - "\t\t\tfileModifiedTime = 2021-10-26T17:51:36.243-04:00\n", - "\t\t\tmodelHash = 8DD82B31BD7CFC1C520942590E173AED07AF33C97C32021EE94738FA9FF4CC89\n", + "\t\t\tfileModifiedTime = 2021-12-18T20:36:36.445-05:00\n", + "\t\t\tmodelHash = 06071247AEDE7539B899A2D530508D8E2B43304B8A7884A257368AA2CF1C18ED\n", "\t\t\tlocation = file:/Users/apocock/Development/Tribuo/tutorials/./fm-mnist.onnx\n", "\t\t)\n", - "\ttrained-at = 2021-11-03T09:51:50.149558-04:00\n", + "\ttrained-at = 2021-12-18T20:38:52.700329-05:00\n", "\tinstance-values = Map{\n", "\t\tmodel-domain=org.tribuo.tutorials.onnxexport.fm\n", "\t\tmodel-graphname=FMClassificationModel\n", - "\t\tmodel-description=factorization-machine-model - Model(class-name=org.tribuo.classification.sgd.fm.FMClassificationModel,dataset=Dataset(class-name=org.tribuo.MutableDataset,datasource=DataSource(class-name=org.tribuo.datasource.IDXDataSource,outputPath=/Users/apocock/Development/Tribuo/tutorials/train-labels-idx1-ubyte.gz,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),featuresPath=/Users/apocock/Development/Tribuo/tutorials/train-images-idx3-ubyte.gz,features-file-modified-time=2000-07-21T14:20:24-04:00,output-resource-hash=SHA-256[3552534A0A558BBED6AED32B30C495CCA23D567EC52CAC8BE1A0730E8010255C],datasource-creation-time=2021-10-26T17:51:22.314557-04:00,output-file-modified-time=2000-07-21T14:20:27-04:00,idx-feature-type=UBYTE,features-resource-hash=SHA-256[440FCABF73CC546FA21475E81EA370265605F56BE210A4024D2CA8F203523609],host-short-name=DataSource),transformations=[],is-sequence=false,is-dense=false,num-examples=60000,num-features=717,num-outputs=10,tribuo-version=4.2.0-SNAPSHOT),trainer=Trainer(class-name=org.tribuo.classification.sgd.fm.FMClassificationTrainer,seed=12345,variance=0.1,minibatchSize=1,factorizedDimSize=6,shuffle=true,epochs=5,optimiser=StochasticGradientOptimiser(class-name=org.tribuo.math.optimisers.AdaGrad,epsilon=0.1,initialLearningRate=0.1,initialValue=0.0,host-short-name=StochasticGradientOptimiser),loggingInterval=30000,objective=LabelObjective(class-name=org.tribuo.classification.sgd.objectives.LogMulticlass,host-short-name=LabelObjective),tribuo-version=4.2.0-SNAPSHOT,train-invocation-count=0,is-sequence=false,host-short-name=Trainer),trained-at=2021-10-26T17:51:35.432511-04:00,instance-values={},tribuo-version=4.2.0-SNAPSHOT,java-version=17-ea,os-name=Mac OS X,os-arch=x86_64)\n", + "\t\tmodel-description=factorization-machine-model - Model(class-name=org.tribuo.classification.sgd.fm.FMClassificationModel,dataset=Dataset(class-name=org.tribuo.MutableDataset,datasource=DataSource(class-name=org.tribuo.datasource.IDXDataSource,outputPath=/Users/apocock/Development/Tribuo/tutorials/train-labels-idx1-ubyte.gz,outputFactory=OutputFactory(class-name=org.tribuo.classification.LabelFactory),featuresPath=/Users/apocock/Development/Tribuo/tutorials/train-images-idx3-ubyte.gz,features-file-modified-time=2000-07-21T14:20:24-04:00,output-resource-hash=SHA-256[3552534A0A558BBED6AED32B30C495CCA23D567EC52CAC8BE1A0730E8010255C],datasource-creation-time=2021-12-18T20:36:23.109293-05:00,output-file-modified-time=2000-07-21T14:20:27-04:00,idx-feature-type=UBYTE,features-resource-hash=SHA-256[440FCABF73CC546FA21475E81EA370265605F56BE210A4024D2CA8F203523609],host-short-name=DataSource),transformations=[],is-sequence=false,is-dense=false,num-examples=60000,num-features=717,num-outputs=10,tribuo-version=4.2.0),trainer=Trainer(class-name=org.tribuo.classification.sgd.fm.FMClassificationTrainer,seed=12345,variance=0.1,minibatchSize=1,factorizedDimSize=6,shuffle=true,epochs=5,optimiser=StochasticGradientOptimiser(class-name=org.tribuo.math.optimisers.AdaGrad,epsilon=0.1,initialLearningRate=0.1,initialValue=0.0,host-short-name=StochasticGradientOptimiser),loggingInterval=30000,objective=LabelObjective(class-name=org.tribuo.classification.sgd.objectives.LogMulticlass,host-short-name=LabelObjective),tribuo-version=4.2.0,train-invocation-count=0,is-sequence=false,host-short-name=Trainer),trained-at=2021-12-18T20:36:35.640663-05:00,instance-values={},tribuo-version=4.2.0,java-version=17.0.1,os-name=Mac OS X,os-arch=x86_64)\n", "\t\tmodel-producer=Tribuo\n", "\t\tmodel-version=0\n", "\t\tinput-name=input\n", "\t}\n", - "\ttribuo-version = 4.2.0-SNAPSHOT\n", - "\tjava-version = 17\n", + "\ttribuo-version = 4.2.0\n", + "\tjava-version = 17.0.1\n", "\tos-name = Mac OS X\n", "\tos-arch = x86_64\n", ")\n" @@ -501,7 +501,7 @@ "\t\t\t\t\tfeaturesPath = /Users/apocock/Development/Tribuo/tutorials/train-images-idx3-ubyte.gz\n", "\t\t\t\t\tfeatures-file-modified-time = 2000-07-21T14:20:24-04:00\n", "\t\t\t\t\toutput-resource-hash = 3552534A0A558BBED6AED32B30C495CCA23D567EC52CAC8BE1A0730E8010255C\n", - "\t\t\t\t\tdatasource-creation-time = 2021-10-26T17:51:22.314557-04:00\n", + "\t\t\t\t\tdatasource-creation-time = 2021-12-18T20:36:23.109293-05:00\n", "\t\t\t\t\toutput-file-modified-time = 2000-07-21T14:20:27-04:00\n", "\t\t\t\t\tidx-feature-type = UBYTE\n", "\t\t\t\t\tfeatures-resource-hash = 440FCABF73CC546FA21475E81EA370265605F56BE210A4024D2CA8F203523609\n", @@ -513,7 +513,7 @@ "\t\t\tnum-examples = 60000\n", "\t\t\tnum-features = 717\n", "\t\t\tnum-outputs = 10\n", - "\t\t\ttribuo-version = 4.2.0-SNAPSHOT\n", + "\t\t\ttribuo-version = 4.2.0\n", "\t\t)\n", "\ttrainer = FMClassificationTrainer(\n", "\t\t\tclass-name = org.tribuo.classification.sgd.fm.FMClassificationTrainer\n", @@ -535,15 +535,15 @@ "\t\t\t\t\tclass-name = org.tribuo.classification.sgd.objectives.LogMulticlass\n", "\t\t\t\t\thost-short-name = LabelObjective\n", "\t\t\t\t)\n", - "\t\t\ttribuo-version = 4.2.0-SNAPSHOT\n", + "\t\t\ttribuo-version = 4.2.0\n", "\t\t\ttrain-invocation-count = 0\n", "\t\t\tis-sequence = false\n", "\t\t\thost-short-name = Trainer\n", "\t\t)\n", - "\ttrained-at = 2021-10-26T17:51:35.432511-04:00\n", + "\ttrained-at = 2021-12-18T20:36:35.640663-05:00\n", "\tinstance-values = Map{}\n", - "\ttribuo-version = 4.2.0-SNAPSHOT\n", - "\tjava-version = 17-ea\n", + "\ttribuo-version = 4.2.0\n", + "\tjava-version = 17.0.1\n", "\tos-name = Mac OS X\n", "\tos-arch = x86_64\n", ")\n" @@ -593,18 +593,14 @@ " \"dataset\" : {\n", " \"datasource\" : {\n", " \"datasource-creation-time\" : {\n", - " \"original\" : \"2021-10-26T17:51:22.314557-04:00\",\n", - " \"reproduced\" : \"2021-11-03T09:51:56.746038-04:00\"\n", + " \"original\" : \"2021-12-18T20:36:23.109293-05:00\",\n", + " \"reproduced\" : \"2021-12-18T20:38:58.740193-05:00\"\n", " }\n", " }\n", " },\n", - " \"java-version\" : {\n", - " \"original\" : \"17-ea\",\n", - " \"reproduced\" : \"17\"\n", - " },\n", " \"trained-at\" : {\n", - " \"original\" : \"2021-10-26T17:51:35.432511-04:00\",\n", - " \"reproduced\" : \"2021-11-03T09:52:10.606727-04:00\"\n", + " \"original\" : \"2021-12-18T20:36:35.640663-05:00\",\n", + " \"reproduced\" : \"2021-12-18T20:39:09.831081-05:00\"\n", " }\n", "}\n" ] @@ -718,18 +714,14 @@ " \"dataset\" : {\n", " \"datasource\" : {\n", " \"datasource-creation-time\" : {\n", - " \"original\" : \"2021-10-26T17:51:22.314557-04:00\",\n", - " \"reproduced\" : \"2021-11-03T09:51:47.929133-04:00\"\n", + " \"original\" : \"2021-12-18T20:36:23.109293-05:00\",\n", + " \"reproduced\" : \"2021-12-18T20:38:51.027212-05:00\"\n", " }\n", " }\n", " },\n", - " \"java-version\" : {\n", - " \"original\" : \"17-ea\",\n", - " \"reproduced\" : \"17\"\n", - " },\n", " \"trained-at\" : {\n", - " \"original\" : \"2021-10-26T17:51:35.432511-04:00\",\n", - " \"reproduced\" : \"2021-11-03T09:52:20.359019-04:00\"\n", + " \"original\" : \"2021-12-18T20:36:35.640663-05:00\",\n", + " \"reproduced\" : \"2021-12-18T20:39:18.280345-05:00\"\n", " },\n", " \"trainer\" : {\n", " \"class-name\" : {\n", @@ -795,7 +787,7 @@ "mimetype": "text/x-java-source", "name": "Java", "pygments_lexer": "java", - "version": "17+35-LTS-2724" + "version": "17.0.1+12-LTS-39" } }, "nbformat": 4, diff --git a/tutorials/tensorflow-tribuo-v4.ipynb b/tutorials/tensorflow-tribuo-v4.ipynb index 7b80b21a6..2f3be8b36 100644 --- a/tutorials/tensorflow-tribuo-v4.ipynb +++ b/tutorials/tensorflow-tribuo-v4.ipynb @@ -41,7 +41,7 @@ "metadata": {}, "outputs": [], "source": [ - "%jars ./tribuo-tensorflow-4.2.0-SNAPSHOT-jar-with-dependencies.jar" + "%jars ./tribuo-tensorflow-4.2.0-jar-with-dependencies.jar" ] }, { @@ -274,7 +274,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Wine quality training took (00:00:02:519)\n" + "Wine quality training took (00:00:01:891)\n" ] } ], @@ -302,9 +302,9 @@ "output_type": "stream", "text": [ "Wine quality evaluation:\n", - " RMSE 0.651519\n", - " MAE 0.509955\n", - " R^2 0.347267\n", + " RMSE 0.651441\n", + " MAE 0.510348\n", + " R^2 0.347424\n", "\n" ] } @@ -394,7 +394,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "MNIST MLP training took (00:01:00:660)\n" + "MNIST MLP training took (00:01:06:256)\n" ] } ], @@ -422,32 +422,32 @@ "output_type": "stream", "text": [ "Class n tp fn fp recall prec f1\n", - "0 980 0 980 0 0.000 0.000 0.000\n", - "1 1,135 1,135 0 8,865 1.000 0.114 0.204\n", - "2 1,032 0 1,032 0 0.000 0.000 0.000\n", - "3 1,010 0 1,010 0 0.000 0.000 0.000\n", - "4 982 0 982 0 0.000 0.000 0.000\n", - "5 892 0 892 0 0.000 0.000 0.000\n", - "6 958 0 958 0 0.000 0.000 0.000\n", - "7 1,028 0 1,028 0 0.000 0.000 0.000\n", - "8 974 0 974 0 0.000 0.000 0.000\n", - "9 1,009 0 1,009 0 0.000 0.000 0.000\n", - "Total 10,000 1,135 8,865 8,865\n", - "Accuracy 0.114\n", - "Micro Average 0.114 0.114 0.114\n", - "Macro Average 0.100 0.011 0.020\n", - "Balanced Error Rate 0.900\n", + "0 980 960 20 94 0.980 0.911 0.944\n", + "1 1,135 1,105 30 23 0.974 0.980 0.977\n", + "2 1,032 922 110 39 0.893 0.959 0.925\n", + "3 1,010 916 94 121 0.907 0.883 0.895\n", + "4 982 930 52 61 0.947 0.938 0.943\n", + "5 892 813 79 74 0.911 0.917 0.914\n", + "6 958 914 44 36 0.954 0.962 0.958\n", + "7 1,028 942 86 37 0.916 0.962 0.939\n", + "8 974 893 81 107 0.917 0.893 0.905\n", + "9 1,009 926 83 87 0.918 0.914 0.916\n", + "Total 10,000 9,321 679 679\n", + "Accuracy 0.932\n", + "Micro Average 0.932 0.932 0.932\n", + "Macro Average 0.932 0.932 0.931\n", + "Balanced Error Rate 0.068\n", " 0 1 2 3 4 5 6 7 8 9\n", - "0 0 980 0 0 0 0 0 0 0 0\n", - "1 0 1,135 0 0 0 0 0 0 0 0\n", - "2 0 1,032 0 0 0 0 0 0 0 0\n", - "3 0 1,010 0 0 0 0 0 0 0 0\n", - "4 0 982 0 0 0 0 0 0 0 0\n", - "5 0 892 0 0 0 0 0 0 0 0\n", - "6 0 958 0 0 0 0 0 0 0 0\n", - "7 0 1,028 0 0 0 0 0 0 0 0\n", - "8 0 974 0 0 0 0 0 0 0 0\n", - "9 0 1,009 0 0 0 0 0 0 0 0\n", + "0 960 0 1 1 4 3 5 1 2 3\n", + "1 1 1,105 4 4 0 3 3 1 14 0\n", + "2 14 5 922 42 12 2 7 4 22 2\n", + "3 13 0 9 916 1 34 0 9 22 6\n", + "4 3 0 3 0 930 0 11 3 5 27\n", + "5 18 0 0 17 5 813 6 4 23 6\n", + "6 11 4 1 0 5 16 914 0 6 1\n", + "7 10 7 15 8 4 1 0 942 4 37\n", + "8 12 2 6 28 10 12 4 2 893 5\n", + "9 12 5 0 21 20 3 0 13 9 926\n", "\n" ] } @@ -497,7 +497,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "MNIST CNN training took (00:03:09:806)\n" + "MNIST CNN training took (00:02:57:331)\n" ] } ], @@ -538,32 +538,32 @@ "output_type": "stream", "text": [ "Class n tp fn fp recall prec f1\n", - "0 980 973 7 11 0.993 0.989 0.991\n", - "1 1,135 1,129 6 14 0.995 0.988 0.991\n", - "2 1,032 1,024 8 31 0.992 0.971 0.981\n", - "3 1,010 989 21 17 0.979 0.983 0.981\n", - "4 982 965 17 14 0.983 0.986 0.984\n", - "5 892 865 27 22 0.970 0.975 0.972\n", - "6 958 936 22 2 0.977 0.998 0.987\n", - "7 1,028 1,003 25 13 0.976 0.987 0.981\n", - "8 974 948 26 15 0.973 0.984 0.979\n", - "9 1,009 997 12 32 0.988 0.969 0.978\n", - "Total 10,000 9,829 171 171\n", - "Accuracy 0.983\n", - "Micro Average 0.983 0.983 0.983\n", - "Macro Average 0.983 0.983 0.983\n", - "Balanced Error Rate 0.017\n", + "0 980 968 12 25 0.988 0.975 0.981\n", + "1 1,135 1,123 12 5 0.989 0.996 0.992\n", + "2 1,032 1,013 19 39 0.982 0.963 0.972\n", + "3 1,010 980 30 12 0.970 0.988 0.979\n", + "4 982 963 19 19 0.981 0.981 0.981\n", + "5 892 873 19 21 0.979 0.977 0.978\n", + "6 958 938 20 17 0.979 0.982 0.981\n", + "7 1,028 998 30 14 0.971 0.986 0.978\n", + "8 974 937 37 31 0.962 0.968 0.965\n", + "9 1,009 988 21 36 0.979 0.965 0.972\n", + "Total 10,000 9,781 219 219\n", + "Accuracy 0.978\n", + "Micro Average 0.978 0.978 0.978\n", + "Macro Average 0.978 0.978 0.978\n", + "Balanced Error Rate 0.022\n", " 0 1 2 3 4 5 6 7 8 9\n", - "0 973 2 0 0 0 0 0 2 3 0\n", - "1 0 1,129 2 1 1 0 0 0 2 0\n", - "2 1 3 1,024 0 0 0 0 2 2 0\n", - "3 0 0 4 989 0 9 0 4 1 3\n", - "4 0 1 1 0 965 0 1 0 0 14\n", - "5 1 2 1 10 1 865 1 1 5 5\n", - "6 6 4 3 1 1 7 936 0 0 0\n", - "7 0 2 14 0 1 0 0 1,003 1 7\n", - "8 3 0 6 4 3 5 0 2 948 3\n", - "9 0 0 0 1 7 1 0 2 1 997\n", + "0 968 0 0 0 0 0 6 0 5 1\n", + "1 0 1,123 1 3 0 2 1 0 5 0\n", + "2 3 1 1,013 2 2 0 3 2 5 1\n", + "3 1 0 9 980 0 9 0 4 2 5\n", + "4 1 0 1 0 963 0 4 1 3 9\n", + "5 1 2 0 6 0 873 1 1 3 5\n", + "6 10 1 1 1 2 2 938 0 3 0\n", + "7 0 1 13 0 4 0 0 998 4 8\n", + "8 7 0 13 0 0 7 2 1 937 7\n", + "9 2 0 1 0 11 1 0 5 1 988\n", "\n" ] } @@ -719,7 +719,7 @@ "mimetype": "text/x-java-source", "name": "Java", "pygments_lexer": "java", - "version": "17+35-LTS-2724" + "version": "17.0.1+12-LTS-39" } }, "nbformat": 4,